changeset 102:f46d142149f5

Whoops, finish that update
author Chris Cannam
date Mon, 07 Sep 2015 11:13:41 +0100
parents c530137014c0
children ccaadfc1e6d1
files DEPENDENCIES/generic/include/boost/accumulators/statistics/rolling_moment.hpp DEPENDENCIES/generic/include/boost/accumulators/statistics/rolling_variance.hpp DEPENDENCIES/generic/include/boost/algorithm/algorithm.hpp DEPENDENCIES/generic/include/boost/align.hpp DEPENDENCIES/generic/include/boost/align/align.hpp DEPENDENCIES/generic/include/boost/align/aligned_alloc.hpp DEPENDENCIES/generic/include/boost/align/aligned_allocator.hpp DEPENDENCIES/generic/include/boost/align/aligned_allocator_adaptor.hpp DEPENDENCIES/generic/include/boost/align/aligned_allocator_adaptor_forward.hpp DEPENDENCIES/generic/include/boost/align/aligned_allocator_forward.hpp DEPENDENCIES/generic/include/boost/align/aligned_delete.hpp DEPENDENCIES/generic/include/boost/align/aligned_delete_forward.hpp DEPENDENCIES/generic/include/boost/align/alignment_of.hpp DEPENDENCIES/generic/include/boost/align/alignment_of_forward.hpp DEPENDENCIES/generic/include/boost/align/detail/address.hpp DEPENDENCIES/generic/include/boost/align/detail/addressof.hpp DEPENDENCIES/generic/include/boost/align/detail/align.hpp DEPENDENCIES/generic/include/boost/align/detail/align_cxx11.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_android.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_macos.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_msvc.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_posix.hpp DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_sunos.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of_clang.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of_codegear.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of_cxx11.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of_gcc.hpp DEPENDENCIES/generic/include/boost/align/detail/alignment_of_msvc.hpp DEPENDENCIES/generic/include/boost/align/detail/integral_constant.hpp DEPENDENCIES/generic/include/boost/align/detail/is_aligned.hpp DEPENDENCIES/generic/include/boost/align/detail/is_alignment.hpp DEPENDENCIES/generic/include/boost/align/detail/is_alignment_constant.hpp DEPENDENCIES/generic/include/boost/align/detail/max_align.hpp DEPENDENCIES/generic/include/boost/align/detail/max_count_of.hpp DEPENDENCIES/generic/include/boost/align/detail/min_size.hpp DEPENDENCIES/generic/include/boost/align/detail/offset_object.hpp DEPENDENCIES/generic/include/boost/align/detail/remove_traits.hpp DEPENDENCIES/generic/include/boost/align/is_aligned.hpp DEPENDENCIES/generic/include/boost/archive/detail/helper_collection.hpp DEPENDENCIES/generic/include/boost/archive/shared_ptr_helper.hpp DEPENDENCIES/generic/include/boost/asio/detail/win_iocp_socket_connect_op.hpp DEPENDENCIES/generic/include/boost/atomic/atomic_flag.hpp DEPENDENCIES/generic/include/boost/atomic/capabilities.hpp DEPENDENCIES/generic/include/boost/atomic/detail/atomic_flag.hpp DEPENDENCIES/generic/include/boost/atomic/detail/atomic_template.hpp DEPENDENCIES/generic/include/boost/atomic/detail/base.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_alpha.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_atomic.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_ppc.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_sparc.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_sync.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_x86.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_linux_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_msvc_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_msvc_x86.hpp DEPENDENCIES/generic/include/boost/atomic/detail/caps_windows.hpp DEPENDENCIES/generic/include/boost/atomic/detail/cas128strong.hpp DEPENDENCIES/generic/include/boost/atomic/detail/cas32strong.hpp DEPENDENCIES/generic/include/boost/atomic/detail/cas32weak.hpp DEPENDENCIES/generic/include/boost/atomic/detail/cas64strong-ptr.hpp DEPENDENCIES/generic/include/boost/atomic/detail/cas64strong.hpp DEPENDENCIES/generic/include/boost/atomic/detail/casts.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-alpha.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-armv6plus.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-atomic.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-cas.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-ppc.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-sparcv9.hpp DEPENDENCIES/generic/include/boost/atomic/detail/gcc-x86.hpp DEPENDENCIES/generic/include/boost/atomic/detail/generic-cas.hpp DEPENDENCIES/generic/include/boost/atomic/detail/int_sizes.hpp DEPENDENCIES/generic/include/boost/atomic/detail/linux-arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/operations.hpp DEPENDENCIES/generic/include/boost/atomic/detail/operations_fwd.hpp DEPENDENCIES/generic/include/boost/atomic/detail/operations_lockfree.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_cas_based.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_emulated.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_extending_cas_based.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_alpha.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_atomic.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_ppc.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_sparc.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_sync.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_x86.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_x86_dcas.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_linux_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_arm.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_common.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_x86.hpp DEPENDENCIES/generic/include/boost/atomic/detail/ops_windows.hpp DEPENDENCIES/generic/include/boost/atomic/detail/pause.hpp DEPENDENCIES/generic/include/boost/atomic/detail/storage_type.hpp DEPENDENCIES/generic/include/boost/atomic/detail/type-classification.hpp DEPENDENCIES/generic/include/boost/atomic/detail/windows.hpp DEPENDENCIES/generic/include/boost/atomic/fences.hpp DEPENDENCIES/generic/include/boost/config/platform/haiku.hpp DEPENDENCIES/generic/include/boost/container/adaptive_pool.hpp DEPENDENCIES/generic/include/boost/container/allocator.hpp DEPENDENCIES/generic/include/boost/container/detail/adaptive_node_pool.hpp DEPENDENCIES/generic/include/boost/container/detail/addressof.hpp DEPENDENCIES/generic/include/boost/container/detail/algorithm.hpp DEPENDENCIES/generic/include/boost/container/detail/algorithms.hpp DEPENDENCIES/generic/include/boost/container/detail/alloc_helpers.hpp DEPENDENCIES/generic/include/boost/container/detail/alloc_lib.h DEPENDENCIES/generic/include/boost/container/detail/alloc_lib_auto_link.hpp DEPENDENCIES/generic/include/boost/container/detail/auto_link.hpp DEPENDENCIES/generic/include/boost/container/detail/compare_functors.hpp DEPENDENCIES/generic/include/boost/container/detail/construct_in_place.hpp DEPENDENCIES/generic/include/boost/container/detail/copy_move_algo.hpp DEPENDENCIES/generic/include/boost/container/detail/hash_table.hpp DEPENDENCIES/generic/include/boost/container/detail/iterator.hpp DEPENDENCIES/generic/include/boost/container/detail/iterator_to_raw_pointer.hpp DEPENDENCIES/generic/include/boost/container/detail/memory_util.hpp DEPENDENCIES/generic/include/boost/container/detail/min_max.hpp DEPENDENCIES/generic/include/boost/container/detail/minimal_char_traits_header.hpp DEPENDENCIES/generic/include/boost/container/detail/mutex.hpp DEPENDENCIES/generic/include/boost/container/detail/next_capacity.hpp DEPENDENCIES/generic/include/boost/container/detail/node_pool.hpp DEPENDENCIES/generic/include/boost/container/detail/placement_new.hpp DEPENDENCIES/generic/include/boost/container/detail/pool_common_alloc.hpp DEPENDENCIES/generic/include/boost/container/detail/preprocessor.hpp DEPENDENCIES/generic/include/boost/container/detail/singleton.hpp DEPENDENCIES/generic/include/boost/container/detail/std_fwd.hpp DEPENDENCIES/generic/include/boost/container/detail/to_raw_pointer.hpp DEPENDENCIES/generic/include/boost/container/detail/utilities.hpp DEPENDENCIES/generic/include/boost/container/new_allocator.hpp DEPENDENCIES/generic/include/boost/container/node_allocator.hpp DEPENDENCIES/generic/include/boost/container/options.hpp DEPENDENCIES/generic/include/boost/container/small_vector.hpp DEPENDENCIES/generic/include/boost/context/detail/fcontext_arm_mac.hpp DEPENDENCIES/generic/include/boost/context/detail/fcontext_arm_win.hpp DEPENDENCIES/generic/include/boost/context/execution_context.hpp DEPENDENCIES/generic/include/boost/context/fixedsize_stack.hpp DEPENDENCIES/generic/include/boost/context/posix/protected_fixedsize_stack.hpp DEPENDENCIES/generic/include/boost/context/posix/segmented_stack.hpp DEPENDENCIES/generic/include/boost/context/protected_fixedsize_stack.hpp DEPENDENCIES/generic/include/boost/context/segmented_stack.hpp DEPENDENCIES/generic/include/boost/context/stack_context.hpp DEPENDENCIES/generic/include/boost/context/stack_traits.hpp DEPENDENCIES/generic/include/boost/context/windows/protected_fixedsize_stack.hpp DEPENDENCIES/generic/include/boost/core/addressof.hpp DEPENDENCIES/generic/include/boost/core/checked_delete.hpp DEPENDENCIES/generic/include/boost/core/demangle.hpp DEPENDENCIES/generic/include/boost/core/enable_if.hpp DEPENDENCIES/generic/include/boost/core/explicit_operator_bool.hpp DEPENDENCIES/generic/include/boost/core/ignore_unused.hpp DEPENDENCIES/generic/include/boost/core/is_same.hpp DEPENDENCIES/generic/include/boost/core/lightweight_test.hpp DEPENDENCIES/generic/include/boost/core/lightweight_test_trait.hpp DEPENDENCIES/generic/include/boost/core/no_exceptions_support.hpp DEPENDENCIES/generic/include/boost/core/noncopyable.hpp DEPENDENCIES/generic/include/boost/core/null_deleter.hpp DEPENDENCIES/generic/include/boost/core/ref.hpp DEPENDENCIES/generic/include/boost/core/scoped_enum.hpp DEPENDENCIES/generic/include/boost/core/swap.hpp DEPENDENCIES/generic/include/boost/core/typeinfo.hpp DEPENDENCIES/generic/include/boost/core/underlying_type.hpp DEPENDENCIES/generic/include/boost/coroutine/asymmetric_coroutine.hpp DEPENDENCIES/generic/include/boost/coroutine/checkpoint.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/exceptions.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/holder.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/param.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/parameters.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_impl.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_synthesized.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_impl.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_synthesized.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/segmented_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/setup.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/stack_tuple.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/standard_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_call.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_impl.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_yield.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/trampoline_pull.hpp DEPENDENCIES/generic/include/boost/coroutine/detail/trampoline_push.hpp DEPENDENCIES/generic/include/boost/coroutine/posix/protected_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/posix/segmented_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/protected_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/segmented_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/stack_traits.hpp DEPENDENCIES/generic/include/boost/coroutine/standard_stack_allocator.hpp DEPENDENCIES/generic/include/boost/coroutine/symmetric_coroutine.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/coroutine.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/arg.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_base.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_base_resume.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_caller.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_get.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_0.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_1.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_arity.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_0.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_1.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_arity.ipp DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_op.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/coroutine.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_base.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_caller.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_base.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_caller.hpp DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_object.hpp DEPENDENCIES/generic/include/boost/coroutine/windows/protected_stack_allocator.hpp DEPENDENCIES/generic/include/boost/cstdfloat.hpp DEPENDENCIES/generic/include/boost/cxx11_char_types.hpp DEPENDENCIES/generic/include/boost/detail/basic_pointerbuf.hpp DEPENDENCIES/generic/include/boost/detail/is_function_ref_tester.hpp DEPENDENCIES/generic/include/boost/detail/lightweight_test_report.hpp DEPENDENCIES/generic/include/boost/detail/limits.hpp DEPENDENCIES/generic/include/boost/detail/none_t.hpp DEPENDENCIES/generic/include/boost/detail/ob_call_traits.hpp DEPENDENCIES/generic/include/boost/detail/winapi/config.hpp DEPENDENCIES/generic/include/boost/detail/winapi/crypt.hpp DEPENDENCIES/generic/include/boost/detail/winapi/thread_pool.hpp DEPENDENCIES/generic/include/boost/detail/winapi/tls.hpp DEPENDENCIES/generic/include/boost/detail/winapi/waitable_timer.hpp DEPENDENCIES/generic/include/boost/endian/arithmetic.hpp DEPENDENCIES/generic/include/boost/endian/buffers.hpp DEPENDENCIES/generic/include/boost/endian/conversion.hpp DEPENDENCIES/generic/include/boost/endian/detail/config.hpp DEPENDENCIES/generic/include/boost/endian/detail/cover_operators.hpp DEPENDENCIES/generic/include/boost/endian/detail/disable_warnings.hpp DEPENDENCIES/generic/include/boost/endian/detail/disable_warnings_pop.hpp DEPENDENCIES/generic/include/boost/endian/detail/intrinsic.hpp DEPENDENCIES/generic/include/boost/endian/detail/lightweight_test.hpp DEPENDENCIES/generic/include/boost/endian/endian.hpp DEPENDENCIES/generic/include/boost/endian/std_pair.hpp DEPENDENCIES/generic/include/boost/exception.hpp DEPENDENCIES/generic/include/boost/exception/N3757.hpp DEPENDENCIES/generic/include/boost/exception/detail/attribute_noreturn.hpp DEPENDENCIES/generic/include/boost/flyweight/detail/archive_constructed.hpp DEPENDENCIES/generic/include/boost/flyweight/detail/serialization_helper.hpp DEPENDENCIES/generic/include/boost/flyweight/serialize.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/adt/detail/adapt_base_assoc_attr_filler.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/detail/build_cons.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/detail/convert_impl.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/mpl/clear.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/detail/build_std_tuple.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/detail/convert_impl.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/mpl/clear.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_auto.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_base_assoc_attr_filler.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp DEPENDENCIES/generic/include/boost/fusion/algorithm/transformation/flatten.hpp DEPENDENCIES/generic/include/boost/fusion/container/list/nil.hpp DEPENDENCIES/generic/include/boost/fusion/include/adapt_assoc_class.hpp DEPENDENCIES/generic/include/boost/fusion/include/adapt_assoc_class_named.hpp DEPENDENCIES/generic/include/boost/fusion/include/flatten.hpp DEPENDENCIES/generic/include/boost/fusion/include/flatten_view.hpp DEPENDENCIES/generic/include/boost/fusion/include/hash.hpp DEPENDENCIES/generic/include/boost/fusion/include/nil.hpp DEPENDENCIES/generic/include/boost/fusion/include/std_tuple.hpp DEPENDENCIES/generic/include/boost/fusion/sequence/hash.hpp DEPENDENCIES/generic/include/boost/fusion/support/config.hpp DEPENDENCIES/generic/include/boost/fusion/support/detail/enabler.hpp DEPENDENCIES/generic/include/boost/fusion/support/detail/result_of.hpp DEPENDENCIES/generic/include/boost/fusion/view/flatten_view.hpp DEPENDENCIES/generic/include/boost/fusion/view/flatten_view/flatten_view.hpp DEPENDENCIES/generic/include/boost/fusion/view/flatten_view/flatten_view_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/crosses.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/azimuth.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffer_policies.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/get_piece_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/parallel_continue.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/turn_in_original_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/turn_in_piece_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/check_iterator_range.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/geometry_to_range.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/point_to_range.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/range_to_range.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/comparable_distance/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/comparable_distance/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/counting.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/course.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/areal_areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/box_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_segment_or_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/multipoint_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/multirange_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_point.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/segment_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/backward_compatibility.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/box_to_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/default_strategies.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/geometry_to_segment_or_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/is_comparable.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/iterator_selector.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/linear_or_areal_to_areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/linear_to_linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/point_to_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/segment_to_segment.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/equals/point_point.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/extreme_points.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/flattening.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/get_max_size.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/interior_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/box_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/multi.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/failure_policy.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/complement_graph.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_complement_graph.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_print_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_validity_phase.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_spikes.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/implementation.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/interface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/is_acceptable_turn.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/ring.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/segment.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_modify.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_modify_with_predicate.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_sum.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/calculate_distance_policy.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/do_reverse.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_for_endpoint.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_la.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_ll.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/linear_linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/recalculate.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/areal_areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/boundary_checker.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/follow_helpers.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/less.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/linear_areal.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/linear_linear.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/point_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/point_point.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/relate.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/result.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/topology_check.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sections/section_box_policies.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sections/section_functions.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/signed_index_type.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/single_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sub_range.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/compare_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/debug_turn.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/filter_continue_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/print_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/remove_duplicate_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/vincenty_direct.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/vincenty_inverse.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/within/point_in_geometry.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/within/within_no_turns.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/disjoint.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/distance.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/is_simple.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/is_valid.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/is_simple.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/is_valid.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/num_segments.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/point_on_surface.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/remove_spikes.hpp DEPENDENCIES/generic/include/boost/geometry/algorithms/validity_failure_type.hpp DEPENDENCIES/generic/include/boost/geometry/core/radius.hpp DEPENDENCIES/generic/include/boost/geometry/core/srs.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_linestring_concept.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_point_concept.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_polygon_concept.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/multi_linestring.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/multi_point.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/multi_polygon.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/pointing_segment.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_linestring.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_point.hpp DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_polygon.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/bounded_view.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/pushable_array.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/auto_deallocator.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/dynamic_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_elements.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/scoped_deallocator.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/static_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/subtree_destroyer.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_dynamic.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_static.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_dynamic.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_static.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_visitor.hpp DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/utilities/are_counts_ok.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/concatenate_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/iterator_type.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/value_type.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/iterator_type.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/value_type.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/dispatch/point_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/dispatch/segment_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/flatten_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/has_one_element.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/point_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/point_reverse_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/iterators/segment_iterator.hpp DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/detail/extreme_points.hpp DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/remove_spikes.hpp DEPENDENCIES/generic/include/boost/geometry/policies/disjoint_interrupt_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/default_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/failing_reason_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/failure_type_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/predicate_based_interrupt_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/relate/intersection_ratios.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/get_rescale_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/no_rescale_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/rescale_policy.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/robust_point_type.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/robust_type.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/segment_ratio.hpp DEPENDENCIES/generic/include/boost/geometry/policies/robustness/segment_ratio_type.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/buffer_distance_asymmetric.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/point_in_point.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/relate.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/side_by_azimuth.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/buffer.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_end_flat.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_end_round.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_miter.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_round.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_round_by_divide.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_point_circle.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_point_square.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_side_straight.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/centroid_average.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_projected_point_ax.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_pythagoras_box_box.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_pythagoras_point_box.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/side_of_intersection.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/comparable_distance_result.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/default_comparable_distance_result.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/default_strategy.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/distance_result.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/distance_andoyer.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/distance_vincenty.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/mapping_ssf.hpp DEPENDENCIES/generic/include/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp DEPENDENCIES/generic/include/boost/geometry/util/combine_if.hpp DEPENDENCIES/generic/include/boost/geometry/util/compress_variant.hpp DEPENDENCIES/generic/include/boost/geometry/util/condition.hpp DEPENDENCIES/generic/include/boost/geometry/util/promote_integral.hpp DEPENDENCIES/generic/include/boost/geometry/util/range.hpp DEPENDENCIES/generic/include/boost/geometry/util/transform_variant.hpp DEPENDENCIES/generic/include/boost/geometry/views/detail/indexed_point_view.hpp DEPENDENCIES/generic/include/boost/geometry/views/detail/normalized_view.hpp DEPENDENCIES/generic/include/boost/integer/common_factor.hpp DEPENDENCIES/generic/include/boost/integer/common_factor_ct.hpp DEPENDENCIES/generic/include/boost/integer/common_factor_rt.hpp DEPENDENCIES/generic/include/boost/integer/integer_log2.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/multi_segment_services.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/nothrow.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/preprocessor.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/shared_dir_helpers.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/simple_swap.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/std_fwd.hpp DEPENDENCIES/generic/include/boost/interprocess/detail/tmp_dir_helpers.hpp DEPENDENCIES/generic/include/boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp DEPENDENCIES/generic/include/boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp DEPENDENCIES/generic/include/boost/interprocess/sync/detail/common_algorithms.hpp DEPENDENCIES/generic/include/boost/interprocess/sync/windows/winapi_wrapper_common.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/algo_type.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/algorithm.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/array_initializer.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/bstree_algorithms_base.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/clear_on_destructor_base.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/default_header_holder.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/empty_node_checker.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/equal_to_value.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/exception_disposer.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/get_value_traits.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/hook_traits.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/iiterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/iterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/key_nodeptr_comp.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/list_iterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/math.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/memory_util.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/minimal_less_equal_header.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/minimal_pair_header.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/node_cloner_disposer.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/node_holder.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/node_to_value.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/pointer_element.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/preprocessor.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/reverse_iterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/simple_disposers.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/size_holder.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/slist_iterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/std_fwd.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/to_raw_pointer.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/tree_iterator.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/uncast.hpp DEPENDENCIES/generic/include/boost/intrusive/detail/utilities.hpp DEPENDENCIES/generic/include/boost/intrusive/pack_options.hpp DEPENDENCIES/generic/include/boost/intrusive/pointer_rebind.hpp DEPENDENCIES/generic/include/boost/intrusive/splay_set_hook.hpp DEPENDENCIES/generic/include/boost/iterator/minimum_category.hpp DEPENDENCIES/generic/include/boost/lexical_cast/bad_lexical_cast.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_lexical.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_lexical_streams.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_numeric.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/inf_nan.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/is_character.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/lcast_char_constants.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/lcast_unsigned_converters.hpp DEPENDENCIES/generic/include/boost/lexical_cast/detail/widest_char.hpp DEPENDENCIES/generic/include/boost/lexical_cast/lexical_cast_old.hpp DEPENDENCIES/generic/include/boost/lexical_cast/try_lexical_convert.hpp DEPENDENCIES/generic/include/boost/log/detail/copy_cv.hpp DEPENDENCIES/generic/include/boost/log/detail/enqueued_record.hpp DEPENDENCIES/generic/include/boost/log/detail/malloc_aligned.hpp DEPENDENCIES/generic/include/boost/log/keywords/empty_marker.hpp DEPENDENCIES/generic/include/boost/log/keywords/incomplete_marker.hpp DEPENDENCIES/generic/include/boost/log/support/std_regex.hpp DEPENDENCIES/generic/include/boost/make_unique.hpp DEPENDENCIES/generic/include/boost/math/constants/generate.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_cmath.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_complex.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_complex_std.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_iostream.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_limits.hpp DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_types.hpp DEPENDENCIES/generic/include/boost/math/distributions/arcsine.hpp DEPENDENCIES/generic/include/boost/math/distributions/hyperexponential.hpp DEPENDENCIES/generic/include/boost/math/special_functions/bernoulli.hpp DEPENDENCIES/generic/include/boost/math/special_functions/bessel_prime.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/bernoulli_details.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_derivatives_linear.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/polygamma.hpp DEPENDENCIES/generic/include/boost/math/special_functions/detail/unchecked_bernoulli.hpp DEPENDENCIES/generic/include/boost/math/special_functions/ellint_d.hpp DEPENDENCIES/generic/include/boost/math/special_functions/ellint_rg.hpp DEPENDENCIES/generic/include/boost/math/special_functions/heuman_lambda.hpp DEPENDENCIES/generic/include/boost/math/special_functions/jacobi_zeta.hpp DEPENDENCIES/generic/include/boost/math/special_functions/polygamma.hpp DEPENDENCIES/generic/include/boost/math/special_functions/trigamma.hpp DEPENDENCIES/generic/include/boost/math/tools/remez.hpp DEPENDENCIES/generic/include/boost/math/tools/solve.hpp DEPENDENCIES/generic/include/boost/math/tools/test.hpp DEPENDENCIES/generic/include/boost/math/tools/test_data.hpp DEPENDENCIES/generic/include/boost/move/adl_move_swap.hpp DEPENDENCIES/generic/include/boost/move/default_delete.hpp DEPENDENCIES/generic/include/boost/move/detail/fwd_macros.hpp DEPENDENCIES/generic/include/boost/move/detail/iterator_traits.hpp DEPENDENCIES/generic/include/boost/move/detail/meta_utils_core.hpp DEPENDENCIES/generic/include/boost/move/detail/type_traits.hpp DEPENDENCIES/generic/include/boost/move/detail/unique_ptr_meta_utils.hpp DEPENDENCIES/generic/include/boost/move/detail/workaround.hpp DEPENDENCIES/generic/include/boost/move/make_unique.hpp DEPENDENCIES/generic/include/boost/move/unique_ptr.hpp DEPENDENCIES/generic/include/boost/move/utility_core.hpp DEPENDENCIES/generic/include/boost/mpl/aux_/config/gpu.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/cons_stdtuple.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/is_transparent.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/msvc_index_specifier.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/prevent_eti.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/promotes_arg.hpp DEPENDENCIES/generic/include/boost/multi_index/detail/safe_ctr_proxy.hpp DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float.hpp DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float/io.hpp DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float/transcendental.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/extract_value_type.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/norm_inf.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/reduce.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/multi_array_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/norm_result_type.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/operations_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/blaze/blaze_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/blaze/blaze_resize.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_operations.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_resize.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_resize.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_state.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_vector_state.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mtl4/mtl4.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_copy.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_norm_inf.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_resize.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_state.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_abs.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_copy.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/integrate/detail/functors.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/adaptive_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/adaptive_time_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/const_step_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/const_step_time_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/functors.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_n_steps.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_adaptive.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_const.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_n_steps.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_times.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/null_observer.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/observer_collection.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/n_step_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/n_step_time_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/times_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/times_time_iterator.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/stepper/extrapolation_stepper.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/stepper/velocity_verlet.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/util/multi_array_adaption.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/util/n_ary_helper.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/util/split.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/util/split_adaptor.hpp DEPENDENCIES/generic/include/boost/numeric/odeint/util/stepper_traits.hpp DEPENDENCIES/generic/include/boost/numeric/ublas/matrix_vector.hpp DEPENDENCIES/generic/include/boost/optional/bad_optional_access.hpp DEPENDENCIES/generic/include/boost/pending/cstddef.hpp DEPENDENCIES/generic/include/boost/phoenix/config.hpp DEPENDENCIES/generic/include/boost/phoenix/core/debug.hpp DEPENDENCIES/generic/include/boost/phoenix/core/is_value.hpp DEPENDENCIES/generic/include/boost/phoenix/function/lazy_list.hpp DEPENDENCIES/generic/include/boost/phoenix/function/lazy_operator.hpp DEPENDENCIES/generic/include/boost/phoenix/function/lazy_prelude.hpp DEPENDENCIES/generic/include/boost/phoenix/function/lazy_reuse.hpp DEPENDENCIES/generic/include/boost/polymorphic_cast.hpp DEPENDENCIES/generic/include/boost/polymorphic_pointer_cast.hpp DEPENDENCIES/generic/include/boost/predef/detail/comp_detected.h DEPENDENCIES/generic/include/boost/predef/detail/platform_detected.h DEPENDENCIES/generic/include/boost/predef/os/haiku.h DEPENDENCIES/generic/include/boost/predef/os/ios.h DEPENDENCIES/generic/include/boost/predef/platform/windows_desktop.h DEPENDENCIES/generic/include/boost/predef/platform/windows_phone.h DEPENDENCIES/generic/include/boost/predef/platform/windows_runtime.h DEPENDENCIES/generic/include/boost/predef/platform/windows_store.h DEPENDENCIES/generic/include/boost/predef/version.h DEPENDENCIES/generic/include/boost/preprocessor/array/detail/get_data.hpp DEPENDENCIES/generic/include/boost/preprocessor/facilities/detail/is_empty.hpp DEPENDENCIES/generic/include/boost/preprocessor/facilities/is_empty_variadic.hpp DEPENDENCIES/generic/include/boost/preprocessor/punctuation/detail/is_begin_parens.hpp DEPENDENCIES/generic/include/boost/preprocessor/punctuation/is_begin_parens.hpp DEPENDENCIES/generic/include/boost/preprocessor/punctuation/remove_parens.hpp DEPENDENCIES/generic/include/boost/preprocessor/seq/variadic_seq_to_seq.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/detail/is_single_return.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/insert.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/pop_back.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/pop_front.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/push_back.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/push_front.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/remove.hpp DEPENDENCIES/generic/include/boost/preprocessor/tuple/replace.hpp DEPENDENCIES/generic/include/boost/preprocessor/variadic/detail/is_single_return.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/basic_reduce.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/detail/untracked_pair.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/parallel_property_maps.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/process_group.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/simple_trigger.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/unsafe_serialize.hpp DEPENDENCIES/generic/include/boost/property_map/parallel/vector_property_map.hpp DEPENDENCIES/generic/include/boost/random/beta_distribution.hpp DEPENDENCIES/generic/include/boost/random/detail/polynomial.hpp DEPENDENCIES/generic/include/boost/random/laplace_distribution.hpp DEPENDENCIES/generic/include/boost/random/non_central_chi_squared_distribution.hpp DEPENDENCIES/generic/include/boost/range/adaptor/formatted.hpp DEPENDENCIES/generic/include/boost/range/detail/combine_cxx03.hpp DEPENDENCIES/generic/include/boost/range/detail/combine_cxx11.hpp DEPENDENCIES/generic/include/boost/range/detail/combine_no_rvalue.hpp DEPENDENCIES/generic/include/boost/range/detail/combine_rvalue.hpp DEPENDENCIES/generic/include/boost/range/detail/const_iterator.hpp DEPENDENCIES/generic/include/boost/range/detail/default_constructible_unary_fn.hpp DEPENDENCIES/generic/include/boost/range/detail/has_member_size.hpp DEPENDENCIES/generic/include/boost/range/detail/iterator.hpp DEPENDENCIES/generic/include/boost/range/detail/msvc_has_iterator_workaround.hpp DEPENDENCIES/generic/include/boost/range/detail/size.hpp DEPENDENCIES/generic/include/boost/range/detail/vc6/end.hpp DEPENDENCIES/generic/include/boost/range/detail/vc6/size.hpp DEPENDENCIES/generic/include/boost/range/iterator_range_hash.hpp DEPENDENCIES/generic/include/boost/range/mfc_map.hpp DEPENDENCIES/generic/include/boost/range/range_fwd.hpp DEPENDENCIES/generic/include/boost/range/traversal.hpp DEPENDENCIES/generic/include/boost/ratio/ratio_static_string.hpp DEPENDENCIES/generic/include/boost/serialization/detail/is_default_constructible.hpp DEPENDENCIES/generic/include/boost/serialization/forward_list.hpp DEPENDENCIES/generic/include/boost/serialization/priority_queue.hpp DEPENDENCIES/generic/include/boost/serialization/queue.hpp DEPENDENCIES/generic/include/boost/serialization/shared_ptr_helper.hpp DEPENDENCIES/generic/include/boost/serialization/stack.hpp DEPENDENCIES/generic/include/boost/serialization/unique_ptr.hpp DEPENDENCIES/generic/include/boost/serialization/unordered_collections_load_imp.hpp DEPENDENCIES/generic/include/boost/serialization/unordered_collections_save_imp.hpp DEPENDENCIES/generic/include/boost/serialization/unordered_map.hpp DEPENDENCIES/generic/include/boost/serialization/unordered_set.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/allocate_array_helper.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_allocator.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_count_impl.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_deleter.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_nt.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_pt.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_pthreads.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_spin.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_std_atomic.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/make_array_helper.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/shared_array_nmt.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/shared_ptr_nmt.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_counted_base_clang.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_interlocked.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/spinlock_std_atomic.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/up_if_array.hpp DEPENDENCIES/generic/include/boost/smart_ptr/detail/up_if_not_array.hpp DEPENDENCIES/generic/include/boost/smart_ptr/make_unique.hpp DEPENDENCIES/generic/include/boost/smart_ptr/make_unique_array.hpp DEPENDENCIES/generic/include/boost/smart_ptr/make_unique_object.hpp DEPENDENCIES/generic/include/boost/sort/sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/constants.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/float_sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/integer_sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/spreadsort_common.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/string_sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/float_sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/integer_sort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/spreadsort.hpp DEPENDENCIES/generic/include/boost/sort/spreadsort/string_sort.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/algorithm.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_function_object.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_member_function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_member_variable.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/function_ptr.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/container.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/actor.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/argument.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/as_actor.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/basic_environment.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/compose.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/composite.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/actor.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/basic_environment.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/compose.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite_info.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/function_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/is_actor.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/limits.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/nothing.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/reference.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/value.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/detail/local_reference.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/detail/type_deduction.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function/detail/function_call.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function/function.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/fusion.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/fusion/at.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/const_cast.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/construct.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/delete.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/construct.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/construct_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/new.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/new_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/dynamic_cast.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/new.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/reinterpret_cast.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/static_cast.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/arithmetic.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/bitwise.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/comparison.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/binary_compose.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/binary_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/io.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/unary_compose.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/unary_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/if_else.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/io.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/logical.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/member.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/self.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/detail/local_gen.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/detail/local_variable.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/dynamic.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/lambda.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/let.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/local_variable.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/scoped_environment.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_composite.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch_eval.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch_eval.ipp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/do_while.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/for.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/if.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/sequence.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/switch.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/throw.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/try_catch.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/while.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/iteration.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/querying.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/transformation.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container/container.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container/detail/container.hpp DEPENDENCIES/generic/include/boost/spirit/home/phoenix/version.hpp DEPENDENCIES/generic/include/boost/spirit/home/qi/copy.hpp DEPENDENCIES/generic/include/boost/spirit/home/support/auto.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/any_parser.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/attr.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eoi.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eol.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eps.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/guard.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/any_char.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char_class.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char_parser.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/detail/cast_char.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/literal_char.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/negated_char_parser.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/char/unicode.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/action.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/call.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/detail/parse_into_container.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/parse.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/parser.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/proxy.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/core/skip_over.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/expect.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/lexeme.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/no_skip.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/omit.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/raw.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/skip.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/with.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/extensions.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/extensions/seek.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/debug_handler_state.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/detail/rule.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/detail/transform_attribute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/rule.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/simple_trace.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/bool.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/bool_policies.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/int.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/real.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/real_policies.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/uint.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/alternative.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/and_predicate.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/detail/alternative.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/detail/sequence.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/difference.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/kleene.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/list.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/not_predicate.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/optional.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/plus.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/sequence.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/detail/string_parse.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/detail/tst.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/literal_string.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/symbols.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/tst.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/string/tst_map.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/ast/position_tagged.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/ast/variant.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/context.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/detail/extract_int.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/extract_int.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/extract_real.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/pow10.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/sign.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/subcontext.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_category.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_of.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_type.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/container_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/handles_container.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/has_attribute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_parser.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_substitute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_variant.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/make_attribute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/move_to.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/numeric_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/optional_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/print_attribute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/print_token.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/string_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/transform_attribute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/tuple_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/value_traits.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/variant_find_substitute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/variant_has_substitute.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/unused.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/detail/testing.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/error_reporting.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/integer_sequence.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/is_callable.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/lambda_visitor.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/sfinae.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/testing.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/unrefcv.hpp DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/utf8.hpp DEPENDENCIES/generic/include/boost/spirit/include/qi_copy.hpp DEPENDENCIES/generic/include/boost/spirit/include/support_auto.hpp DEPENDENCIES/generic/include/boost/strong_typedef.hpp DEPENDENCIES/generic/include/boost/system/detail/error_code.ipp DEPENDENCIES/generic/include/boost/system/detail/local_free_on_destruction.hpp DEPENDENCIES/generic/include/boost/thread/caller_context.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_adaptor.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_base.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_views.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/detail/sync_deque_base.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/detail/sync_queue_base.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_adaptor.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_base.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_op_status.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_views.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_bounded_queue.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_deque.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_priority_queue.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_queue.hpp DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_timed_queue.hpp DEPENDENCIES/generic/include/boost/thread/csbl/deque.hpp DEPENDENCIES/generic/include/boost/thread/csbl/devector.hpp DEPENDENCIES/generic/include/boost/thread/csbl/functional.hpp DEPENDENCIES/generic/include/boost/thread/csbl/list.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/allocator_arg.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/allocator_traits.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/config.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/default_delete.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/pointer_traits.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/scoped_allocator.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/shared_ptr.hpp DEPENDENCIES/generic/include/boost/thread/csbl/memory/unique_ptr.hpp DEPENDENCIES/generic/include/boost/thread/csbl/queue.hpp DEPENDENCIES/generic/include/boost/thread/csbl/tuple.hpp DEPENDENCIES/generic/include/boost/thread/csbl/vector.hpp DEPENDENCIES/generic/include/boost/thread/detail/async_func.hpp DEPENDENCIES/generic/include/boost/thread/detail/function_wrapper.hpp DEPENDENCIES/generic/include/boost/thread/detail/invoker.hpp DEPENDENCIES/generic/include/boost/thread/detail/nullary_function.hpp DEPENDENCIES/generic/include/boost/thread/detail/variadic_footer.hpp DEPENDENCIES/generic/include/boost/thread/detail/variadic_header.hpp DEPENDENCIES/generic/include/boost/thread/exceptional_ptr.hpp DEPENDENCIES/generic/include/boost/thread/executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/basic_thread_pool.hpp DEPENDENCIES/generic/include/boost/thread/executors/detail/priority_executor_base.hpp DEPENDENCIES/generic/include/boost/thread/executors/detail/scheduled_executor_base.hpp DEPENDENCIES/generic/include/boost/thread/executors/executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/executor_adaptor.hpp DEPENDENCIES/generic/include/boost/thread/executors/generic_executor_ref.hpp DEPENDENCIES/generic/include/boost/thread/executors/inline_executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/loop_executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/scheduled_thread_pool.hpp DEPENDENCIES/generic/include/boost/thread/executors/scheduler.hpp DEPENDENCIES/generic/include/boost/thread/executors/scheduling_adaptor.hpp DEPENDENCIES/generic/include/boost/thread/executors/serial_executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/serial_executor_cont.hpp DEPENDENCIES/generic/include/boost/thread/executors/thread_executor.hpp DEPENDENCIES/generic/include/boost/thread/executors/work.hpp DEPENDENCIES/generic/include/boost/thread/experimental/config/inline_namespace.hpp DEPENDENCIES/generic/include/boost/thread/experimental/exception_list.hpp DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v1/exception_list.hpp DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v1/inline_namespace.hpp DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v2/inline_namespace.hpp DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v2/task_region.hpp DEPENDENCIES/generic/include/boost/thread/experimental/task_region.hpp DEPENDENCIES/generic/include/boost/thread/future_error_code.hpp DEPENDENCIES/generic/include/boost/thread/futures/future_error.hpp DEPENDENCIES/generic/include/boost/thread/futures/future_error_code.hpp DEPENDENCIES/generic/include/boost/thread/futures/future_status.hpp DEPENDENCIES/generic/include/boost/thread/futures/is_future_type.hpp DEPENDENCIES/generic/include/boost/thread/futures/launch.hpp DEPENDENCIES/generic/include/boost/thread/futures/wait_for_all.hpp DEPENDENCIES/generic/include/boost/thread/futures/wait_for_any.hpp DEPENDENCIES/generic/include/boost/thread/ostream_buffer.hpp DEPENDENCIES/generic/include/boost/thread/thread_pool.hpp DEPENDENCIES/generic/include/boost/thread/user_scheduler.hpp DEPENDENCIES/generic/include/boost/thread/with_lock_guard.hpp DEPENDENCIES/generic/include/boost/tti/detail/dcomp_static_mem_fun.hpp DEPENDENCIES/generic/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp DEPENDENCIES/generic/include/boost/type_index.hpp DEPENDENCIES/generic/include/boost/type_index/ctti_type_index.hpp DEPENDENCIES/generic/include/boost/type_index/detail/compile_time_type_info.hpp DEPENDENCIES/generic/include/boost/type_index/detail/ctti_register_class.hpp DEPENDENCIES/generic/include/boost/type_index/detail/stl_register_class.hpp DEPENDENCIES/generic/include/boost/type_index/stl_type_index.hpp DEPENDENCIES/generic/include/boost/type_index/type_index_facade.hpp DEPENDENCIES/generic/include/boost/type_traits/is_copy_assignable.hpp DEPENDENCIES/generic/include/boost/type_traits/is_final.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_all_extents.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_bounds.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_const.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_cv.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_extent.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_pointer.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_reference.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_volatile.hpp DEPENDENCIES/generic/include/boost/type_traits/msvc/typeof.hpp DEPENDENCIES/generic/include/boost/units/base_units/information/bit.hpp DEPENDENCIES/generic/include/boost/units/base_units/information/byte.hpp DEPENDENCIES/generic/include/boost/units/base_units/information/hartley.hpp DEPENDENCIES/generic/include/boost/units/base_units/information/nat.hpp DEPENDENCIES/generic/include/boost/units/base_units/information/shannon.hpp DEPENDENCIES/generic/include/boost/units/physical_dimensions/information.hpp DEPENDENCIES/generic/include/boost/units/systems/information.hpp DEPENDENCIES/generic/include/boost/units/systems/information/bit.hpp DEPENDENCIES/generic/include/boost/units/systems/information/byte.hpp DEPENDENCIES/generic/include/boost/units/systems/information/hartley.hpp DEPENDENCIES/generic/include/boost/units/systems/information/nat.hpp DEPENDENCIES/generic/include/boost/units/systems/information/prefixes.hpp DEPENDENCIES/generic/include/boost/units/systems/information/shannon.hpp DEPENDENCIES/generic/include/boost/uuid/detail/config.hpp DEPENDENCIES/generic/include/boost/uuid/detail/uuid_generic.hpp DEPENDENCIES/generic/include/boost/uuid/detail/uuid_x86.hpp DEPENDENCIES/generic/include/boost/variant/detail/element_index.hpp DEPENDENCIES/generic/include/boost/variant/detail/has_result_type.hpp DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_cpp11_based.hpp DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_cpp14_based.hpp DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_preprocessor_based.hpp DEPENDENCIES/generic/include/boost/variant/polymorphic_get.hpp METADATA/nondeterministic.txt
diffstat 1153 files changed, 141492 insertions(+), 50868 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/accumulators/statistics/rolling_moment.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,113 @@
+///////////////////////////////////////////////////////////////////////////////
+// rolling_moment.hpp
+// Copyright 2005 Eric Niebler.
+// Copyright (C) 2014 Pieter Bastiaan Ober (Integricom).
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_ACCUMULATORS_STATISTICS_ROLLING_MOMENT_HPP_EAN_27_11_2005
+#define BOOST_ACCUMULATORS_STATISTICS_ROLLING_MOMENT_HPP_EAN_27_11_2005
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/accumulators/framework/accumulator_base.hpp>
+#include <boost/accumulators/framework/extractor.hpp>
+#include <boost/accumulators/numeric/functional.hpp>
+#include <boost/accumulators/framework/parameters/sample.hpp>
+#include <boost/accumulators/framework/depends_on.hpp>
+#include <boost/accumulators/statistics_fwd.hpp>
+#include <boost/accumulators/statistics/moment.hpp>
+#include <boost/accumulators/statistics/rolling_count.hpp>
+
+namespace boost { namespace accumulators
+{
+namespace impl
+{
+    ///////////////////////////////////////////////////////////////////////////////
+    // rolling_moment_impl
+    template<typename N, typename Sample>
+    struct rolling_moment_impl
+      : accumulator_base
+    {
+        BOOST_MPL_ASSERT_RELATION(N::value, >, 0);
+        // for boost::result_of
+        typedef typename numeric::functional::fdiv<Sample, std::size_t,void,void>::result_type result_type;
+
+        template<typename Args>
+        rolling_moment_impl(Args const &args)
+          : sum_(args[sample | Sample()])
+        {
+        }
+
+        template<typename Args>
+        void operator ()(Args const &args)
+        {
+            if(is_rolling_window_plus1_full(args))
+            {
+                this->sum_ -= numeric::pow(rolling_window_plus1(args).front(), N());
+            }
+            this->sum_ += numeric::pow(args[sample], N());
+        }
+
+        template<typename Args>
+        result_type result(Args const &args) const
+        {
+            return numeric::fdiv(this->sum_, rolling_count(args));
+        }
+
+    private:
+        result_type sum_;
+    };
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+// tag::rolling_moment
+//
+namespace tag
+{
+    template<int N>
+    struct rolling_moment
+      : depends_on< rolling_window_plus1, rolling_count>
+    {
+        /// INTERNAL ONLY
+        ///
+        typedef accumulators::impl::rolling_moment_impl<mpl::int_<N>, mpl::_1> impl;
+
+        #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
+        /// tag::rolling_window::window_size named parameter
+        static boost::parameter::keyword<tag::rolling_window_size> const window_size;
+        #endif
+    };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// extract::rolling_moment
+//
+namespace extract
+{
+    BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, rolling_moment, (int))
+}
+
+using extract::rolling_moment;
+
+// There is no weighted_rolling_moment (yet)...
+//
+//// So that rolling_moment<N> can be automatically substituted with
+//// weighted_rolling_moment<N> when the weight parameter is non-void
+//template<int N>
+//struct as_weighted_feature<tag::rolling_moment<N> >
+//{
+//    typedef tag::weighted_rolling_moment<N> type;
+//};
+//
+//template<int N>
+//struct feature_of<tag::weighted_rolling_moment<N> >
+//  : feature_of<tag::rolling_moment<N> >
+//{
+//};
+}} // namespace boost::accumulators
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/accumulators/statistics/rolling_variance.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,247 @@
+///////////////////////////////////////////////////////////////////////////////
+// rolling_variance.hpp
+// Copyright (C) 2005 Eric Niebler
+// Copyright (C) 2014 Pieter Bastiaan Ober (Integricom).
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_ACCUMULATORS_STATISTICS_ROLLING_VARIANCE_HPP_EAN_15_11_2011
+#define BOOST_ACCUMULATORS_STATISTICS_ROLLING_VARIANCE_HPP_EAN_15_11_2011
+
+#include <boost/accumulators/accumulators.hpp>
+#include <boost/accumulators/statistics/stats.hpp>
+
+#include <boost/mpl/placeholders.hpp>
+#include <boost/accumulators/framework/accumulator_base.hpp>
+#include <boost/accumulators/framework/extractor.hpp>
+#include <boost/accumulators/numeric/functional.hpp>
+#include <boost/accumulators/framework/parameters/sample.hpp>
+#include <boost/accumulators/framework/depends_on.hpp>
+#include <boost/accumulators/statistics_fwd.hpp>
+#include <boost/accumulators/statistics/rolling_mean.hpp>
+#include <boost/accumulators/statistics/rolling_moment.hpp>
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace accumulators
+{
+namespace impl
+{
+    //! Immediate (lazy) calculation of the rolling variance.
+    /*!
+    Calculation of sample variance \f$\sigma_n^2\f$ is done as follows, see also
+    http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance.
+    For a rolling window of size \f$N\f$, when \f$n <= N\f$, the variance is computed according to the formula
+    \f[
+    \sigma_n^2 = \frac{1}{n-1} \sum_{i = 1}^n (x_i - \mu_n)^2.
+    \f]
+    When \f$n > N\f$, the sample variance over the window becomes:
+    \f[
+    \sigma_n^2 = \frac{1}{N-1} \sum_{i = n-N+1}^n (x_i - \mu_n)^2.
+    \f]
+    */
+    ///////////////////////////////////////////////////////////////////////////////
+    // lazy_rolling_variance_impl
+    //
+    template<typename Sample>
+    struct lazy_rolling_variance_impl
+        : accumulator_base
+    {
+        // for boost::result_of
+        typedef typename numeric::functional::fdiv<Sample, std::size_t,void,void>::result_type result_type;
+
+        lazy_rolling_variance_impl(dont_care) {}
+
+        template<typename Args>
+        result_type result(Args const &args) const
+        {
+            result_type mean = rolling_mean(args);
+            size_t nr_samples = rolling_count(args);
+            if (nr_samples < 2) return result_type();
+            return nr_samples*(rolling_moment<2>(args) - mean*mean)/(nr_samples-1);
+        }
+    };
+
+    //! Iterative calculation of the rolling variance.
+    /*!
+    Iterative calculation of sample variance \f$\sigma_n^2\f$ is done as follows, see also
+    http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance.
+    For a rolling window of size \f$N\f$, for the first \f$N\f$ samples, the variance is computed according to the formula
+    \f[
+    \sigma_n^2 = \frac{1}{n-1} \sum_{i = 1}^n (x_i - \mu_n)^2 = \frac{1}{n-1}M_{2,n},
+    \f]
+    where the sum of squares \f$M_{2,n}\f$ can be recursively computed as:
+    \f[
+    M_{2,n} = \sum_{i = 1}^n (x_i - \mu_n)^2 = M_{2,n-1} + (x_n - \mu_n)(x_n - \mu_{n-1}),
+    \f]
+    and the estimate of the sample mean as:
+    \f[
+    \mu_n = \frac{1}{n} \sum_{i = 1}^n x_i = \mu_{n-1} + \frac{1}{n}(x_n - \mu_{n-1}).
+    \f]
+    For further samples, when the rolling window is fully filled with data, one has to take into account that the oldest
+    sample \f$x_{n-N}\f$ is dropped from the window. The sample variance over the window now becomes:
+    \f[
+    \sigma_n^2 = \frac{1}{N-1} \sum_{i = n-N+1}^n (x_i - \mu_n)^2 = \frac{1}{n-1}M_{2,n},
+    \f]
+    where the sum of squares \f$M_{2,n}\f$ now equals:
+    \f[
+    M_{2,n} = \sum_{i = n-N+1}^n (x_i - \mu_n)^2 = M_{2,n-1} + (x_n - \mu_n)(x_n - \mu_{n-1}) - (x_{n-N} - \mu_n)(x_{n-N} - \mu_{n-1}),
+    \f]
+    and the estimated mean is:
+    \f[
+    \mu_n = \frac{1}{N} \sum_{i = n-N+1}^n x_i = \mu_{n-1} + \frac{1}{n}(x_n - x_{n-N}).
+    \f]
+
+    Note that the sample variance is not defined for \f$n <= 1\f$.
+
+    */
+    ///////////////////////////////////////////////////////////////////////////////
+    // immediate_rolling_variance_impl
+    //
+    template<typename Sample>
+    struct immediate_rolling_variance_impl
+        : accumulator_base
+    {
+        // for boost::result_of
+        typedef typename numeric::functional::fdiv<Sample, std::size_t>::result_type result_type;
+
+        template<typename Args>
+        immediate_rolling_variance_impl(Args const &args)
+            : previous_mean_(numeric::fdiv(args[sample | Sample()], numeric::one<std::size_t>::value))
+            , sum_of_squares_(numeric::fdiv(args[sample | Sample()], numeric::one<std::size_t>::value))
+        {
+        }
+
+        template<typename Args>
+        void operator()(Args const &args)
+        {
+            Sample added_sample = args[sample];
+
+            result_type mean = immediate_rolling_mean(args);
+            sum_of_squares_ += (added_sample-mean)*(added_sample-previous_mean_);
+
+            if(is_rolling_window_plus1_full(args))
+            {
+                Sample removed_sample = rolling_window_plus1(args).front();
+                sum_of_squares_ -= (removed_sample-mean)*(removed_sample-previous_mean_);
+                prevent_underflow(sum_of_squares_);
+            }
+            previous_mean_ = mean;
+        }
+
+        template<typename Args>
+        result_type result(Args const &args) const
+        {
+            size_t nr_samples = rolling_count(args);
+            if (nr_samples < 2) return result_type();
+            return numeric::fdiv(sum_of_squares_,(nr_samples-1));
+        }
+
+    private:
+
+        result_type previous_mean_;
+        result_type sum_of_squares_;
+
+        template<typename T>
+        void prevent_underflow(T &non_negative_number,typename boost::enable_if<boost::is_arithmetic<T>,T>::type* = 0)
+        {
+            if (non_negative_number < T(0)) non_negative_number = T(0);
+        }
+        template<typename T>
+        void prevent_underflow(T &non_arithmetic_quantity,typename boost::disable_if<boost::is_arithmetic<T>,T>::type* = 0)
+        {
+        }
+    };
+} // namespace impl
+
+///////////////////////////////////////////////////////////////////////////////
+// tag:: lazy_rolling_variance
+// tag:: immediate_rolling_variance
+// tag:: rolling_variance
+//
+namespace tag
+{
+    struct lazy_rolling_variance
+        : depends_on< rolling_count, rolling_mean, rolling_moment<2> >
+    {
+        /// INTERNAL ONLY
+        ///
+        typedef accumulators::impl::lazy_rolling_variance_impl< mpl::_1 > impl;
+
+        #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
+        /// tag::rolling_window::window_size named parameter
+        static boost::parameter::keyword<tag::rolling_window_size> const window_size;
+        #endif
+    };
+
+    struct immediate_rolling_variance
+        : depends_on< rolling_window_plus1, rolling_count, immediate_rolling_mean>
+    {
+        /// INTERNAL ONLY
+        ///
+        typedef accumulators::impl::immediate_rolling_variance_impl< mpl::_1> impl;
+
+        #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
+        /// tag::rolling_window::window_size named parameter
+        static boost::parameter::keyword<tag::rolling_window_size> const window_size;
+        #endif
+    };
+
+    // make immediate_rolling_variance the default implementation
+    struct rolling_variance : immediate_rolling_variance {};
+} // namespace tag
+
+///////////////////////////////////////////////////////////////////////////////
+// extract::lazy_rolling_variance
+// extract::immediate_rolling_variance
+// extract::rolling_variance
+//
+namespace extract
+{
+    extractor<tag::lazy_rolling_variance> const lazy_rolling_variance = {};
+    extractor<tag::immediate_rolling_variance> const immediate_rolling_variance = {};
+    extractor<tag::rolling_variance> const rolling_variance = {};
+
+    BOOST_ACCUMULATORS_IGNORE_GLOBAL(lazy_rolling_variance)
+    BOOST_ACCUMULATORS_IGNORE_GLOBAL(immediate_rolling_variance)
+    BOOST_ACCUMULATORS_IGNORE_GLOBAL(rolling_variance)
+}
+
+using extract::lazy_rolling_variance;
+using extract::immediate_rolling_variance;
+using extract::rolling_variance;
+
+// rolling_variance(lazy) -> lazy_rolling_variance
+template<>
+struct as_feature<tag::rolling_variance(lazy)>
+{
+    typedef tag::lazy_rolling_variance type;
+};
+
+// rolling_variance(immediate) -> immediate_rolling_variance
+template<>
+struct as_feature<tag::rolling_variance(immediate)>
+{
+    typedef tag::immediate_rolling_variance type;
+};
+
+// for the purposes of feature-based dependency resolution,
+// lazy_rolling_variance provides the same feature as rolling_variance
+template<>
+struct feature_of<tag::lazy_rolling_variance>
+    : feature_of<tag::rolling_variance>
+{
+};
+
+// for the purposes of feature-based dependency resolution,
+// immediate_rolling_variance provides the same feature as rolling_variance
+template<>
+struct feature_of<tag::immediate_rolling_variance>
+  : feature_of<tag::rolling_variance>
+{
+};
+}} // namespace boost::accumulators
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/algorithm/algorithm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,86 @@
+/* 
+   Copyright (c) Marshall Clow 2014.
+
+   Distributed under the Boost Software License, Version 1.0. (See accompanying
+   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+ Revision history:
+    2 Dec 2014 mtc First version; power
+   
+*/
+
+/// \file algorithm.hpp
+/// \brief Misc Algorithms
+/// \author Marshall Clow
+///
+
+#ifndef BOOST_ALGORITHM_HPP
+#define BOOST_ALGORITHM_HPP
+
+#include <boost/utility/enable_if.hpp> // for boost::disable_if
+#include <boost/type_traits/is_integral.hpp>
+
+namespace boost { namespace algorithm {
+
+template <typename T>
+T identity_operation ( std::multiplies<T> ) { return T(1); }
+
+template <typename T>
+T identity_operation ( std::plus<T> ) { return T(0); }
+
+
+/// \fn power ( T x, Integer n )
+/// \return the value "x" raised to the power "n"
+/// 
+/// \param x     The value to be exponentiated
+/// \param n     The exponent (must be >= 0)
+///
+//  \remark Taken from Knuth, The Art of Computer Programming, Volume 2:
+//  Seminumerical Algorithms, Section 4.6.3
+template <typename T, typename Integer>
+typename boost::enable_if<boost::is_integral<Integer>, T>::type
+power (T x, Integer n) {
+    T y = 1; // Should be "T y{1};" 
+    if (n == 0) return y;
+    while (true) {
+        if (n % 2 == 1) {
+            y = x * y;
+            if (n == 1)
+                return y;
+            }
+        n = n / 2;
+        x = x * x;
+        }
+    return y;
+    }
+
+/// \fn power ( T x, Integer n, Operation op )
+/// \return the value "x" raised to the power "n"
+/// using the operaton "op".
+/// 
+/// \param x     The value to be exponentiated
+/// \param n     The exponent (must be >= 0)
+/// \param op    The operation used
+///
+//  \remark Taken from Knuth, The Art of Computer Programming, Volume 2:
+//  Seminumerical Algorithms, Section 4.6.3
+template <typename T, typename Integer, typename Operation>
+typename boost::enable_if<boost::is_integral<Integer>, T>::type
+power (T x, Integer n, Operation op) {
+    T y = identity_operation(op);
+    if (n == 0) return y;
+    while (true) {
+        if (n % 2 == 1) {
+            y = op(x, y);
+            if (n == 1)
+                return y;
+            }
+        n = n / 2;
+        x = op(x, x);
+        }
+    return y;
+    }
+
+}}
+
+#endif // BOOST_ALGORITHM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,20 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_HPP
+#define BOOST_ALIGN_HPP
+
+#include <boost/align/align.hpp>
+#include <boost/align/aligned_alloc.hpp>
+#include <boost/align/aligned_allocator.hpp>
+#include <boost/align/aligned_allocator_adaptor.hpp>
+#include <boost/align/aligned_delete.hpp>
+#include <boost/align/alignment_of.hpp>
+#include <boost/align/is_aligned.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/align.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,20 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGN_HPP
+#define BOOST_ALIGN_ALIGN_HPP
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_STD_ALIGN)
+#include <boost/align/detail/align_cxx11.hpp>
+#else
+#include <boost/align/detail/align.hpp>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_alloc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_ALLOC_HPP
+#define BOOST_ALIGN_ALIGNED_ALLOC_HPP
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_HAS_UNISTD_H)
+#include <unistd.h>
+#endif
+
+#if defined(__APPLE__) || defined(__APPLE_CC__) || defined(macintosh)
+#include <AvailabilityMacros.h>
+#endif
+
+#if defined(_MSC_VER)
+#include <boost/align/detail/aligned_alloc_msvc.hpp>
+#elif defined(__MINGW32__) && (__MSVCRT_VERSION__ >= 0x0700)
+#include <boost/align/detail/aligned_alloc_msvc.hpp>
+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
+#include <boost/align/detail/aligned_alloc_posix.hpp>
+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+#include <boost/align/detail/aligned_alloc_macos.hpp>
+#elif defined(__ANDROID__)
+#include <boost/align/detail/aligned_alloc_android.hpp>
+#elif defined(__SunOS_5_11) || defined(__SunOS_5_12)
+#include <boost/align/detail/aligned_alloc_posix.hpp>
+#elif defined(sun) || defined(__sun)
+#include <boost/align/detail/aligned_alloc_sunos.hpp>
+#elif (_POSIX_C_SOURCE >= 200112L) || (_XOPEN_SOURCE >= 600)
+#include <boost/align/detail/aligned_alloc_posix.hpp>
+#else
+#include <boost/align/detail/aligned_alloc.hpp>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,168 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_HPP
+#define BOOST_ALIGN_ALIGNED_ALLOCATOR_HPP
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/align/aligned_alloc.hpp>
+#include <boost/align/aligned_allocator_forward.hpp>
+#include <boost/align/alignment_of.hpp>
+#include <boost/align/detail/addressof.hpp>
+#include <boost/align/detail/is_alignment_constant.hpp>
+#include <boost/align/detail/max_align.hpp>
+#include <boost/align/detail/max_count_of.hpp>
+#include <new>
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#include <utility>
+#endif
+
+namespace boost {
+    namespace alignment {
+        template<class T, std::size_t Alignment>
+        class aligned_allocator {
+            BOOST_STATIC_ASSERT(detail::
+                is_alignment_constant<Alignment>::value);
+
+        public:
+            typedef T value_type;
+            typedef T* pointer;
+            typedef const T* const_pointer;
+            typedef void* void_pointer;
+            typedef const void* const_void_pointer;
+            typedef std::size_t size_type;
+            typedef std::ptrdiff_t difference_type;
+            typedef T& reference;
+            typedef const T& const_reference;
+
+        private:
+            typedef detail::max_align<Alignment,
+                alignment_of<value_type>::value> MaxAlign;
+
+        public:
+            template<class U>
+            struct rebind {
+                typedef aligned_allocator<U, Alignment> other;
+            };
+
+#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
+            aligned_allocator()
+                BOOST_NOEXCEPT = default;
+#else
+            aligned_allocator()
+                BOOST_NOEXCEPT {
+            }
+#endif
+
+            template<class U>
+            aligned_allocator(const aligned_allocator<U,
+                Alignment>&) BOOST_NOEXCEPT {
+            }
+
+            pointer address(reference value) const
+                BOOST_NOEXCEPT {
+                return detail::addressof(value);
+            }
+
+            const_pointer address(const_reference value) const
+                BOOST_NOEXCEPT {
+                return detail::addressof(value);
+            }
+
+            pointer allocate(size_type size,
+                const_void_pointer = 0) {
+                void* p = aligned_alloc(MaxAlign::value,
+                    sizeof(T) * size);
+                if (!p && size > 0) {
+                    boost::throw_exception(std::bad_alloc());
+                }
+                return static_cast<T*>(p);
+            }
+
+            void deallocate(pointer ptr, size_type) {
+                alignment::aligned_free(ptr);
+            }
+
+            BOOST_CONSTEXPR size_type max_size() const
+                BOOST_NOEXCEPT {
+                return detail::max_count_of<T>::value;
+            }
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+            template<class U, class... Args>
+            void construct(U* ptr, Args&&... args) {
+                void* p = ptr;
+                ::new(p) U(std::forward<Args>(args)...);
+            }
+#else
+            template<class U, class V>
+            void construct(U* ptr, V&& value) {
+                void* p = ptr;
+                ::new(p) U(std::forward<V>(value));
+            }
+#endif
+#else
+            template<class U, class V>
+            void construct(U* ptr, const V& value) {
+                void* p = ptr;
+                ::new(p) U(value);
+            }
+#endif
+
+            template<class U>
+            void construct(U* ptr) {
+                void* p = ptr;
+                ::new(p) U();
+            }
+
+            template<class U>
+            void destroy(U* ptr) {
+                (void)ptr;
+                ptr->~U();
+            }
+        };
+
+        template<std::size_t Alignment>
+        class aligned_allocator<void, Alignment> {
+            BOOST_STATIC_ASSERT(detail::
+                is_alignment_constant<Alignment>::value);
+
+        public:
+            typedef void value_type;
+            typedef void* pointer;
+            typedef const void* const_pointer;
+
+            template<class U>
+            struct rebind {
+                typedef aligned_allocator<U, Alignment> other;
+            };
+        };
+
+        template<class T1, class T2, std::size_t Alignment>
+        inline bool operator==(const aligned_allocator<T1,
+            Alignment>&, const aligned_allocator<T2,
+            Alignment>&) BOOST_NOEXCEPT
+        {
+            return true;
+        }
+
+        template<class T1, class T2, std::size_t Alignment>
+        inline bool operator!=(const aligned_allocator<T1,
+            Alignment>&, const aligned_allocator<T2,
+            Alignment>&) BOOST_NOEXCEPT
+        {
+            return false;
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_allocator_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,187 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_HPP
+#define BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_HPP
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/align/align.hpp>
+#include <boost/align/aligned_allocator_adaptor_forward.hpp>
+#include <boost/align/alignment_of.hpp>
+#include <boost/align/detail/addressof.hpp>
+#include <boost/align/detail/is_alignment_constant.hpp>
+#include <boost/align/detail/max_align.hpp>
+#include <new>
+
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+#include <memory>
+#endif
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#include <utility>
+#endif
+
+namespace boost {
+    namespace alignment {
+        template<class Allocator, std::size_t Alignment>
+        class aligned_allocator_adaptor
+            : public Allocator {
+            BOOST_STATIC_ASSERT(detail::
+                is_alignment_constant<Alignment>::value);
+
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+            typedef std::allocator_traits<Allocator> Traits;
+
+            typedef typename Traits::
+                template rebind_alloc<char> CharAlloc;
+
+            typedef typename Traits::
+                template rebind_traits<char> CharTraits;
+
+            typedef typename CharTraits::pointer CharPtr;
+#else
+            typedef typename Allocator::
+                template rebind<char>::other CharAlloc;
+
+            typedef typename CharAlloc::pointer CharPtr;
+#endif
+
+        public:
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+            typedef typename Traits::value_type value_type;
+            typedef typename Traits::size_type size_type;
+#else
+            typedef typename Allocator::value_type value_type;
+            typedef typename Allocator::size_type size_type;
+#endif
+
+            typedef value_type* pointer;
+            typedef const value_type* const_pointer;
+            typedef void* void_pointer;
+            typedef const void* const_void_pointer;
+            typedef std::ptrdiff_t difference_type;
+
+        private:
+            typedef detail::max_align<Alignment,
+                detail::max_align<alignment_of<value_type>::value,
+                    alignment_of<CharPtr>::value>::value> MaxAlign;
+
+        public:
+            template<class U>
+            struct rebind {
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                typedef aligned_allocator_adaptor<typename Traits::
+                    template rebind_alloc<U>, Alignment> other;
+#else
+                typedef aligned_allocator_adaptor<typename Allocator::
+                    template rebind<U>::other, Alignment> other;
+#endif
+            };
+
+#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
+            aligned_allocator_adaptor() = default;
+#else
+            aligned_allocator_adaptor()
+                : Allocator() {
+            }
+#endif
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+            template<class A>
+            explicit aligned_allocator_adaptor(A&& alloc)
+                BOOST_NOEXCEPT
+                : Allocator(std::forward<A>(alloc)) {
+            }
+#else
+            template<class A>
+            explicit aligned_allocator_adaptor(const A& alloc)
+                BOOST_NOEXCEPT
+                : Allocator(alloc) {
+            }
+#endif
+
+            template<class U>
+            aligned_allocator_adaptor(const
+                aligned_allocator_adaptor<U, Alignment>& other)
+                BOOST_NOEXCEPT
+                : Allocator(other.base()) {
+            }
+
+            Allocator& base()
+                BOOST_NOEXCEPT {
+                return static_cast<Allocator&>(*this);
+            }
+
+            const Allocator& base() const
+                BOOST_NOEXCEPT {
+                return static_cast<const Allocator&>(*this);
+            }
+
+            pointer allocate(size_type size) {
+                std::size_t n1 = size * sizeof(value_type);
+                std::size_t n2 = n1 + MaxAlign::value - 1;
+                CharAlloc a(base());
+                CharPtr p1 = a.allocate(sizeof p1 + n2);
+                void* p2 = detail::addressof(*p1) + sizeof p1;
+                (void)align(MaxAlign::value, n1, p2, n2);
+                void* p3 = static_cast<CharPtr*>(p2) - 1;
+                ::new(p3) CharPtr(p1);
+                return static_cast<pointer>(p2);
+            }
+
+            pointer allocate(size_type size, const_void_pointer hint) {
+                std::size_t n1 = size * sizeof(value_type);
+                std::size_t n2 = n1 + MaxAlign::value - 1;
+                CharPtr h = CharPtr();
+                if (hint) {
+                    h = *(static_cast<const CharPtr*>(hint) - 1);
+                }
+                CharAlloc a(base());
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                CharPtr p1 = CharTraits::allocate(a, sizeof p1 +
+                    n2, h);
+#else
+                CharPtr p1 = a.allocate(sizeof p1 + n2, h);
+#endif
+                void* p2 = detail::addressof(*p1) + sizeof p1;
+                (void)align(MaxAlign::value, n1, p2, n2);
+                void* p3 = static_cast<CharPtr*>(p2) - 1;
+                ::new(p3) CharPtr(p1);
+                return static_cast<pointer>(p2);
+            }
+
+            void deallocate(pointer ptr, size_type size) {
+                CharPtr* p1 = reinterpret_cast<CharPtr*>(ptr) - 1;
+                CharPtr p2 = *p1;
+                p1->~CharPtr();
+                CharAlloc a(base());
+                a.deallocate(p2, size * sizeof(value_type) +
+                    MaxAlign::value + sizeof p2);
+            }
+        };
+
+        template<class A1, class A2, std::size_t Alignment>
+        inline bool operator==(const aligned_allocator_adaptor<A1,
+            Alignment>& a, const aligned_allocator_adaptor<A2,
+            Alignment>& b) BOOST_NOEXCEPT
+        {
+            return a.base() == b.base();
+        }
+
+        template<class A1, class A2, std::size_t Alignment>
+        inline bool operator!=(const aligned_allocator_adaptor<A1,
+            Alignment>& a, const aligned_allocator_adaptor<A2,
+            Alignment>& b) BOOST_NOEXCEPT
+        {
+            return !(a == b);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_allocator_adaptor_forward.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,21 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_FORWARD_HPP
+#define BOOST_ALIGN_ALIGNED_ALLOCATOR_ADAPTOR_FORWARD_HPP
+
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        template<class Allocator, std::size_t Alignment = 1>
+        class aligned_allocator_adaptor;
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_allocator_forward.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,21 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_ALLOCATOR_FORWARD_HPP
+#define BOOST_ALIGN_ALIGNED_ALLOCATOR_FORWARD_HPP
+
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        template<class T, std::size_t Alignment = 1>
+        class aligned_allocator;
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_delete.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_DELETE_HPP
+#define BOOST_ALIGN_ALIGNED_DELETE_HPP
+
+#include <boost/config.hpp>
+#include <boost/align/aligned_alloc.hpp>
+#include <boost/align/aligned_delete_forward.hpp>
+
+namespace boost {
+    namespace alignment {
+        class aligned_delete {
+        public:
+            template<class T>
+            void operator()(T* ptr) const
+                BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(ptr->~T())) {
+                if (ptr) {
+                    ptr->~T();
+                    alignment::aligned_free(ptr);
+                }
+            }
+        };
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/aligned_delete_forward.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,18 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNED_DELETE_FORWARD_HPP
+#define BOOST_ALIGN_ALIGNED_DELETE_FORWARD_HPP
+
+namespace boost {
+    namespace alignment {
+        class aligned_delete;
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/alignment_of.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNMENT_OF_HPP
+#define BOOST_ALIGN_ALIGNMENT_OF_HPP
+
+#include <boost/config.hpp>
+#include <boost/align/alignment_of_forward.hpp>
+#include <boost/align/detail/remove_traits.hpp>
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+#include <boost/align/detail/alignment_of_cxx11.hpp>
+#elif defined(BOOST_MSVC)
+#include <boost/align/detail/alignment_of_msvc.hpp>
+#elif defined(BOOST_CLANG)
+#include <boost/align/detail/alignment_of_clang.hpp>
+#elif defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+#include <boost/align/detail/alignment_of_gcc.hpp>
+#elif defined(__CODEGEARC__)
+#include <boost/align/detail/alignment_of_codegear.hpp>
+#elif defined(__GNUC__) && defined(__unix__) && !defined(__LP64__)
+#include <boost/align/detail/alignment_of.hpp>
+#elif __GNUC__ > 4
+#include <boost/align/detail/alignment_of_gcc.hpp>
+#elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)
+#include <boost/align/detail/alignment_of_gcc.hpp>
+#else
+#include <boost/align/detail/alignment_of.hpp>
+#endif
+
+namespace boost {
+    namespace alignment {
+        template<class T>
+        struct alignment_of
+            : detail::alignment_of<typename
+                detail::remove_cv<typename
+                detail::remove_all_extents<typename
+                detail::remove_reference<T>::
+                type>::type>::type>::type {
+        };
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/alignment_of_forward.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_ALIGNMENT_OF_FORWARD_HPP
+#define BOOST_ALIGN_ALIGNMENT_OF_FORWARD_HPP
+
+namespace boost {
+    namespace alignment {
+        template<class T>
+        struct alignment_of;
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/address.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ADDRESS_HPP
+#define BOOST_ALIGN_DETAIL_ADDRESS_HPP
+
+#include <boost/cstdint.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+#if defined(BOOST_HAS_INTPTR_T)
+            typedef boost::uintptr_t address_t;
+#else
+            typedef std::size_t address_t;
+#endif
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/addressof.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ADDRESSOF_HPP
+#define BOOST_ALIGN_DETAIL_ADDRESSOF_HPP
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_ADDRESSOF)
+#include <memory>
+#else
+#include <boost/core/addressof.hpp>
+#endif
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+#if !defined(BOOST_NO_CXX11_ADDRESSOF)
+            using std::addressof;
+#else
+            using boost::addressof;
+#endif
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/align.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGN_HPP
+#define BOOST_ALIGN_DETAIL_ALIGN_HPP
+
+#include <boost/assert.hpp>
+#include <boost/align/detail/address.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        inline void* align(std::size_t alignment, std::size_t size,
+            void*& ptr, std::size_t& space)
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            std::size_t n = detail::address_t(ptr) & (alignment - 1);
+            if (n != 0) {
+                n = alignment - n;
+            }
+            void* p = 0;
+            if (n <= space && size <= space - n) {
+                p = static_cast<char*>(ptr) + n;
+                ptr = p;
+                space -= n;
+            }
+            return p;
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/align_cxx11.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,20 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGN_CXX11_HPP
+#define BOOST_ALIGN_DETAIL_ALIGN_CXX11_HPP
+
+#include <memory>
+
+namespace boost {
+    namespace alignment {
+        using std::align;
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/align.hpp>
+#include <boost/align/alignment_of.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstdlib>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            if (alignment < alignment_of<void*>::value) {
+                alignment = alignment_of<void*>::value;
+            }
+            std::size_t n = size + alignment - 1;
+            void* p1 = 0;
+            void* p2 = std::malloc(n + sizeof p1);
+            if (p2) {
+                p1 = static_cast<char*>(p2) + sizeof p1;
+                (void)align(alignment, size, p1, n);
+                *(static_cast<void**>(p1) - 1) = p2;
+            }
+            return p1;
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            if (ptr) {
+                void* p = *(static_cast<void**>(ptr) - 1);
+                std::free(p);
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_android.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_ANDROID_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_ANDROID_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+#include <malloc.h>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            return ::memalign(alignment, size);
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            ::free(ptr);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_macos.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_MACOS_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_MACOS_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+#include <stdlib.h>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            if (!size) {
+                return 0;
+            }
+            if (alignment < sizeof(void*)) {
+                alignment = sizeof(void*);
+            }
+            void* p;
+            if (::posix_memalign(&p, alignment, size) != 0) {
+                p = 0;
+            }
+            return p;
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            ::free(ptr);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_msvc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_MSVC_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_MSVC_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+#include <malloc.h>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            return ::_aligned_malloc(size, alignment);
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            ::_aligned_free(ptr);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_posix.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_POSIX_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_POSIX_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+#include <stdlib.h>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            if (alignment < sizeof(void*)) {
+                alignment = sizeof(void*);
+            }
+            void* p;
+            if (::posix_memalign(&p, alignment, size) != 0) {
+                p = 0;
+            }
+            return p;
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            ::free(ptr);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/aligned_alloc_sunos.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_SUNOS_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNED_ALLOC_SUNOS_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+#include <stdlib.h>
+
+namespace boost {
+    namespace alignment {
+        inline void* aligned_alloc(std::size_t alignment,
+            std::size_t size) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            return ::memalign(alignment, size);
+        }
+
+        inline void aligned_free(void* ptr)
+            BOOST_NOEXCEPT
+        {
+            ::free(ptr);
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_HPP
+
+#include <boost/align/detail/min_size.hpp>
+#include <boost/align/detail/offset_object.hpp>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct alignment_of
+                : min_size<sizeof(T),
+                    sizeof(offset_object<T>) - sizeof(T)>::type {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of_clang.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,26 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CLANG_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CLANG_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct alignment_of
+                : integral_constant<std::size_t, __alignof(T)> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of_codegear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,26 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CODEGEAR_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CODEGEAR_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct alignment_of
+                : integral_constant<std::size_t, alignof(T)> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of_cxx11.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,22 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CXX11_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_CXX11_HPP
+
+#include <type_traits>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            using std::alignment_of;
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of_gcc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,26 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_GCC_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_GCC_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct alignment_of
+                : integral_constant<std::size_t, __alignof__(T)> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/alignment_of_msvc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_ALIGNMENT_OF_MSVC_HPP
+#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_MSVC_HPP
+
+#include <boost/align/detail/min_size.hpp>
+#include <boost/align/detail/offset_object.hpp>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct alignment_of
+                : min_size<sizeof(T),
+                    offsetof(offset_object<T>, object)>::type {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/integral_constant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_INTEGRAL_CONSTANT_HPP
+#define BOOST_ALIGN_DETAIL_INTEGRAL_CONSTANT_HPP
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+#include <type_traits>
+#endif
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+            using std::integral_constant;
+#else
+            template<class T, T Value>
+            struct integral_constant {
+                typedef T value_type;
+                typedef integral_constant<T, Value> type;
+
+#if !defined(BOOST_NO_CXX11_CONSTEXPR)
+                constexpr operator value_type() const {
+                    return Value;
+                }
+
+                static constexpr T value = Value;
+#else
+                enum {
+                    value = Value
+                };
+#endif
+            };
+#endif
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/is_aligned.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_IS_ALIGNED_HPP
+#define BOOST_ALIGN_DETAIL_IS_ALIGNED_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/align/detail/address.hpp>
+#include <boost/align/detail/is_alignment.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        inline bool is_aligned(std::size_t alignment,
+            const void* ptr) BOOST_NOEXCEPT
+        {
+            BOOST_ASSERT(detail::is_alignment(alignment));
+            return (detail::address_t(ptr) & (alignment - 1)) == 0;
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/is_alignment.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_IS_ALIGNMENT_HPP
+#define BOOST_ALIGN_DETAIL_IS_ALIGNMENT_HPP
+
+#include <boost/config.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            BOOST_CONSTEXPR inline bool is_alignment(std::size_t
+                value) BOOST_NOEXCEPT
+            {
+                return (value > 0) && ((value & (value - 1)) == 0);
+            }
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/is_alignment_constant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_IS_ALIGNMENT_CONSTANT_HPP
+#define BOOST_ALIGN_DETAIL_IS_ALIGNMENT_CONSTANT_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<std::size_t N>
+            struct is_alignment_constant
+                : integral_constant<bool,
+                    (N > 0) && ((N & (N - 1)) == 0)> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/max_align.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_MAX_ALIGN_HPP
+#define BOOST_ALIGN_DETAIL_MAX_ALIGN_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<std::size_t A, std::size_t B>
+            struct max_align
+                : integral_constant<std::size_t,
+                    (A > B) ? A : B> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/max_count_of.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_MAX_COUNT_OF_HPP
+#define BOOST_ALIGN_DETAIL_MAX_COUNT_OF_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct max_count_of
+                : integral_constant<std::size_t,
+                    ~static_cast<std::size_t>(0) / sizeof(T)> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/min_size.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_MIN_SIZE_HPP
+#define BOOST_ALIGN_DETAIL_MIN_SIZE_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<std::size_t A, std::size_t B>
+            struct min_size
+                : integral_constant<std::size_t,
+                    (A < B) ? A : B> {
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/offset_object.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_OFFSET_OBJECT_HPP
+#define BOOST_ALIGN_DETAIL_OFFSET_OBJECT_HPP
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+            template<class T>
+            struct offset_object {
+                char offset;
+                T object;
+            };
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/detail/remove_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_REMOVE_TRAITS_HPP
+#define BOOST_ALIGN_DETAIL_REMOVE_TRAITS_HPP
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+#include <type_traits>
+#else
+#include <cstddef>
+#endif
+
+namespace boost {
+    namespace alignment {
+        namespace detail {
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
+            using std::remove_reference;
+            using std::remove_all_extents;
+            using std::remove_cv;
+#else
+            template<class T>
+            struct remove_reference {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_reference<T&> {
+                typedef T type;
+            };
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+            template<class T>
+            struct remove_reference<T&&> {
+                typedef T type;
+            };
+#endif
+
+            template<class T>
+            struct remove_all_extents {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_all_extents<T[]> {
+                typedef typename remove_all_extents<T>::type type;
+            };
+
+            template<class T, std::size_t N>
+            struct remove_all_extents<T[N]> {
+                typedef typename remove_all_extents<T>::type type;
+            };
+
+            template<class T>
+            struct remove_const {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_const<const T> {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_volatile {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_volatile<volatile T> {
+                typedef T type;
+            };
+
+            template<class T>
+            struct remove_cv {
+                typedef typename remove_volatile<typename
+                    remove_const<T>::type>::type type;
+            };
+#endif
+        }
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/align/is_aligned.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,14 @@
+/*
+ (c) 2014 Glen Joseph Fernandes
+ glenjofe at gmail dot com
+
+ Distributed under the Boost Software
+ License, Version 1.0.
+ http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_IS_ALIGNED_HPP
+#define BOOST_ALIGN_IS_ALIGNED_HPP
+
+#include <boost/align/detail/is_aligned.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/archive/detail/helper_collection.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,98 @@
+#ifndef BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP
+#define BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// helper_collection.hpp: archive support for run-time helpers
+
+// (C) Copyright 2002-2008 Robert Ramey and Joaquin M Lopez Munoz
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // NULL
+#include <vector>
+#include <utility>
+#include <memory>
+#include <algorithm>
+
+#include <boost/config.hpp>
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
+
+namespace boost {
+
+namespace archive {
+namespace detail {
+
+class helper_collection
+{
+    helper_collection(const helper_collection&);              // non-copyable
+    helper_collection& operator = (const helper_collection&); // non-copyable
+
+    // note: we dont' actually "share" the function object pointer
+    // we only use shared_ptr to make sure that it get's deleted
+
+    typedef std::pair<
+        const void *,
+        boost::shared_ptr<void>
+    > helper_value_type;
+    template<class T>
+    boost::shared_ptr<void> make_helper_ptr(){
+        // use boost::shared_ptr rather than std::shared_ptr to maintain
+        // c++03 compatibility
+        return boost::make_shared<T>();
+    }
+
+    typedef std::vector<helper_value_type> collection;
+    collection m_collection;
+
+    struct predicate {
+        const void * const m_ti;
+        bool operator()(helper_value_type const &rhs) const {
+            return m_ti == rhs.first;
+        }
+        predicate & operator=(const void * ti); // to suppress warning
+        predicate(const void * ti) :
+            m_ti(ti)
+        {}
+    };
+protected:
+    helper_collection(){}
+    ~helper_collection(){}
+public:
+    template<typename Helper>
+    Helper& get_helper(void * const id = 0) {
+        collection::const_iterator it =
+            std::find_if(
+                m_collection.begin(),
+                m_collection.end(),
+                predicate(id)
+            );
+
+        void * rval = 0;
+        if(it == m_collection.end()){
+            m_collection.push_back(
+                std::make_pair(id, make_helper_ptr<Helper>())
+            );
+            rval = m_collection.back().second.get();
+        }
+        else{
+            rval = it->second.get();
+        }
+        return *static_cast<Helper *>(rval);
+    }
+};
+
+} // namespace detail
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP
--- a/DEPENDENCIES/generic/include/boost/archive/shared_ptr_helper.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
-#ifndef BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
-#define BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
-
-// MS compatible compilers support #pragma once
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// shared_ptr_helper.hpp: serialization for boost shared pointern
-
-// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-//  See http://www.boost.org for updates, documentation, and revision history.
-
-#include <set>
-#include <list>
-#include <utility>
-#include <cstddef> // NULL
-
-#include <boost/config.hpp>
-#include <boost/shared_ptr.hpp>
-
-#include <boost/type_traits/is_polymorphic.hpp>
-#include <boost/serialization/type_info_implementation.hpp>
-#include <boost/serialization/shared_ptr_132.hpp>
-#include <boost/serialization/throw_exception.hpp>
-
-#include <boost/archive/archive_exception.hpp>
-#include <boost/archive/detail/decl.hpp>
-
-#include <boost/archive/detail/abi_prefix.hpp> // must be the last headern
-
-namespace boost_132 {
-    template<class T> class shared_ptr;
-}
-namespace boost {
-    template<class T> class shared_ptr;
-    namespace serialization {
-        class extended_type_info;
-        template<class Archive, class T>
-        inline void load(
-            Archive & ar,
-            boost::shared_ptr< T > &t,
-            const unsigned int file_version
-        );
-    }
-namespace archive{
-namespace detail {
-
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// a common class for holding various types of shared pointers
-
-class shared_ptr_helper {
-    struct collection_type_compare {
-        bool operator()(
-            const shared_ptr<const void> &lhs,
-            const shared_ptr<const void> &rhs
-        )const{
-            return lhs.get() < rhs.get();
-        }
-    };
-    typedef std::set<
-        boost::shared_ptr<const void>,
-        collection_type_compare
-    > collection_type;
-    typedef collection_type::const_iterator iterator_type;
-    // list of shared_pointers create accessable by raw pointer. This
-    // is used to "match up" shared pointers loaded at different
-    // points in the archive. Note, we delay construction until
-    // it is actually used since this is by default included as
-    // a "mix-in" even if shared_ptr isn't used.
-    collection_type * m_pointers;
-
-    struct null_deleter {
-        void operator()(void const *) const {}
-    };
-
-    struct void_deleter {
-        const boost::serialization::extended_type_info * m_eti;
-        void_deleter(const boost::serialization::extended_type_info *eti) :
-            m_eti(eti)
-        {}
-        void operator()(void *vp) const {
-            m_eti->destroy(vp);
-        }
-    };
-
-#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
-public:
-#else
-    template<class Archive, class T>
-    friend inline void boost::serialization::load(
-        Archive & ar,
-        boost::shared_ptr< T > &t,
-        const unsigned int file_version
-    );
-#endif
-
-//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
-    // list of loaded pointers.  This is used to be sure that the pointers
-    // stay around long enough to be "matched" with other pointers loaded
-    // by the same archive.  These are created with a "null_deleter" so that
-    // when this list is destroyed - the underlaying raw pointers are not
-    // destroyed.  This has to be done because the pointers are also held by
-    // new system which is disjoint from this set.  This is implemented
-    // by a change in load_construct_data below.  It makes this file suitable
-    // only for loading pointers into a 1.33 or later boost system.
-    std::list<boost_132::shared_ptr<const void> > * m_pointers_132;
-//  #endif
-
-    // returns pointer to object and an indicator whether this is a
-    // new entry (true) or a previous one (false)
-    BOOST_ARCHIVE_DECL(shared_ptr<void>) 
-    get_od(
-        const void * od,
-        const boost::serialization::extended_type_info * true_type, 
-        const boost::serialization::extended_type_info * this_type
-    );
-
-    BOOST_ARCHIVE_DECL(void)
-    append(const boost::shared_ptr<const void> &);
-
-    template<class T>
-    struct non_polymorphic {
-        static const boost::serialization::extended_type_info * 
-        get_object_identifier(T &){
-            return & boost::serialization::singleton<
-                BOOST_DEDUCED_TYPENAME 
-                boost::serialization::type_info_implementation< T >::type
-            >::get_const_instance();
-        }
-    };
-    template<class T>
-    struct polymorphic {
-        static const boost::serialization::extended_type_info * 
-        get_object_identifier(T & t){
-            return boost::serialization::singleton<
-                BOOST_DEDUCED_TYPENAME 
-                boost::serialization::type_info_implementation< T >::type
-            >::get_const_instance().get_derived_extended_type_info(t);
-        }
-    };
-public:
-    template<class T>
-    void reset(shared_ptr< T > & s, T * t){
-        if(NULL == t){
-            s.reset();
-            return;
-        }
-        const boost::serialization::extended_type_info * this_type
-            = & boost::serialization::type_info_implementation< T >::type
-                    ::get_const_instance();
-
-        // get pointer to the most derived object.  This is effectively
-        // the object identifern
-        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
-            is_polymorphic< T >,
-            mpl::identity<polymorphic< T > >,
-            mpl::identity<non_polymorphic< T > >
-        >::type type;
-
-        const boost::serialization::extended_type_info * true_type
-            = type::get_object_identifier(*t);
-
-        // note:if this exception is thrown, be sure that derived pointern
-        // is either registered or exported.
-        if(NULL == true_type)
-            boost::serialization::throw_exception(
-                archive_exception(
-                    archive_exception::unregistered_class,
-                    this_type->get_debug_info()
-                )
-            );
-        shared_ptr<void> r =
-            get_od(
-                static_cast<const void *>(t), 
-                true_type,
-                this_type
-            );
-        if(!r){
-            s.reset(t);
-            const void * od = void_downcast(
-                *true_type,
-                *this_type,
-                static_cast<const void *>(t)
-            );
-            shared_ptr<const void> sp(s, od);
-            append(sp);
-        }
-        else{
-            s = shared_ptr< T >(
-                r,
-                static_cast<T *>(r.get())
-            );
-        }
-    }
-
-//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
-    BOOST_ARCHIVE_DECL(void)
-    append(const boost_132::shared_ptr<const void> & t);
-//  #endif
-public:
-    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
-    shared_ptr_helper();
-    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
-    ~shared_ptr_helper();
-};
-
-} // namespace detail
-} // namespace archive
-} // namespace boost
-
-#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
-
-#endif // BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/asio/detail/win_iocp_socket_connect_op.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,126 @@
+//
+// detail/win_iocp_socket_connect_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP
+#define BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include <boost/asio/detail/config.hpp>
+
+#if defined(BOOST_ASIO_HAS_IOCP)
+
+#include <boost/asio/detail/addressof.hpp>
+#include <boost/asio/detail/bind_handler.hpp>
+#include <boost/asio/detail/fenced_block.hpp>
+#include <boost/asio/detail/handler_alloc_helpers.hpp>
+#include <boost/asio/detail/handler_invoke_helpers.hpp>
+#include <boost/asio/detail/reactor_op.hpp>
+#include <boost/asio/detail/socket_ops.hpp>
+#include <boost/asio/error.hpp>
+
+#include <boost/asio/detail/push_options.hpp>
+
+namespace boost {
+namespace asio {
+namespace detail {
+
+class win_iocp_socket_connect_op_base : public reactor_op
+{
+public:
+  win_iocp_socket_connect_op_base(socket_type socket, func_type complete_func)
+    : reactor_op(&win_iocp_socket_connect_op_base::do_perform, complete_func),
+      socket_(socket),
+      connect_ex_(false)
+  {
+  }
+
+  static bool do_perform(reactor_op* base)
+  {
+    win_iocp_socket_connect_op_base* o(
+        static_cast<win_iocp_socket_connect_op_base*>(base));
+
+    return socket_ops::non_blocking_connect(o->socket_, o->ec_);
+  }
+
+  socket_type socket_;
+  bool connect_ex_;
+};
+
+template <typename Handler>
+class win_iocp_socket_connect_op : public win_iocp_socket_connect_op_base
+{
+public:
+  BOOST_ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_connect_op);
+
+  win_iocp_socket_connect_op(socket_type socket, Handler& handler)
+    : win_iocp_socket_connect_op_base(socket,
+        &win_iocp_socket_connect_op::do_complete),
+      handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler))
+  {
+  }
+
+  static void do_complete(io_service_impl* owner, operation* base,
+      const boost::system::error_code& result_ec,
+      std::size_t /*bytes_transferred*/)
+  {
+    boost::system::error_code ec(result_ec);
+
+    // Take ownership of the operation object.
+    win_iocp_socket_connect_op* o(
+        static_cast<win_iocp_socket_connect_op*>(base));
+    ptr p = { boost::asio::detail::addressof(o->handler_), o, o };
+
+    if (owner)
+    {
+      if (o->connect_ex_)
+        socket_ops::complete_iocp_connect(o->socket_, ec);
+      else
+        ec = o->ec_;
+    }
+
+    BOOST_ASIO_HANDLER_COMPLETION((o));
+
+    // Make a copy of the handler so that the memory can be deallocated before
+    // the upcall is made. Even if we're not about to make an upcall, a
+    // sub-object of the handler may be the true owner of the memory associated
+    // with the handler. Consequently, a local copy of the handler is required
+    // to ensure that any owning sub-object remains valid until after we have
+    // deallocated the memory here.
+    detail::binder1<Handler, boost::system::error_code>
+      handler(o->handler_, ec);
+    p.h = boost::asio::detail::addressof(handler.handler_);
+    p.reset();
+
+    // Make the upcall if required.
+    if (owner)
+    {
+      fenced_block b(fenced_block::half);
+      BOOST_ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
+      boost_asio_handler_invoke_helpers::invoke(handler, handler.handler_);
+      BOOST_ASIO_HANDLER_INVOCATION_END;
+    }
+  }
+
+private:
+  Handler handler_;
+};
+
+} // namespace detail
+} // namespace asio
+} // namespace boost
+
+#include <boost/asio/detail/pop_options.hpp>
+
+#endif // defined(BOOST_ASIO_HAS_IOCP)
+
+#endif // BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/atomic_flag.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2011 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/atomic_flag.hpp
+ *
+ * This header contains definition of \c atomic_flag.
+ */
+
+#ifndef BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
+#define BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
+
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/operations.hpp>
+#include <boost/atomic/detail/atomic_flag.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+using atomics::atomic_flag;
+
+} // namespace boost
+
+#endif // BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/capabilities.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,161 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/capabilities.hpp
+ *
+ * This header defines feature capabilities macros.
+ */
+
+#ifndef BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
+#define BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/platform.hpp>
+#include <boost/atomic/detail/int_sizes.hpp>
+
+#if !defined(BOOST_ATOMIC_EMULATED)
+#include BOOST_ATOMIC_DETAIL_HEADER(boost/atomic/detail/caps_)
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifndef BOOST_ATOMIC_INT8_LOCK_FREE
+#define BOOST_ATOMIC_INT8_LOCK_FREE 0
+#endif
+
+#ifndef BOOST_ATOMIC_INT16_LOCK_FREE
+#define BOOST_ATOMIC_INT16_LOCK_FREE 0
+#endif
+
+#ifndef BOOST_ATOMIC_INT32_LOCK_FREE
+#define BOOST_ATOMIC_INT32_LOCK_FREE 0
+#endif
+
+#ifndef BOOST_ATOMIC_INT64_LOCK_FREE
+#define BOOST_ATOMIC_INT64_LOCK_FREE 0
+#endif
+
+#ifndef BOOST_ATOMIC_INT128_LOCK_FREE
+#define BOOST_ATOMIC_INT128_LOCK_FREE 0
+#endif
+
+
+#ifndef BOOST_ATOMIC_CHAR_LOCK_FREE
+#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#endif
+
+#ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE
+#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#endif
+
+#ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE
+#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#endif
+
+#ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE
+#if BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#else
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
+#endif
+#endif
+
+#ifndef BOOST_ATOMIC_SHORT_LOCK_FREE
+#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1
+#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2
+#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4
+#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8
+#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#else
+#define BOOST_ATOMIC_SHORT_LOCK_FREE 0
+#endif
+#endif
+
+#ifndef BOOST_ATOMIC_INT_LOCK_FREE
+#if BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1
+#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2
+#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4
+#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8
+#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#else
+#define BOOST_ATOMIC_INT_LOCK_FREE 0
+#endif
+#endif
+
+#ifndef BOOST_ATOMIC_LONG_LOCK_FREE
+#if BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1
+#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2
+#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4
+#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8
+#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#else
+#define BOOST_ATOMIC_LONG_LOCK_FREE 0
+#endif
+#endif
+
+#ifndef BOOST_ATOMIC_LLONG_LOCK_FREE
+#if BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1
+#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2
+#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4
+#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8
+#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#else
+#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
+#endif
+#endif
+
+#ifndef BOOST_ATOMIC_POINTER_LOCK_FREE
+#if (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 8
+#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#elif (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 4
+#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#else
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 0
+#endif
+#endif
+
+#define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
+
+#ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
+// We store bools in 1-byte storage in all backends
+#define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#endif
+
+#ifndef BOOST_ATOMIC_FLAG_LOCK_FREE
+#define BOOST_ATOMIC_FLAG_LOCK_FREE BOOST_ATOMIC_BOOL_LOCK_FREE
+#endif
+
+#ifndef BOOST_ATOMIC_THREAD_FENCE
+#define BOOST_ATOMIC_THREAD_FENCE 0
+#endif
+
+#ifndef BOOST_ATOMIC_SIGNAL_FENCE
+#define BOOST_ATOMIC_SIGNAL_FENCE 0
+#endif
+
+#endif // BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/atomic_flag.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/atomic_flag.hpp
+ *
+ * This header contains interface definition of \c atomic_flag.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
+
+#include <boost/assert.hpp>
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/operations_lockfree.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+/*
+ * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,
+ *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.
+ */
+
+namespace boost {
+namespace atomics {
+
+#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+#define BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT
+#else
+#define BOOST_ATOMIC_FLAG_INIT {}
+#endif
+
+struct atomic_flag
+{
+    typedef atomics::detail::operations< 1u, false > operations;
+    typedef operations::storage_type storage_type;
+
+    storage_type m_storage;
+
+    BOOST_FORCEINLINE BOOST_CONSTEXPR atomic_flag() BOOST_NOEXCEPT : m_storage(0)
+    {
+    }
+
+    BOOST_FORCEINLINE bool test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return operations::test_and_set(m_storage, order);
+    }
+
+    BOOST_FORCEINLINE void clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+        operations::clear(m_storage, order);
+    }
+
+    BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&))
+    BOOST_DELETED_FUNCTION(atomic_flag& operator= (atomic_flag const&))
+};
+
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/atomic_template.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,774 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2011 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/atomic_template.hpp
+ *
+ * This header contains interface definition of \c atomic template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
+
+#include <cstddef>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/casts.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+// 'boost::atomics::atomic<T>' : multiple assignment operators specified
+#pragma warning(disable: 4522)
+#endif
+
+/*
+ * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,
+ *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.
+ */
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+BOOST_FORCEINLINE BOOST_CONSTEXPR memory_order deduce_failure_order(memory_order order) BOOST_NOEXCEPT
+{
+    return order == memory_order_acq_rel ? memory_order_acquire : (order == memory_order_release ? memory_order_relaxed : order);
+}
+
+BOOST_FORCEINLINE BOOST_CONSTEXPR bool cas_failure_order_must_not_be_stronger_than_success_order(memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+{
+    // 15 == (memory_order_seq_cst | memory_order_consume), see memory_order.hpp
+    // Given the enum values we can test the strength of memory order requirements with this single condition.
+    return (failure_order & 15u) <= (success_order & 15u);
+}
+
+template< typename T, bool IsInt = boost::is_integral< T >::value >
+struct classify
+{
+    typedef void type;
+};
+
+template< typename T >
+struct classify< T, true > { typedef int type; };
+
+template< typename T >
+struct classify< T*, false > { typedef void* type; };
+
+template< typename T, typename Kind >
+class base_atomic;
+
+//! Implementation for integers
+template< typename T >
+class base_atomic< T, int >
+{
+private:
+    typedef T value_type;
+    typedef T difference_type;
+    typedef atomics::detail::operations< storage_size_of< value_type >::value, boost::is_signed< T >::value > operations;
+
+protected:
+    typedef value_type value_arg_type;
+
+public:
+    typedef typename operations::storage_type storage_type;
+
+protected:
+    storage_type m_storage;
+
+public:
+    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
+    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}
+
+    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_consume);
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        operations::store(m_storage, static_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_release);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        return static_cast< value_type >(operations::load(m_storage, order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::exchange(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = static_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+        expected = static_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = static_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+        expected = static_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::fetch_and(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::fetch_or(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return static_cast< value_type >(operations::fetch_xor(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
+    {
+        return operations::is_lock_free(m_storage);
+    }
+
+    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(1) + 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(1) - 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(v) + v;
+    }
+
+    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(v) - v;
+    }
+
+    BOOST_FORCEINLINE value_type operator&=(value_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_and(v) & v;
+    }
+
+    BOOST_FORCEINLINE value_type operator|=(value_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_or(v) | v;
+    }
+
+    BOOST_FORCEINLINE value_type operator^=(value_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_xor(v) ^ v;
+    }
+
+    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
+    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
+};
+
+//! Implementation for bool
+template< >
+class base_atomic< bool, int >
+{
+private:
+    typedef bool value_type;
+    typedef atomics::detail::operations< 1u, false > operations;
+
+protected:
+    typedef value_type value_arg_type;
+
+public:
+    typedef operations::storage_type storage_type;
+
+protected:
+    storage_type m_storage;
+
+public:
+    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
+    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}
+
+    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_consume);
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        operations::store(m_storage, static_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_release);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        return !!operations::load(m_storage, order);
+    }
+
+    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return !!operations::exchange(m_storage, static_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = static_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+        expected = !!old_value;
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = static_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+        expected = !!old_value;
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
+    {
+        return operations::is_lock_free(m_storage);
+    }
+
+    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
+    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
+};
+
+
+//! Implementation for user-defined types, such as structs and enums
+template< typename T >
+class base_atomic< T, void >
+{
+private:
+    typedef T value_type;
+    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
+
+protected:
+    typedef value_type const& value_arg_type;
+
+public:
+    typedef typename operations::storage_type storage_type;
+
+protected:
+    storage_type m_storage;
+
+public:
+    BOOST_FORCEINLINE explicit base_atomic(value_type const& v = value_type()) BOOST_NOEXCEPT : m_storage(atomics::detail::memcpy_cast< storage_type >(v))
+    {
+    }
+
+    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_consume);
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        operations::store(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_release);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        return atomics::detail::memcpy_cast< value_type >(operations::load(m_storage, order));
+    }
+
+    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::memcpy_cast< value_type >(operations::exchange(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::memcpy_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::memcpy_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
+    {
+        return operations::is_lock_free(m_storage);
+    }
+
+    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
+    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
+};
+
+
+//! Implementation for pointers
+template< typename T >
+class base_atomic< T*, void* >
+{
+private:
+    typedef T* value_type;
+    typedef std::ptrdiff_t difference_type;
+    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
+
+protected:
+    typedef value_type value_arg_type;
+
+public:
+    typedef typename operations::storage_type storage_type;
+
+protected:
+    storage_type m_storage;
+
+public:
+    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
+    BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
+    {
+    }
+
+    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_consume);
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_release);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
+    }
+
+    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::union_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::union_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
+    {
+        return operations::is_lock_free(m_storage);
+    }
+
+    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(1) + 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(1) - 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(v) + v;
+    }
+
+    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(v) - v;
+    }
+
+    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
+    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
+};
+
+
+//! Implementation for void pointers
+template< >
+class base_atomic< void*, void* >
+{
+private:
+    typedef void* value_type;
+    typedef std::ptrdiff_t difference_type;
+    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
+
+protected:
+    typedef value_type value_arg_type;
+
+public:
+    typedef operations::storage_type storage_type;
+
+protected:
+    storage_type m_storage;
+
+public:
+    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
+    BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
+    {
+    }
+
+    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_consume);
+        BOOST_ASSERT(order != memory_order_acquire);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
+    }
+
+    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(order != memory_order_release);
+        BOOST_ASSERT(order != memory_order_acq_rel);
+
+        return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::union_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT(failure_order != memory_order_release);
+        BOOST_ASSERT(failure_order != memory_order_acq_rel);
+        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
+
+        storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
+        const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
+        expected = atomics::detail::union_cast< value_type >(old_value);
+        return res;
+    }
+
+    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
+    {
+        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
+    }
+
+    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
+    {
+        return operations::is_lock_free(m_storage);
+    }
+
+    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_add(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
+    {
+        return (char*)fetch_add(1) + 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
+    {
+        return fetch_sub(1);
+    }
+
+    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
+    {
+        return (char*)fetch_sub(1) - 1;
+    }
+
+    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return (char*)fetch_add(v) + v;
+    }
+
+    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
+    {
+        return (char*)fetch_sub(v) - v;
+    }
+
+    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
+    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
+};
+
+} // namespace detail
+
+template< typename T >
+class atomic :
+    public atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type >
+{
+private:
+    typedef T value_type;
+    typedef atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type > base_type;
+    typedef typename base_type::value_arg_type value_arg_type;
+
+public:
+    typedef typename base_type::storage_type storage_type;
+
+public:
+    BOOST_DEFAULTED_FUNCTION(atomic(), BOOST_NOEXCEPT {})
+
+    // NOTE: The constructor is made explicit because gcc 4.7 complains that
+    //       operator=(value_arg_type) is considered ambiguous with operator=(atomic const&)
+    //       in assignment expressions, even though conversion to atomic<> is less preferred
+    //       than conversion to value_arg_type.
+    BOOST_FORCEINLINE explicit BOOST_CONSTEXPR atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(v) {}
+
+    BOOST_FORCEINLINE value_type operator= (value_arg_type v) volatile BOOST_NOEXCEPT
+    {
+        this->store(v);
+        return v;
+    }
+
+    BOOST_FORCEINLINE operator value_type() volatile const BOOST_NOEXCEPT
+    {
+        return this->load();
+    }
+
+    BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return this->m_storage; }
+    BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return this->m_storage; }
+    BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return this->m_storage; }
+    BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return this->m_storage; }
+
+    BOOST_DELETED_FUNCTION(atomic(atomic const&))
+    BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&))
+    BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&) volatile)
+};
+
+typedef atomic< char > atomic_char;
+typedef atomic< unsigned char > atomic_uchar;
+typedef atomic< signed char > atomic_schar;
+typedef atomic< uint8_t > atomic_uint8_t;
+typedef atomic< int8_t > atomic_int8_t;
+typedef atomic< unsigned short > atomic_ushort;
+typedef atomic< short > atomic_short;
+typedef atomic< uint16_t > atomic_uint16_t;
+typedef atomic< int16_t > atomic_int16_t;
+typedef atomic< unsigned int > atomic_uint;
+typedef atomic< int > atomic_int;
+typedef atomic< uint32_t > atomic_uint32_t;
+typedef atomic< int32_t > atomic_int32_t;
+typedef atomic< unsigned long > atomic_ulong;
+typedef atomic< long > atomic_long;
+typedef atomic< uint64_t > atomic_uint64_t;
+typedef atomic< int64_t > atomic_int64_t;
+#ifdef BOOST_HAS_LONG_LONG
+typedef atomic< boost::ulong_long_type > atomic_ullong;
+typedef atomic< boost::long_long_type > atomic_llong;
+#endif
+typedef atomic< void* > atomic_address;
+typedef atomic< bool > atomic_bool;
+typedef atomic< wchar_t > atomic_wchar_t;
+#if !defined(BOOST_NO_CXX11_CHAR16_T)
+typedef atomic< char16_t > atomic_char16_t;
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T)
+typedef atomic< char32_t > atomic_char32_t;
+#endif
+
+typedef atomic< int_least8_t > atomic_int_least8_t;
+typedef atomic< uint_least8_t > atomic_uint_least8_t;
+typedef atomic< int_least16_t > atomic_int_least16_t;
+typedef atomic< uint_least16_t > atomic_uint_least16_t;
+typedef atomic< int_least32_t > atomic_int_least32_t;
+typedef atomic< uint_least32_t > atomic_uint_least32_t;
+typedef atomic< int_least64_t > atomic_int_least64_t;
+typedef atomic< uint_least64_t > atomic_uint_least64_t;
+typedef atomic< int_fast8_t > atomic_int_fast8_t;
+typedef atomic< uint_fast8_t > atomic_uint_fast8_t;
+typedef atomic< int_fast16_t > atomic_int_fast16_t;
+typedef atomic< uint_fast16_t > atomic_uint_fast16_t;
+typedef atomic< int_fast32_t > atomic_int_fast32_t;
+typedef atomic< uint_fast32_t > atomic_uint_fast32_t;
+typedef atomic< int_fast64_t > atomic_int_fast64_t;
+typedef atomic< uint_fast64_t > atomic_uint_fast64_t;
+typedef atomic< intmax_t > atomic_intmax_t;
+typedef atomic< uintmax_t > atomic_uintmax_t;
+
+typedef atomic< std::size_t > atomic_size_t;
+typedef atomic< std::ptrdiff_t > atomic_ptrdiff_t;
+
+#if defined(BOOST_HAS_INTPTR_T)
+typedef atomic< intptr_t > atomic_intptr_t;
+typedef atomic< uintptr_t > atomic_uintptr_t;
+#endif
+
+} // namespace atomics
+} // namespace boost
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/base.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,605 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_BASE_HPP
-#define BOOST_ATOMIC_DETAIL_BASE_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-// Base class definition and fallback implementation.
-// To be overridden (through partial specialization) by
-// platform implementations.
-
-#include <string.h>
-
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/lockpool.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-#define BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
-    bool \
-    compare_exchange_strong( \
-        value_type & expected, \
-        value_type desired, \
-        memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
-    { \
-        return compare_exchange_strong(expected, desired, order, calculate_failure_order(order)); \
-    } \
-     \
-    bool \
-    compare_exchange_weak( \
-        value_type & expected, \
-        value_type desired, \
-        memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
-    { \
-        return compare_exchange_weak(expected, desired, order, calculate_failure_order(order)); \
-    } \
-
-#define BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
-    value_type \
-    operator++(int) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_add(1); \
-    } \
-     \
-    value_type \
-    operator++(void) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_add(1) + 1; \
-    } \
-     \
-    value_type \
-    operator--(int) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_sub(1); \
-    } \
-     \
-    value_type \
-    operator--(void) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_sub(1) - 1; \
-    } \
-     \
-    value_type \
-    operator+=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_add(v) + v; \
-    } \
-     \
-    value_type \
-    operator-=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_sub(v) - v; \
-    } \
-
-#define BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
-    value_type \
-    operator++(int) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_add(1); \
-    } \
-     \
-    value_type \
-    operator++(void) volatile BOOST_NOEXCEPT \
-    { \
-        return (char*)fetch_add(1) + 1;         \
-    } \
-     \
-    value_type \
-    operator--(int) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_sub(1); \
-    } \
-     \
-    value_type \
-    operator--(void) volatile BOOST_NOEXCEPT \
-    { \
-        return (char*)fetch_sub(1) - 1;         \
-    } \
-     \
-    value_type \
-    operator+=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return (char*)fetch_add(v) + v; \
-    } \
-     \
-    value_type \
-    operator-=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return (char*)fetch_sub(v) - v; \
-    } \
-
-#define BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
-    value_type \
-    operator&=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_and(v) & v; \
-    } \
-     \
-    value_type \
-    operator|=(difference_type v) volatile BOOST_NOEXCEPT \
-    { \
-        return fetch_or(v) | v; \
-    } \
-     \
-    value_type \
-    operator^=(difference_type v) volatile BOOST_NOEXCEPT\
-    { \
-        return fetch_xor(v) ^ v; \
-    } \
-
-#define BOOST_ATOMIC_DECLARE_POINTER_OPERATORS \
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
-    BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
-
-#define BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS \
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
-
-#define BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS \
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
-    BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
-    BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-inline memory_order
-calculate_failure_order(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_acq_rel:
-        return memory_order_acquire;
-    case memory_order_release:
-        return memory_order_relaxed;
-    default:
-        return order;
-    }
-}
-
-template<typename T, typename C, unsigned int Size, bool Sign>
-class base_atomic
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef lockpool::scoped_lock guard_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(v)
-    {}
-
-    void
-    store(value_type const& v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        char * storage = storage_ptr();
-        guard_type guard(storage);
-
-        memcpy(storage, &v, sizeof(value_type));
-    }
-
-    value_type
-    load(memory_order /*order*/ = memory_order_seq_cst) volatile const BOOST_NOEXCEPT
-    {
-        char * storage = storage_ptr();
-        guard_type guard(storage);
-
-        value_type v;
-        memcpy(&v, storage, sizeof(value_type));
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order /*success_order*/,
-        memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
-    {
-        char * storage = storage_ptr();
-        guard_type guard(storage);
-
-        if (memcmp(storage, &expected, sizeof(value_type)) == 0) {
-            memcpy(storage, &desired, sizeof(value_type));
-            return true;
-        } else {
-            memcpy(&expected, storage, sizeof(value_type));
-            return false;
-        }
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order /*order*/=memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        char * storage = storage_ptr();
-        guard_type guard(storage);
-
-        value_type tmp;
-        memcpy(&tmp, storage, sizeof(value_type));
-
-        memcpy(storage, &v, sizeof(value_type));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return false;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    char * storage_ptr() volatile const BOOST_NOEXCEPT
-    {
-        return const_cast<char *>(&reinterpret_cast<char const volatile &>(v_));
-    }
-
-    T v_;
-};
-
-template<typename T, unsigned int Size, bool Sign>
-class base_atomic<T, int, Size, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef lockpool::scoped_lock guard_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        v_ = v;
-    }
-
-    value_type
-    load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type v = const_cast<const volatile value_type &>(v_);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ = v;
-        return old;
-    }
-
-    bool
-    compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order /*success_order*/,
-        memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        if (v_ == expected) {
-            v_ = desired;
-            return true;
-        } else {
-            expected = v_;
-            return false;
-        }
-    }
-
-    bool
-    compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ += v;
-        return old;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ -= v;
-        return old;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ &= v;
-        return old;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ |= v;
-        return old;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ ^= v;
-        return old;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return false;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, unsigned int Size, bool Sign>
-class base_atomic<T *, void *, Size, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef lockpool::scoped_lock guard_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-        v_ = v;
-    }
-
-    value_type
-    load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type v = const_cast<const volatile value_type &>(v_);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ = v;
-        return old;
-    }
-
-    bool
-    compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order /*success_order*/,
-        memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        if (v_ == expected) {
-            v_ = desired;
-            return true;
-        } else {
-            expected = v_;
-            return false;
-        }
-    }
-
-    bool
-    compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ += v;
-        return old;
-    }
-
-    value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ -= v;
-        return old;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return false;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<unsigned int Size, bool Sign>
-class base_atomic<void *, void *, Size, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-    typedef lockpool::scoped_lock guard_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-        v_ = v;
-    }
-
-    value_type
-    load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type v = const_cast<const volatile value_type &>(v_);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        v_ = v;
-        return old;
-    }
-
-    bool
-    compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order /*success_order*/,
-        memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        if (v_ == expected) {
-            v_ = desired;
-            return true;
-        } else {
-            expected = v_;
-            return false;
-        }
-    }
-
-    bool
-    compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return false;
-    }
-
-    value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        char * cv = reinterpret_cast<char*>(old);
-        cv += v;
-        v_ = cv;
-        return old;
-    }
-
-    value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
-    {
-        guard_type guard(const_cast<value_type *>(&v_));
-
-        value_type old = v_;
-        char * cv = reinterpret_cast<char*>(old);
-        cv -= v;
-        v_ = cv;
-        return old;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-}
-}
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_alpha.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,34 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_alpha.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2009 Phil Endecott
+ * Copyright (c) 2013 Tim Blechmann
+ * ARM Code by Phil Endecott, based on other architectures.
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_arm.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !(defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__))
+// ARMv7 and later have dmb instruction
+#define BOOST_ATOMIC_DETAIL_ARM_HAS_DMB 1
+#endif
+
+#if !(defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6Z__))
+// ARMv6k and ARMv7 have 8 and 16 ldrex/strex variants
+#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXB_STREXB 1
+#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXH_STREXH 1
+#if !(((defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__)) && defined(__thumb__)) || defined(__ARM_ARCH_7M__))
+// ARMv6k and ARMv7 except ARMv7-M have 64-bit ldrex/strex variants.
+// Unfortunately, GCC (at least 4.7.3 on Ubuntu) does not allocate register pairs properly when targeting ARMv6k Thumb,
+// which is required for ldrexd/strexd instructions, so we disable 64-bit support. When targeting ARMv6k ARM
+// or ARMv7 (both ARM and Thumb 2) it works as expected.
+#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD 1
+#endif
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#endif
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_atomic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,134 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_atomic.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/int_sizes.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1
+#endif
+
+#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
+#define BOOST_ATOMIC_INT128_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_INT128_LOCK_FREE 0
+#endif
+
+#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
+#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
+#endif
+
+#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
+#define BOOST_ATOMIC_LONG_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
+#endif
+
+#if __GCC_ATOMIC_INT_LOCK_FREE == 2
+#define BOOST_ATOMIC_INT_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
+#endif
+
+#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
+#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
+#endif
+
+#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
+#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
+#endif
+
+#if __GCC_ATOMIC_POINTER_LOCK_FREE == 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+#else
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 0
+#endif
+
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE BOOST_ATOMIC_CHAR_LOCK_FREE
+
+#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
+#else
+#define BOOST_ATOMIC_INT16_LOCK_FREE 0
+#endif
+
+#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4
+#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4
+#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4
+#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4
+#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
+#else
+#define BOOST_ATOMIC_INT32_LOCK_FREE 0
+#endif
+
+#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8
+#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8
+#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8
+#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8
+#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
+#else
+#define BOOST_ATOMIC_INT64_LOCK_FREE 0
+#endif
+
+
+#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+#else
+#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
+#endif
+
+#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
+#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_ppc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,36 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_ppc.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#if defined(__powerpc64__)
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#endif
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_sparc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,34 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2010 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_sparc.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_sync.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2011 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_sync.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1
+#endif
+
+#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
+#endif
+
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#endif
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#endif
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#endif
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
+    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#endif
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_INT128_LOCK_FREE 2
+#endif
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_gcc_x86.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2013 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_gcc_x86.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__i386__) &&\
+    (\
+        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) ||\
+        defined(__i586__) || defined(__i686__) || defined(__pentium4__) || defined(__nocona__) || defined(__core2__) || defined(__corei7__) ||\
+        defined(__k6__) || defined(__athlon__) || defined(__k8__) || defined(__amdfam10__) || defined(__bdver1__) || defined(__bdver2__) || defined(__bdver3__) || defined(__btver1__) || defined(__btver2__)\
+    )
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1
+#endif
+
+#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#if defined(__x86_64__) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#endif
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
+#define BOOST_ATOMIC_INT128_LOCK_FREE 2
+#endif
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_linux_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009, 2011 Helge Bahmann
+ * Copyright (c) 2009 Phil Endecott
+ * Copyright (c) 2013 Tim Blechmann
+ * Linux-specific code by Phil Endecott
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_linux_arm.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_msvc_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,34 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2012 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_msvc_arm.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_msvc_x86.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2012 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_msvc_x86.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(_M_IX86) && _M_IX86 >= 500
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1
+#endif
+
+#if _MSC_VER >= 1500 && defined(_M_AMD64) && !defined(BOOST_ATOMIC_NO_CMPXCHG16B)
+#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+
+#if defined(_M_AMD64) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+#define BOOST_ATOMIC_INT64_LOCK_FREE 2
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
+#define BOOST_ATOMIC_INT128_LOCK_FREE 2
+#endif
+
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/caps_windows.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2012 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/caps_windows.hpp
+ *
+ * This header defines feature capabilities macros
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_INT8_LOCK_FREE 2
+#define BOOST_ATOMIC_INT16_LOCK_FREE 2
+#define BOOST_ATOMIC_INT32_LOCK_FREE 2
+#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+
+#define BOOST_ATOMIC_THREAD_FENCE 2
+#define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+#endif // BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/cas128strong.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_CAS128STRONG_HPP
-#define BOOST_ATOMIC_DETAIL_CAS128STRONG_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann, Andrey Semashev
-
-// Build 128-bit atomic operation on integers/UDTs from platform_cmpxchg128_strong
-// primitive. It is assumed that 128-bit loads/stores are not
-// atomic, so they are implemented through platform_load128/platform_store128.
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 16, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        platform_store128(v, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = platform_load128(&v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg128_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* generic types */
-
-#if defined(BOOST_HAS_INT128)
-
-typedef boost::uint128_type storage128_type;
-
-#else // defined(BOOST_HAS_INT128)
-
-struct BOOST_ALIGNMENT(16) storage128_type
-{
-    uint64_t data[2];
-};
-
-inline bool operator== (storage128_type const& left, storage128_type const& right)
-{
-    return left.data[0] == right.data[0] && left.data[1] == right.data[1];
-}
-inline bool operator!= (storage128_type const& left, storage128_type const& right)
-{
-    return !(left == right);
-}
-
-#endif // defined(BOOST_HAS_INT128)
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 16, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef storage128_type storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& value, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type value_s = 0;
-        memcpy(&value_s, &value, sizeof(value_type));
-        platform_fence_before_store(order);
-        platform_store128(value_s, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type value_s = platform_load128(&v_);
-        platform_fence_after_load(order);
-        value_type value;
-        memcpy(&value, &value_s, sizeof(value_type));
-        return value;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-        bool success = platform_cmpxchg128_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/cas32strong.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,939 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_CAS32STRONG_HPP
-#define BOOST_ATOMIC_DETAIL_CAS32STRONG_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-
-
-// Build 8-, 16- and 32-bit atomic operations from
-// a platform_cmpxchg32_strong primitive.
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        storage_type expected_s = (storage_type) expected;
-        storage_type desired_s = (storage_type) desired;
-
-        bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            expected = (value_type) expected_s;
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        storage_type expected_s = (storage_type) expected;
-        storage_type desired_s = (storage_type) desired;
-
-        bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            expected = (value_type) expected_s;
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* pointer types */
-
-template<bool Sign>
-class base_atomic<void *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef void * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* generic types */
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) ) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) ) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) ) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) ) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-        bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) ) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) ) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-        bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-        bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/cas32weak.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1017 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
-#define BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        storage_type expected_s = (storage_type) expected;
-        storage_type desired_s = (storage_type) desired;
-
-        bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            expected = (value_type) expected_s;
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        storage_type expected_s = (storage_type) expected;
-        storage_type desired_s = (storage_type) desired;
-
-        bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            expected = (value_type) expected_s;
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* pointer types */
-
-template<bool Sign>
-class base_atomic<void *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef void * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* generic types */
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before_store(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        while (true)
-        {
-            value_type tmp = expected;
-            if (compare_exchange_weak(tmp, desired, success_order, failure_order))
-                return true;
-            if (tmp != expected)
-            {
-                expected = tmp;
-                return false;
-            }
-        }
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/cas64strong-ptr.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,247 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_CAS64STRONG_PTR_HPP
-#define BOOST_ATOMIC_DETAIL_CAS64STRONG_PTR_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-
-// Build 64-bit atomic operation on pointers from platform_cmpxchg64_strong
-// primitive. It is assumed that 64-bit loads/stores are not
-// atomic, so they are implemented through platform_load64/platform_store64.
-//
-// The reason for extracting pointer specializations to a separate header is
-// that 64-bit CAS is available on some 32-bit platforms (notably, x86).
-// On these platforms there is no need for 64-bit pointer specializations,
-// since they will never be used.
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* pointer types */
-
-template<bool Sign>
-class base_atomic<void *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef void * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        platform_store64(v, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = platform_load64(&v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg64_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, (char*)original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        platform_store64(v, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = platform_load64(&v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg64_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/cas64strong.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP
-#define BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-
-// Build 64-bit atomic operation on integers/UDTs from platform_cmpxchg64_strong
-// primitive. It is assumed that 64-bit loads/stores are not
-// atomic, so they are implemented through platform_load64/platform_store64.
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before_store(order);
-        platform_store64(v, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = platform_load64(&v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-
-        bool success = platform_cmpxchg64_strong(expected, desired, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-        }
-
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* generic types */
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint64_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& value, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type value_s = 0;
-        memcpy(&value_s, &value, sizeof(value_type));
-        platform_fence_before_store(order);
-        platform_store64(value_s, &v_);
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type value_s = platform_load64(&v_);
-        platform_fence_after_load(order);
-        value_type value;
-        memcpy(&value, &value_s, sizeof(value_type));
-        return value;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original = load(memory_order_relaxed);
-        do {
-        } while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        platform_fence_before(success_order);
-        bool success = platform_cmpxchg64_strong(expected_s, desired_s, &v_);
-
-        if (success) {
-            platform_fence_after(success_order);
-        } else {
-            platform_fence_after(failure_order);
-            memcpy(&expected, &expected_s, sizeof(value_type));
-        }
-
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-}
-}
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/casts.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2013 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/casts.hpp
+ *
+ * This header defines \c union_cast and \c memcpy_cast used to convert between storage and value types
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
+
+#include <cstring>
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< typename To, typename From >
+BOOST_FORCEINLINE To union_cast(From const& from) BOOST_NOEXCEPT
+{
+    union
+    {
+        To as_to;
+        From as_from;
+    }
+    caster = {};
+    caster.as_from = from;
+    return caster.as_to;
+}
+
+template< typename To, typename From >
+BOOST_FORCEINLINE To memcpy_cast(From const& from) BOOST_NOEXCEPT
+{
+    struct
+    {
+        To to;
+    }
+    value = {};
+    std::memcpy
+    (
+        &reinterpret_cast< char& >(value.to),
+        &reinterpret_cast< const char& >(from),
+        (sizeof(From) < sizeof(To) ? sizeof(From) : sizeof(To))
+    );
+    return value.to;
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-alpha.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,368 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_ALPHA_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_ALPHA_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-#include <boost/atomic/detail/builder.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-/*
-  Refer to http://h71000.www7.hp.com/doc/82final/5601/5601pro_004.html
-  (HP OpenVMS systems documentation) and the alpha reference manual.
- */
-
-/*
-    NB: The most natural thing would be to write the increment/decrement
-    operators along the following lines:
-
-    __asm__ __volatile__(
-        "1: ldl_l %0,%1 \n"
-        "addl %0,1,%0 \n"
-        "stl_c %0,%1 \n"
-        "beq %0,1b\n"
-        : "=&b" (tmp)
-        : "m" (value)
-        : "cc"
-    );
-
-    However according to the comments on the HP website and matching
-    comments in the Linux kernel sources this defies branch prediction,
-    as the cpu assumes that backward branches are always taken; so
-    instead copy the trick from the Linux kernel, introduce a forward
-    branch and back again.
-
-    I have, however, had a hard time measuring the difference between
-    the two versions in microbenchmarks -- I am leaving it in nevertheless
-    as it apparently does not hurt either.
-*/
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-inline void fence_before(memory_order order)
-{
-    switch(order) {
-        case memory_order_consume:
-        case memory_order_release:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            __asm__ __volatile__ ("mb" ::: "memory");
-        default:;
-    }
-}
-
-inline void fence_after(memory_order order)
-{
-    switch(order) {
-        case memory_order_acquire:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            __asm__ __volatile__ ("mb" ::: "memory");
-        default:;
-    }
-}
-
-template<>
-inline void platform_atomic_thread_fence(memory_order order)
-{
-    switch(order) {
-        case memory_order_acquire:
-        case memory_order_consume:
-        case memory_order_release:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            __asm__ __volatile__ ("mb" ::: "memory");
-        default:;
-    }
-}
-
-template<typename T>
-class atomic_alpha_32
-{
-public:
-    typedef T integral_type;
-    BOOST_CONSTEXPR atomic_alpha_32(T v) BOOST_NOEXCEPT: i(v) {}
-    atomic_alpha_32() {}
-    T load(memory_order order=memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        T v=*reinterpret_cast<volatile const int *>(&i);
-        fence_after(order);
-        return v;
-    }
-    void store(T v, memory_order order=memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        *reinterpret_cast<volatile int *>(&i)=(int)v;
-    }
-    bool compare_exchange_weak(
-        T &expected,
-        T desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(success_order);
-        int current, success;
-        __asm__ __volatile__(
-            "1: ldl_l %2, %4\n"
-            "cmpeq %2, %0, %3\n"
-            "mov %2, %0\n"
-            "beq %3, 3f\n"
-            "stl_c %1, %4\n"
-            "2:\n"
-
-            ".subsection 2\n"
-            "3: mov %3, %1\n"
-            "br 2b\n"
-            ".previous\n"
-
-            : "+&r" (expected), "+&r" (desired), "=&r"(current), "=&r"(success)
-            : "m" (i)
-            :
-        );
-        if (desired) fence_after(success_order);
-        else fence_after(failure_order);
-        return desired;
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT {return true;}
-protected:
-    inline T fetch_add_var(T c, memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        T original, modified;
-        __asm__ __volatile__(
-            "1: ldl_l %0, %2\n"
-            "addl %0, %3, %1\n"
-            "stl_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i), "r" (c)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-    inline T fetch_inc(memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        int original, modified;
-        __asm__ __volatile__(
-            "1: ldl_l %0, %2\n"
-            "addl %0, 1, %1\n"
-            "stl_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-    inline T fetch_dec(memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        int original, modified;
-        __asm__ __volatile__(
-            "1: ldl_l %0, %2\n"
-            "subl %0, 1, %1\n"
-            "stl_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-private:
-    T i;
-};
-
-template<typename T>
-class atomic_alpha_64
-{
-public:
-    typedef T integral_type;
-    BOOST_CONSTEXPR atomic_alpha_64(T v) BOOST_NOEXCEPT: i(v) {}
-    atomic_alpha_64() {}
-    T load(memory_order order=memory_order_seq_cst) const volatile
-    {
-        T v=*reinterpret_cast<volatile const T *>(&i);
-        fence_after(order);
-        return v;
-    }
-    void store(T v, memory_order order=memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        *reinterpret_cast<volatile T *>(&i)=v;
-    }
-    bool compare_exchange_weak(
-        T &expected,
-        T desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(success_order);
-        int current, success;
-        __asm__ __volatile__(
-            "1: ldq_l %2, %4\n"
-            "cmpeq %2, %0, %3\n"
-            "mov %2, %0\n"
-            "beq %3, 3f\n"
-            "stq_c %1, %4\n"
-            "2:\n"
-
-            ".subsection 2\n"
-            "3: mov %3, %1\n"
-            "br 2b\n"
-            ".previous\n"
-
-            : "+&r" (expected), "+&r" (desired), "=&r"(current), "=&r"(success)
-            : "m" (i)
-            :
-        );
-        if (desired) fence_after(success_order);
-        else fence_after(failure_order);
-        return desired;
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT {return true;}
-protected:
-    inline T fetch_add_var(T c, memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        T original, modified;
-        __asm__ __volatile__(
-            "1: ldq_l %0, %2\n"
-            "addq %0, %3, %1\n"
-            "stq_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i), "r" (c)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-    inline T fetch_inc(memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        T original, modified;
-        __asm__ __volatile__(
-            "1: ldq_l %0, %2\n"
-            "addq %0, 1, %1\n"
-            "stq_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-    inline T fetch_dec(memory_order order) volatile BOOST_NOEXCEPT
-    {
-        fence_before(order);
-        T original, modified;
-        __asm__ __volatile__(
-            "1: ldq_l %0, %2\n"
-            "subq %0, 1, %1\n"
-            "stq_c %1, %2\n"
-            "beq %1, 2f\n"
-
-            ".subsection 2\n"
-            "2: br 1b\n"
-            ".previous\n"
-
-            : "=&r" (original), "=&r" (modified)
-            : "m" (i)
-            :
-        );
-        fence_after(order);
-        return original;
-    }
-private:
-    T i;
-};
-
-template<typename T>
-class platform_atomic_integral<T, 4> :
-    public build_atomic_from_typical<build_exchange<atomic_alpha_32<T> > >
-{
-public:
-    typedef build_atomic_from_typical<build_exchange<atomic_alpha_32<T> > > super;
-    BOOST_CONSTEXPR platform_atomic_integral(T v) BOOST_NOEXCEPT: super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-template<typename T>
-class platform_atomic_integral<T, 8> :
-    public build_atomic_from_typical<build_exchange<atomic_alpha_64<T> > >
-{
-public:
-    typedef build_atomic_from_typical<build_exchange<atomic_alpha_64<T> > > super;
-    BOOST_CONSTEXPR platform_atomic_integral(T v) BOOST_NOEXCEPT: super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-template<typename T>
-class platform_atomic_integral<T, 1> :
-    public build_atomic_from_larger_type<atomic_alpha_32<uint32_t>, T>
-{
-public:
-    typedef build_atomic_from_larger_type<atomic_alpha_32<uint32_t>, T> super;
-    BOOST_CONSTEXPR platform_atomic_integral(T v) BOOST_NOEXCEPT: super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-template<typename T>
-class platform_atomic_integral<T, 2> :
-    public build_atomic_from_larger_type<atomic_alpha_32<uint32_t>, T>
-{
-public:
-    typedef build_atomic_from_larger_type<atomic_alpha_32<uint32_t>, T> super;
-    BOOST_CONSTEXPR platform_atomic_integral(T v) BOOST_NOEXCEPT: super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-armv6plus.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_ARMV6PLUS_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_ARMV6PLUS_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2009 Phil Endecott
-//  Copyright (c) 2013 Tim Blechmann
-//  ARM Code by Phil Endecott, based on other architectures.
-
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-// From the ARM Architecture Reference Manual for architecture v6:
-//
-// LDREX{<cond>} <Rd>, [<Rn>]
-// <Rd> Specifies the destination register for the memory word addressed by <Rd>
-// <Rn> Specifies the register containing the address.
-//
-// STREX{<cond>} <Rd>, <Rm>, [<Rn>]
-// <Rd> Specifies the destination register for the returned status value.
-//      0  if the operation updates memory
-//      1  if the operation fails to update memory
-// <Rm> Specifies the register containing the word to be stored to memory.
-// <Rn> Specifies the register containing the address.
-// Rd must not be the same register as Rm or Rn.
-//
-// ARM v7 is like ARM v6 plus:
-// There are half-word and byte versions of the LDREX and STREX instructions,
-// LDREXH, LDREXB, STREXH and STREXB.
-// There are also double-word versions, LDREXD and STREXD.
-// (Actually it looks like these are available from version 6k onwards.)
-// FIXME these are not yet used; should be mostly a matter of copy-and-paste.
-// I think you can supply an immediate offset to the address.
-//
-// A memory barrier is effected using a "co-processor 15" instruction,
-// though a separate assembler mnemonic is available for it in v7.
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-// "Thumb 1" is a subset of the ARM instruction set that uses a 16-bit encoding.  It
-// doesn't include all instructions and in particular it doesn't include the co-processor
-// instruction used for the memory barrier or the load-locked/store-conditional
-// instructions.  So, if we're compiling in "Thumb 1" mode, we need to wrap all of our
-// asm blocks with code to temporarily change to ARM mode.
-//
-// You can only change between ARM and Thumb modes when branching using the bx instruction.
-// bx takes an address specified in a register.  The least significant bit of the address
-// indicates the mode, so 1 is added to indicate that the destination code is Thumb.
-// A temporary register is needed for the address and is passed as an argument to these
-// macros.  It must be one of the "low" registers accessible to Thumb code, specified
-// using the "l" attribute in the asm statement.
-//
-// Architecture v7 introduces "Thumb 2", which does include (almost?) all of the ARM
-// instruction set.  So in v7 we don't need to change to ARM mode; we can write "universal
-// assembler" which will assemble to Thumb 2 or ARM code as appropriate.  The only thing
-// we need to do to make this "universal" assembler mode work is to insert "IT" instructions
-// to annotate the conditional instructions.  These are ignored in other modes (e.g. v6),
-// so they can always be present.
-
-#if defined(__thumb__) && !defined(__thumb2__)
-#define BOOST_ATOMIC_ARM_ASM_START(TMPREG) "adr " #TMPREG ", 1f\n" "bx " #TMPREG "\n" ".arm\n" ".align 4\n" "1: "
-#define BOOST_ATOMIC_ARM_ASM_END(TMPREG)   "adr " #TMPREG ", 1f + 1\n" "bx " #TMPREG "\n" ".thumb\n" ".align 2\n" "1: "
-#else
-// The tmpreg is wasted in this case, which is non-optimal.
-#define BOOST_ATOMIC_ARM_ASM_START(TMPREG)
-#define BOOST_ATOMIC_ARM_ASM_END(TMPREG)
-#endif
-
-#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)
-#define BOOST_ATOMIC_ARM_DMB "dmb\n"
-#else
-#define BOOST_ATOMIC_ARM_DMB "mcr\tp15, 0, r0, c7, c10, 5\n"
-#endif
-
-inline void
-arm_barrier(void) BOOST_NOEXCEPT
-{
-    int brtmp;
-    __asm__ __volatile__
-    (
-        BOOST_ATOMIC_ARM_ASM_START(%0)
-        BOOST_ATOMIC_ARM_DMB
-        BOOST_ATOMIC_ARM_ASM_END(%0)
-        : "=&l" (brtmp) :: "memory"
-    );
-}
-
-inline void
-platform_fence_before(memory_order order) BOOST_NOEXCEPT
-{
-    switch(order)
-    {
-    case memory_order_release:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        arm_barrier();
-    case memory_order_consume:
-    default:;
-    }
-}
-
-inline void
-platform_fence_after(memory_order order) BOOST_NOEXCEPT
-{
-    switch(order)
-    {
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        arm_barrier();
-    default:;
-    }
-}
-
-inline void
-platform_fence_before_store(memory_order order) BOOST_NOEXCEPT
-{
-    platform_fence_before(order);
-}
-
-inline void
-platform_fence_after_store(memory_order order) BOOST_NOEXCEPT
-{
-    if (order == memory_order_seq_cst)
-        arm_barrier();
-}
-
-inline void
-platform_fence_after_load(memory_order order) BOOST_NOEXCEPT
-{
-    platform_fence_after(order);
-}
-
-template<typename T>
-inline bool
-platform_cmpxchg32(T & expected, T desired, volatile T * ptr) BOOST_NOEXCEPT
-{
-    int success;
-    int tmp;
-    __asm__ __volatile__
-    (
-        BOOST_ATOMIC_ARM_ASM_START(%2)
-        "mov     %1, #0\n"        // success = 0
-        "ldrex   %0, %3\n"      // expected' = *(&i)
-        "teq     %0, %4\n"        // flags = expected'==expected
-        "ittt    eq\n"
-        "strexeq %2, %5, %3\n"  // if (flags.equal) *(&i) = desired, tmp = !OK
-        "teqeq   %2, #0\n"        // if (flags.equal) flags = tmp==0
-        "moveq   %1, #1\n"        // if (flags.equal) success = 1
-        BOOST_ATOMIC_ARM_ASM_END(%2)
-            : "=&r" (expected),  // %0
-            "=&r" (success),   // %1
-            "=&l" (tmp),       // %2
-            "+Q" (*ptr)          // %3
-            : "r" (expected),    // %4
-            "r" (desired) // %5
-            : "cc"
-    );
-    return success;
-}
-
-}
-}
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_acquire:
-    case memory_order_release:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        atomics::detail::arm_barrier();
-    default:;
-    }
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-inline void
-atomic_signal_fence(memory_order)
-{
-    __asm__ __volatile__ ("" ::: "memory");
-}
-
-class atomic_flag
-{
-private:
-    uint32_t v_;
-
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before_store(order);
-        const_cast<volatile uint32_t &>(v_) = 0;
-        atomics::detail::platform_fence_after_store(order);
-    }
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        uint32_t expected = v_;
-        do {
-            if (expected == 1)
-                break;
-        } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_));
-        atomics::detail::platform_fence_after(order);
-        return expected;
-    }
-
-    BOOST_DELETED_FUNCTION(atomic_flag(const atomic_flag &))
-    BOOST_DELETED_FUNCTION(atomic_flag& operator=(const atomic_flag &))
-};
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-}
-
-#undef BOOST_ATOMIC_ARM_ASM_START
-#undef BOOST_ATOMIC_ARM_ASM_END
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-#include <boost/atomic/detail/cas32weak.hpp>
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-atomic.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1204 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_ATOMIC_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_ATOMIC_HPP
-
-//  Copyright (c) 2013 Andrey Semashev
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-#if (defined(__i386__) && defined(__SSE2__)) || defined(__x86_64__)
-#define BOOST_ATOMIC_X86_PAUSE() __asm__ __volatile__ ("pause\n")
-#endif
-
-#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
-#define BOOST_ATOMIC_X86_HAS_CMPXCHG8B 1
-#endif
-
-#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
-#define BOOST_ATOMIC_X86_HAS_CMPXCHG16B 1
-#endif
-
-BOOST_FORCEINLINE BOOST_CONSTEXPR int convert_memory_order_to_gcc(memory_order order) BOOST_NOEXCEPT
-{
-    return (order == memory_order_relaxed ? __ATOMIC_RELAXED : (order == memory_order_consume ? __ATOMIC_CONSUME :
-        (order == memory_order_acquire ? __ATOMIC_ACQUIRE : (order == memory_order_release ? __ATOMIC_RELEASE :
-        (order == memory_order_acq_rel ? __ATOMIC_ACQ_REL : __ATOMIC_SEQ_CST)))));
-}
-
-} // namespace detail
-} // namespace atomics
-
-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    bool v_;
-
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(false) {}
-
-    bool test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_test_and_set(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    void clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_clear((bool*)&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-};
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-#endif // __GCC_ATOMIC_BOOL_LOCK_FREE == 2
-
-} // namespace boost
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_CHAR16_T_LOCK_FREE == 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_CHAR32_T_LOCK_FREE == 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_INT_LOCK_FREE == 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
-#endif
-#if defined(BOOST_ATOMIC_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
-#define BOOST_ATOMIC_INT128_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_POINTER_LOCK_FREE == 2
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#endif
-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-#endif
-
-namespace boost {
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-BOOST_FORCEINLINE void atomic_thread_fence(memory_order order)
-{
-    __atomic_thread_fence(atomics::detail::convert_memory_order_to_gcc(order));
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-BOOST_FORCEINLINE void atomic_signal_fence(memory_order order)
-{
-    __atomic_signal_fence(atomics::detail::convert_memory_order_to_gcc(order));
-}
-
-namespace atomics {
-namespace detail {
-
-#if defined(BOOST_ATOMIC_CHAR_LOCK_FREE) && BOOST_ATOMIC_CHAR_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_and(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_or(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_xor(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint8_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT :
-        v_(reinterpret_cast<storage_type const&>(v))
-    {
-    }
-
-    void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store(&v_, (storage_type*)&v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __atomic_load(&v_, (storage_type*)&v, atomics::detail::convert_memory_order_to_gcc(order));
-        return v;
-    }
-
-    value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type r;
-        __atomic_exchange(&v_, (storage_type*)&v, (storage_type*)&r, atomics::detail::convert_memory_order_to_gcc(order));
-        return r;
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange(&v_, (storage_type*)&expected, (storage_type*)&desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange(&v_, (storage_type*)&expected, (storage_type*)&desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_CHAR_LOCK_FREE) && BOOST_ATOMIC_CHAR_LOCK_FREE > 0
-
-#if defined(BOOST_ATOMIC_SHORT_LOCK_FREE) && BOOST_ATOMIC_SHORT_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_and(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_or(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_xor(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint16_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT :
-        v_(reinterpret_cast<storage_type const&>(v))
-    {
-    }
-
-    void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store(&v_, (storage_type*)&v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __atomic_load(&v_, (storage_type*)&v, atomics::detail::convert_memory_order_to_gcc(order));
-        return v;
-    }
-
-    value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type r;
-        __atomic_exchange(&v_, (storage_type*)&v, (storage_type*)&r, atomics::detail::convert_memory_order_to_gcc(order));
-        return r;
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange(&v_, (storage_type*)&expected, (storage_type*)&desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange(&v_, (storage_type*)&expected, (storage_type*)&desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_SHORT_LOCK_FREE) && BOOST_ATOMIC_SHORT_LOCK_FREE > 0
-
-#if defined(BOOST_ATOMIC_INT_LOCK_FREE) && BOOST_ATOMIC_INT_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_and(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_or(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_xor(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        __atomic_store_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        tmp = __atomic_exchange_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_INT_LOCK_FREE) && BOOST_ATOMIC_INT_LOCK_FREE > 0
-
-#if defined(BOOST_ATOMIC_LLONG_LOCK_FREE) && BOOST_ATOMIC_LLONG_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_and(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_or(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_xor(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint64_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        __atomic_store_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        tmp = __atomic_exchange_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_LLONG_LOCK_FREE) && BOOST_ATOMIC_LLONG_LOCK_FREE > 0
-
-#if defined(BOOST_ATOMIC_INT128_LOCK_FREE) && BOOST_ATOMIC_INT128_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 16, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_and(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_or(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_xor(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#if defined(BOOST_HAS_INT128)
-
-typedef boost::uint128_type storage128_type;
-
-#else // defined(BOOST_HAS_INT128)
-
-struct BOOST_ALIGNMENT(16) storage128_type
-{
-    uint64_t data[2];
-};
-
-inline bool operator== (storage128_type const& left, storage128_type const& right)
-{
-    return left.data[0] == right.data[0] && left.data[1] == right.data[1];
-}
-inline bool operator!= (storage128_type const& left, storage128_type const& right)
-{
-    return !(left == right);
-}
-
-#endif // defined(BOOST_HAS_INT128)
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 16, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef storage128_type storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        __atomic_store_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        tmp = __atomic_exchange_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        const bool success = __atomic_compare_exchange_n(&v_, &expected_s, desired_s, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_INT128_LOCK_FREE) && BOOST_ATOMIC_INT128_LOCK_FREE > 0
-
-
-/* pointers */
-
-#if defined(BOOST_ATOMIC_POINTER_LOCK_FREE) && BOOST_ATOMIC_POINTER_LOCK_FREE > 0
-
-template<typename T, bool Sign>
-class base_atomic<T*, void*, sizeof(void*), Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T* value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v * sizeof(T), atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v * sizeof(T), atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<bool Sign>
-class base_atomic<void*, void*, sizeof(void*), Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef void* value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        __atomic_store_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_load_n(&v_, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_add(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_fetch_sub(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_exchange_n(&v_, v, atomics::detail::convert_memory_order_to_gcc(order));
-    }
-
-    bool compare_exchange_strong(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, false,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool compare_exchange_weak(
-        value_type& expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return __atomic_compare_exchange_n(&v_, &expected, desired, true,
-            atomics::detail::convert_memory_order_to_gcc(success_order),
-            atomics::detail::convert_memory_order_to_gcc(failure_order));
-    }
-
-    bool is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return __atomic_is_lock_free(sizeof(v_), &v_);
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#endif // defined(BOOST_ATOMIC_POINTER_LOCK_FREE) && BOOST_ATOMIC_POINTER_LOCK_FREE > 0
-
-} // namespace detail
-} // namespace atomics
-} // namespace boost
-
-#endif // !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#endif // BOOST_ATOMIC_DETAIL_GCC_ATOMIC_HPP
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-cas.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-//  Copyright (c) 2011 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-// Use the gnu builtin __sync_val_compare_and_swap to build
-// atomic operations for 32 bit and smaller.
-
-#ifndef BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP
-#define BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP
-
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-        break;
-    case memory_order_release:
-    case memory_order_consume:
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __sync_synchronize();
-        break;
-    }
-}
-
-namespace atomics {
-namespace detail {
-
-inline void
-platform_fence_before(memory_order)
-{
-    /* empty, as compare_and_swap is synchronizing already */
-}
-
-inline void
-platform_fence_after(memory_order)
-{
-    /* empty, as compare_and_swap is synchronizing already */
-}
-
-inline void
-platform_fence_before_store(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_acquire:
-    case memory_order_consume:
-        break;
-    case memory_order_release:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __sync_synchronize();
-        break;
-    }
-}
-
-inline void
-platform_fence_after_store(memory_order order)
-{
-    if (order == memory_order_seq_cst)
-        __sync_synchronize();
-}
-
-inline void
-platform_fence_after_load(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_release:
-        break;
-    case memory_order_consume:
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __sync_synchronize();
-        break;
-    }
-}
-
-template<typename T>
-inline bool
-platform_cmpxchg32_strong(T & expected, T desired, volatile T * ptr)
-{
-    T found = __sync_val_compare_and_swap(ptr, expected, desired);
-    bool success = (found == expected);
-    expected = found;
-    return success;
-}
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before_store(order);
-        const_cast<volatile uint32_t &>(v_) = 0;
-        atomics::detail::platform_fence_after_store(order);
-    }
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        uint32_t expected = v_;
-        do {
-            if (expected == 1)
-                break;
-        } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_));
-        atomics::detail::platform_fence_after(order);
-        return expected;
-    }
-};
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-}
-}
-}
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE (sizeof(long) <= 4 ? 2 : 0)
-#define BOOST_ATOMIC_LLONG_LOCK_FREE (sizeof(long long) <= 4 ? 2 : 0)
-#define BOOST_ATOMIC_POINTER_LOCK_FREE (sizeof(void *) <= 4 ? 2 : 0)
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-#include <boost/atomic/detail/cas32strong.hpp>
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-ppc.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2952 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_PPC_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_PPC_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-/*
-    Refer to: Motorola: "Programming Environments Manual for 32-Bit
-    Implementations of the PowerPC Architecture", Appendix E:
-    "Synchronization Programming Examples" for an explanation of what is
-    going on here (can be found on the web at various places by the
-    name "MPCFPE32B.pdf", Google is your friend...)
-
-    Most of the atomic operations map to instructions in a relatively
-    straight-forward fashion, but "load"s may at first glance appear
-    a bit strange as they map to:
-
-            lwz %rX, addr
-            cmpw %rX, %rX
-            bne- 1f
-        1:
-
-    That is, the CPU is forced to perform a branch that "formally" depends
-    on the value retrieved from memory. This scheme has an overhead of
-    about 1-2 clock cycles per load, but it allows to map "acquire" to
-    the "isync" instruction instead of "sync" uniformly and for all type
-    of atomic operations. Since "isync" has a cost of about 15 clock
-    cycles, while "sync" hast a cost of about 50 clock cycles, the small
-    penalty to atomic loads more than compensates for this.
-
-    Byte- and halfword-sized atomic values are realized by encoding the
-    value to be represented into a word, performing sign/zero extension
-    as appropriate. This means that after add/sub operations the value
-    needs fixing up to accurately preserve the wrap-around semantic of
-    the smaller type. (Nothing special needs to be done for the bit-wise
-    and the "exchange type" operators as the compiler already sees to
-    it that values carried in registers are extended appropriately and
-    everything falls into place naturally).
-
-    The register constraint "b"  instructs gcc to use any register
-    except r0; this is sometimes required because the encoding for
-    r0 is used to signify "constant zero" in a number of instructions,
-    making r0 unusable in this place. For simplicity this constraint
-    is used everywhere since I am to lazy to look this up on a
-    per-instruction basis, and ppc has enough registers for this not
-    to pose a problem.
-*/
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-inline void
-ppc_fence_before(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_release:
-    case memory_order_acq_rel:
-#if defined(__powerpc64__)
-        __asm__ __volatile__ ("lwsync" ::: "memory");
-        break;
-#endif
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("sync" ::: "memory");
-    default:;
-    }
-}
-
-inline void
-ppc_fence_after(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("isync");
-    case memory_order_consume:
-        __asm__ __volatile__ ("" ::: "memory");
-    default:;
-    }
-}
-
-inline void
-ppc_fence_after_store(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("sync");
-    default:;
-    }
-}
-
-}
-}
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::ppc_fence_before(order);
-        const_cast<volatile uint32_t &>(v_) = 0;
-        atomics::detail::ppc_fence_after_store(order);
-    }
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        uint32_t original;
-        atomics::detail::ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (1)
-            : "cr0"
-        );
-        atomics::detail::ppc_fence_after(order);
-        return original;
-    }
-};
-
-} /* namespace boost */
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#if defined(__powerpc64__)
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
-#else
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
-#endif
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-/* Would like to move the slow-path of failed compare_exchange
-(that clears the "success" bit) out-of-line. gcc can in
-principle do that using ".subsection"/".previous", but Apple's
-binutils seemingly does not understand that. Therefore wrap
-the "clear" of the flag in a macro and let it remain
-in-line for Apple
-*/
-
-#if !defined(__APPLE__)
-
-#define BOOST_ATOMIC_ASM_SLOWPATH_CLEAR \
-    "9:\n" \
-    ".subsection 2\n" \
-    "2: addi %1,0,0\n" \
-    "b 9b\n" \
-    ".previous\n" \
-
-#else
-
-#define BOOST_ATOMIC_ASM_SLOWPATH_CLEAR \
-    "b 9f\n" \
-    "2: addi %1,0,0\n" \
-    "9:\n" \
-
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T>
-class base_atomic<T, int, 1, true>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef int32_t storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m"(v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=&r" (v)
-            : "m" (v_)
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "extsb %1, %1\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "extsb %1, %1\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 1, false>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m"(v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=&r" (v)
-            : "m" (v_)
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "rlwinm %1, %1, 0, 0xff\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "rlwinm %1, %1, 0, 0xff\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 2, true>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef int32_t storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m"(v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=&r" (v)
-            : "m" (v_)
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "extsh %1, %1\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "extsh %1, %1\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 2, false>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m"(v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=&r" (v)
-            : "m" (v_)
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "rlwinm %1, %1, 0, 0xffff\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "rlwinm %1, %1, 0, 0xffff\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        const_cast<volatile value_type &>(v_) = v;
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        __asm__ __volatile__ (
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "+b"(v)
-            :
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#if defined(__powerpc64__)
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        const_cast<volatile value_type &>(v_) = v;
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        __asm__ __volatile__ (
-            "cmpd %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "+b"(v)
-            :
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y1\n"
-            "stdcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "and %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "or %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "xor %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#endif
-
-/* pointer types */
-
-#if !defined(__powerpc64__)
-
-template<bool Sign>
-class base_atomic<void *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m" (v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(v)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m" (v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(v)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stwcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#else
-
-template<bool Sign>
-class base_atomic<void *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "std %1, %0\n"
-            : "+m" (v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ (
-            "ld %0, %1\n"
-            "cmpd %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(v)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y1\n"
-            "stdcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        ppc_fence_before(order);
-        __asm__ (
-            "std %1, %0\n"
-            : "+m" (v_)
-            : "r" (v)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v;
-        __asm__ (
-            "ld %0, %1\n"
-            "cmpd %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(v)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type original;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y1\n"
-            "stdcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (v)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected), "=&b" (success), "+Z"(v_)
-            : "b" (expected), "b" (desired)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        return success;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "add %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        value_type original, tmp;
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y2\n"
-            "sub %1,%0,%3\n"
-            "stdcx. %1,%y2\n"
-            "bne- 1b\n"
-            : "=&b" (original), "=&b" (tmp), "+Z"(v_)
-            : "b" (v)
-            : "cc");
-        ppc_fence_after(order);
-        return original;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#endif
-
-/* generic */
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m" (v_)
-            : "r" (tmp)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(tmp)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0, original;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (tmp)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        value_type res;
-        memcpy(&res, &original, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m" (v_)
-            : "r" (tmp)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(tmp)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0, original;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (tmp)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        value_type res;
-        memcpy(&res, &original, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "stw %1, %0\n"
-            : "+m" (v_)
-            : "r" (tmp)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        __asm__ __volatile__ (
-            "lwz %0, %1\n"
-            "cmpw %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(tmp)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0, original;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "lwarx %0,%y1\n"
-            "stwcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (tmp)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        value_type res;
-        memcpy(&res, &original, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: lwarx %0,%y2\n"
-            "cmpw %0, %3\n"
-            "bne- 2f\n"
-            "stwcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#if defined(__powerpc64__)
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint64_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "std %1, %0\n"
-            : "+m" (v_)
-            : "r" (tmp)
-        );
-        ppc_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        __asm__ __volatile__ (
-            "ld %0, %1\n"
-            "cmpd %0, %0\n"
-            "bne- 1f\n"
-            "1:\n"
-            : "=r"(tmp)
-            : "m"(v_)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0, original;
-        memcpy(&tmp, &v, sizeof(value_type));
-        ppc_fence_before(order);
-        __asm__ (
-            "1:\n"
-            "ldarx %0,%y1\n"
-            "stdcx. %2,%y1\n"
-            "bne- 1b\n"
-            : "=&b" (original), "+Z"(v_)
-            : "b" (tmp)
-            : "cr0"
-        );
-        ppc_fence_after(order);
-        value_type res;
-        memcpy(&res, &original, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s, desired_s;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 2f\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s, desired_s;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-
-        int success;
-        ppc_fence_before(success_order);
-        __asm__(
-            "0: ldarx %0,%y2\n"
-            "cmpd %0, %3\n"
-            "bne- 2f\n"
-            "stdcx. %4,%y2\n"
-            "bne- 0b\n"
-            "addi %1,0,1\n"
-            "1:"
-
-            BOOST_ATOMIC_ASM_SLOWPATH_CLEAR
-            : "=&b" (expected_s), "=&b" (success), "+Z"(v_)
-            : "b" (expected_s), "b" (desired_s)
-            : "cr0"
-        );
-        if (success)
-            ppc_fence_after(success_order);
-        else
-            ppc_fence_after(failure_order);
-        memcpy(&expected, &expected_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif
-
-}
-}
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_acquire:
-        __asm__ __volatile__ ("isync" ::: "memory");
-        break;
-    case memory_order_release:
-#if defined(__powerpc64__)
-        __asm__ __volatile__ ("lwsync" ::: "memory");
-        break;
-#endif
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("sync" ::: "memory");
-    default:;
-    }
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-inline void
-atomic_signal_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_acquire:
-    case memory_order_release:
-    case memory_order_acq_rel:
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    default:;
-    }
-}
-
-}
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-sparcv9.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1333 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
-
-//  Copyright (c) 2010 Helge Bahmann
-//  Copyright (c) 2013 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-inline void
-platform_fence_before(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_acquire:
-    case memory_order_consume:
-        break;
-    case memory_order_release:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
-        /* release */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("membar #Sync" ::: "memory");
-        /* seq */
-        break;
-    }
-}
-
-inline void
-platform_fence_after(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_release:
-        break;
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
-        /* acquire */
-        break;
-    case memory_order_consume:
-        /* consume */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("membar #Sync" ::: "memory");
-        /* seq */
-        break;
-    default:;
-    }
-}
-
-inline void
-platform_fence_after_store(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("membar #Sync" ::: "memory");
-    default:;
-    }
-}
-
-
-inline void
-platform_fence_after_load(memory_order order)
-{
-    platform_fence_after(order);
-}
-
-}
-}
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        const_cast<volatile uint32_t &>(v_) = 0;
-        atomics::detail::platform_fence_after_store(order);
-    }
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        uint32_t tmp = 1;
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (tmp)
-            : "r" (&v_), "r" (0)
-            : "memory"
-        );
-        atomics::detail::platform_fence_after(order);
-        return tmp;
-    }
-};
-
-} /* namespace boost */
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-namespace boost {
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-        break;
-    case memory_order_release:
-        __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
-        break;
-    case memory_order_acquire:
-        __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
-        break;
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore" ::: "memory");
-        break;
-    case memory_order_consume:
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("membar #Sync" ::: "memory");
-        break;
-    default:;
-    }
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-inline void
-atomic_signal_fence(memory_order)
-{
-    __asm__ __volatile__ ("" ::: "memory");
-}
-
-namespace atomics {
-namespace detail {
-
-/* integral types */
-
-template<typename T>
-class base_atomic<T, int, 1, true>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef int32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        storage_type desired_s = desired;
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" ((storage_type)expected)
-            : "memory"
-        );
-        desired = desired_s;
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 1, false>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        storage_type desired_s = desired;
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" ((storage_type)expected)
-            : "memory"
-        );
-        desired = desired_s;
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 2, true>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef int32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        storage_type desired_s = desired;
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" ((storage_type)expected)
-            : "memory"
-        );
-        desired = desired_s;
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T>
-class base_atomic<T, int, 2, false>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        storage_type desired_s = desired;
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" ((storage_type)expected)
-            : "memory"
-        );
-        desired = desired_s;
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired)
-            : "r" (&v_), "r" (expected)
-            : "memory"
-        );
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* pointer types */
-
-template<bool Sign>
-class base_atomic<void *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired)
-            : "r" (&v_), "r" (expected)
-            : "memory"
-        );
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-
-    bool compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, (char*)tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, (char*)tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        const_cast<volatile value_type &>(v_) = v;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired)
-            : "r" (&v_), "r" (expected)
-            : "memory"
-        );
-        bool success = (desired == expected);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = desired;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-/* generic types */
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" (expected_s)
-            : "memory"
-        );
-        bool success = (desired_s == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &desired_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" (expected_s)
-            : "memory"
-        );
-        bool success = (desired_s == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &desired_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        const_cast<volatile storage_type &>(v_) = tmp;
-        platform_fence_after_store(order);
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
-        return tmp;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-        __asm__ (
-            "cas [%1], %2, %0"
-            : "+r" (desired_s)
-            : "r" (&v_), "r" (expected_s)
-            : "memory"
-        );
-        bool success = (desired_s == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &desired_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-}
-}
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/gcc-x86.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2017 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GCC_X86_HPP
-#define BOOST_ATOMIC_DETAIL_GCC_X86_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2012 Tim Blechmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-#if defined(__x86_64__) || defined(__SSE2__)
-# define BOOST_ATOMIC_X86_FENCE_INSTR "mfence\n"
-#else
-# define BOOST_ATOMIC_X86_FENCE_INSTR "lock ; addl $0, (%%esp)\n"
-#endif
-
-#define BOOST_ATOMIC_X86_PAUSE() __asm__ __volatile__ ("pause\n")
-
-#if defined(__i386__) &&\
-    (\
-        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) ||\
-        defined(__i586__) || defined(__i686__) || defined(__pentium4__) || defined(__nocona__) || defined(__core2__) || defined(__corei7__) ||\
-        defined(__k6__) || defined(__athlon__) || defined(__k8__) || defined(__amdfam10__) || defined(__bdver1__) || defined(__bdver2__) || defined(__bdver3__) || defined(__btver1__) || defined(__btver2__)\
-    )
-#define BOOST_ATOMIC_X86_HAS_CMPXCHG8B 1
-#endif
-
-#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
-#define BOOST_ATOMIC_X86_HAS_CMPXCHG16B 1
-#endif
-
-inline void
-platform_fence_before(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_acquire:
-    case memory_order_consume:
-        break;
-    case memory_order_release:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* release */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* seq */
-        break;
-    default:;
-    }
-}
-
-inline void
-platform_fence_after(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_release:
-        break;
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* acquire */
-        break;
-    case memory_order_consume:
-        /* consume */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* seq */
-        break;
-    default:;
-    }
-}
-
-inline void
-platform_fence_after_load(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_release:
-        break;
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    case memory_order_consume:
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    default:;
-    }
-}
-
-inline void
-platform_fence_before_store(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_acquire:
-    case memory_order_consume:
-        break;
-    case memory_order_release:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* release */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* seq */
-        break;
-    default:;
-    }
-}
-
-inline void
-platform_fence_after_store(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-    case memory_order_release:
-        break;
-    case memory_order_acquire:
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* acquire */
-        break;
-    case memory_order_consume:
-        /* consume */
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ ("" ::: "memory");
-        /* seq */
-        break;
-    default:;
-    }
-}
-
-}
-}
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        uint32_t v = 1;
-        atomics::detail::platform_fence_before(order);
-        __asm__ __volatile__ (
-            "xchgl %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        atomics::detail::platform_fence_after(order);
-        return v;
-    }
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order == memory_order_seq_cst) {
-            uint32_t v = 0;
-            __asm__ __volatile__ (
-                "xchgl %0, %1"
-                : "+r" (v), "+m" (v_)
-            );
-        } else {
-            atomics::detail::platform_fence_before(order);
-            v_ = 0;
-        }
-    }
-};
-
-} /* namespace boost */
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-
-#if defined(__x86_64__) || defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B)
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
-#endif
-
-#if defined(BOOST_ATOMIC_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
-#define BOOST_ATOMIC_INT128_LOCK_FREE 2
-#endif
-
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-namespace boost {
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order)
-    {
-    case memory_order_relaxed:
-        break;
-    case memory_order_release:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    case memory_order_acquire:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    case memory_order_acq_rel:
-        __asm__ __volatile__ ("" ::: "memory");
-        break;
-    case memory_order_consume:
-        break;
-    case memory_order_seq_cst:
-        __asm__ __volatile__ (BOOST_ATOMIC_X86_FENCE_INSTR ::: "memory");
-        break;
-    default:;
-    }
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-inline void
-atomic_signal_fence(memory_order)
-{
-    __asm__ __volatile__ ("" ::: "memory");
-}
-
-namespace atomics {
-namespace detail {
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddb %0, %1"
-            : "+q" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgb %0, %1"
-            : "+q" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgb %3, %1\n\t"
-            "sete %2"
-            : "+a" (previous), "+m" (v_), "=q" (success)
-            : "q" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddw %0, %1"
-            : "+q" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgw %0, %1"
-            : "+q" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgw %3, %1\n\t"
-            "sete %2"
-            : "+a" (previous), "+m" (v_), "=q" (success)
-            : "q" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddl %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgl %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgl %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#if defined(__x86_64__)
-template<typename T, bool Sign>
-class base_atomic<T, int, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddq %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgq %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgq %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        value_type tmp = load(memory_order_relaxed);
-        while (!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed))
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#endif
-
-/* pointers */
-
-// NOTE: x32 target is still regarded to as x86_64 and can only be detected by the size of pointers
-#if !defined(__x86_64__) || (defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 4)
-
-template<bool Sign>
-class base_atomic<void *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgl %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgl %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddl %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return reinterpret_cast<value_type>(v);
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgl %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgl %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddl %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return reinterpret_cast<value_type>(v);
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#else
-
-template<bool Sign>
-class base_atomic<void *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void * value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgq %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgq %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddq %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return reinterpret_cast<value_type>(v);
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T *, void *, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T * value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgq %0, %1"
-            : "+r" (v), "+m" (v_)
-        );
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgq %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous), "+m,m" (v_), "=q,m" (success)
-            : "r,r" (desired)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = previous;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "lock ; xaddq %0, %1"
-            : "+r" (v), "+m" (v_)
-            :
-            : "cc"
-        );
-        platform_fence_after(order);
-        return reinterpret_cast<value_type>(v);
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-#endif
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint8_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT :
-        v_(reinterpret_cast<storage_type const&>(v))
-    {
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgb %0, %1"
-            : "+q" (tmp), "+m" (v_)
-        );
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s, desired_s;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        storage_type previous_s = expected_s;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgb %3, %1\n\t"
-            "sete %2"
-            : "+a" (previous_s), "+m" (v_), "=q" (success)
-            : "q" (desired_s)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &previous_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint16_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT :
-        v_(reinterpret_cast<storage_type const&>(v))
-    {
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgw %0, %1"
-            : "+q" (tmp), "+m" (v_)
-        );
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s, desired_s;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        storage_type previous_s = expected_s;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgw %3, %1\n\t"
-            "sete %2"
-            : "+a" (previous_s), "+m" (v_), "=q" (success)
-            : "q" (desired_s)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &previous_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgl %0, %1"
-            : "+q" (tmp), "+m" (v_)
-        );
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        storage_type previous_s = expected_s;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgl %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous_s), "+m,m" (v_), "=q,m" (success)
-            : "q,q" (desired_s)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &previous_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#if defined(__x86_64__)
-template<typename T, bool Sign>
-class base_atomic<T, void, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint64_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        __asm__ __volatile__
-        (
-            "xchgq %0, %1"
-            : "+q" (tmp), "+m" (v_)
-        );
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        storage_type previous_s = expected_s;
-        platform_fence_before(success_order);
-        bool success;
-        __asm__ __volatile__
-        (
-            "lock ; cmpxchgq %3, %1\n\t"
-            "sete %2"
-            : "+a,a" (previous_s), "+m,m" (v_), "=q,m" (success)
-            : "q,q" (desired_s)
-            : "cc"
-        );
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &previous_s, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-#endif
-
-#if !defined(__x86_64__) && defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B)
-
-template<typename T>
-inline bool
-platform_cmpxchg64_strong(T & expected, T desired, volatile T * ptr) BOOST_NOEXCEPT
-{
-#ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
-    const T oldval = __sync_val_compare_and_swap(ptr, expected, desired);
-    const bool result = (oldval == expected);
-    expected = oldval;
-    return result;
-#else
-    uint32_t scratch;
-    /* Make sure ebx is saved and restored properly in case
-    this object is compiled as "position independent". Since
-    programmers on x86 tend to forget specifying -DPIC or
-    similar, always assume PIC.
-
-    To make this work uniformly even in the non-PIC case,
-    setup register constraints such that ebx can not be
-    used by accident e.g. as base address for the variable
-    to be modified. Accessing "scratch" should always be okay,
-    as it can only be placed on the stack (and therefore
-    accessed through ebp or esp only).
-
-    In theory, could push/pop ebx onto/off the stack, but movs
-    to a prepared stack slot turn out to be faster. */
-    bool success;
-    __asm__ __volatile__
-    (
-        "movl %%ebx, %[scratch]\n\t"
-        "movl %[desired_lo], %%ebx\n\t"
-        "lock; cmpxchg8b %[dest]\n\t"
-        "movl %[scratch], %%ebx\n\t"
-        "sete %[success]"
-        : "+A,A,A,A,A,A" (expected), [dest] "+m,m,m,m,m,m" (*ptr), [scratch] "=m,m,m,m,m,m" (scratch), [success] "=q,m,q,m,q,m" (success)
-        : [desired_lo] "S,S,D,D,m,m" ((uint32_t)desired), "c,c,c,c,c,c" ((uint32_t)(desired >> 32))
-        : "memory", "cc"
-    );
-    return success;
-#endif
-}
-
-// Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, 8.1.1. Guaranteed Atomic Operations:
-//
-// The Pentium processor (and newer processors since) guarantees that the following additional memory operations will always be carried out atomically:
-// * Reading or writing a quadword aligned on a 64-bit boundary
-//
-// Luckily, the memory is almost always 8-byte aligned in our case because atomic<> uses 64 bit native types for storage and dynamic memory allocations
-// have at least 8 byte alignment. The only unfortunate case is when atomic is placeod on the stack and it is not 8-byte aligned (like on 32 bit Windows).
-
-template<typename T>
-inline void
-platform_store64(T value, volatile T * ptr) BOOST_NOEXCEPT
-{
-    if (((uint32_t)ptr & 0x00000007) == 0)
-    {
-#if defined(__SSE2__)
-        __asm__ __volatile__
-        (
-            "movq %1, %%xmm4\n\t"
-            "movq %%xmm4, %0\n\t"
-            : "=m" (*ptr)
-            : "m" (value)
-            : "memory", "xmm4"
-        );
-#else
-        __asm__ __volatile__
-        (
-            "fildll %1\n\t"
-            "fistpll %0\n\t"
-            : "=m" (*ptr)
-            : "m" (value)
-            : "memory"
-        );
-#endif
-    }
-    else
-    {
-        uint32_t scratch;
-        __asm__ __volatile__
-        (
-            "movl %%ebx, %[scratch]\n\t"
-            "movl %[value_lo], %%ebx\n\t"
-            "movl 0(%[dest]), %%eax\n\t"
-            "movl 4(%[dest]), %%edx\n\t"
-            ".align 16\n\t"
-            "1: lock; cmpxchg8b 0(%[dest])\n\t"
-            "jne 1b\n\t"
-            "movl %[scratch], %%ebx"
-            : [scratch] "=m,m" (scratch)
-            : [value_lo] "a,a" ((uint32_t)value), "c,c" ((uint32_t)(value >> 32)), [dest] "D,S" (ptr)
-            : "memory", "cc", "edx"
-        );
-    }
-}
-
-template<typename T>
-inline T
-platform_load64(const volatile T * ptr) BOOST_NOEXCEPT
-{
-    T value;
-
-    if (((uint32_t)ptr & 0x00000007) == 0)
-    {
-#if defined(__SSE2__)
-        __asm__ __volatile__
-        (
-            "movq %1, %%xmm4\n\t"
-            "movq %%xmm4, %0\n\t"
-            : "=m" (value)
-            : "m" (*ptr)
-            : "memory", "xmm4"
-        );
-#else
-        __asm__ __volatile__
-        (
-            "fildll %1\n\t"
-            "fistpll %0\n\t"
-            : "=m" (value)
-            : "m" (*ptr)
-            : "memory"
-        );
-#endif
-    }
-    else
-    {
-        // We don't care for comparison result here; the previous value will be stored into value anyway.
-        // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
-        __asm__ __volatile__
-        (
-            "movl %%ebx, %%eax\n\t"
-            "movl %%ecx, %%edx\n\t"
-            "lock; cmpxchg8b %[dest]"
-            : "=&A" (value)
-            : [dest] "m" (*ptr)
-            : "cc"
-        );
-    }
-
-    return value;
-}
-
-#endif
-
-#if defined(BOOST_ATOMIC_INT128_LOCK_FREE) && BOOST_ATOMIC_INT128_LOCK_FREE > 0
-
-template<typename T>
-inline bool
-platform_cmpxchg128_strong(T& expected, T desired, volatile T* ptr) BOOST_NOEXCEPT
-{
-    uint64_t const* p_desired = (uint64_t const*)&desired;
-    bool success;
-    __asm__ __volatile__
-    (
-        "lock; cmpxchg16b %[dest]\n\t"
-        "sete %[success]"
-        : "+A,A" (expected), [dest] "+m,m" (*ptr), [success] "=q,m" (success)
-        : "b,b" (p_desired[0]), "c,c" (p_desired[1])
-        : "memory", "cc"
-    );
-    return success;
-}
-
-template<typename T>
-inline void
-platform_store128(T value, volatile T* ptr) BOOST_NOEXCEPT
-{
-    uint64_t const* p_value = (uint64_t const*)&value;
-    __asm__ __volatile__
-    (
-        "movq 0(%[dest]), %%rax\n\t"
-        "movq 8(%[dest]), %%rdx\n\t"
-        ".align 16\n\t"
-        "1: lock; cmpxchg16b 0(%[dest])\n\t"
-        "jne 1b"
-        :
-        : "b" (p_value[0]), "c" (p_value[1]), [dest] "r" (ptr)
-        : "memory", "cc", "rax", "rdx"
-    );
-}
-
-template<typename T>
-inline T
-platform_load128(const volatile T* ptr) BOOST_NOEXCEPT
-{
-    T value;
-
-    // We don't care for comparison result here; the previous value will be stored into value anyway.
-    // Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
-    __asm__ __volatile__
-    (
-        "movq %%rbx, %%rax\n\t"
-        "movq %%rcx, %%rdx\n\t"
-        "lock; cmpxchg16b %[dest]"
-        : "=&A" (value)
-        : [dest] "m" (*ptr)
-        : "cc"
-    );
-
-    return value;
-}
-
-#endif // defined(BOOST_ATOMIC_INT128_LOCK_FREE) && BOOST_ATOMIC_INT128_LOCK_FREE > 0
-
-}
-}
-}
-
-/* pull in 64-bit atomic type using cmpxchg8b above */
-#if !defined(__x86_64__) && defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B)
-#include <boost/atomic/detail/cas64strong.hpp>
-#endif
-
-/* pull in 128-bit atomic type using cmpxchg16b above */
-#if defined(BOOST_ATOMIC_INT128_LOCK_FREE) && BOOST_ATOMIC_INT128_LOCK_FREE > 0
-#include <boost/atomic/detail/cas128strong.hpp>
-#endif
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/generic-cas.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP
-#define BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/base.hpp>
-#include <boost/atomic/detail/builder.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-/* fallback implementation for various compilation targets;
-this is *not* efficient, particularly because all operations
-are fully fenced (full memory barriers before and after
-each operation) */
-
-#if defined(__GNUC__)
-    namespace boost { namespace atomics { namespace detail {
-    inline int32_t
-    fenced_compare_exchange_strong_32(volatile int32_t *ptr, int32_t expected, int32_t desired)
-    {
-        return __sync_val_compare_and_swap_4(ptr, expected, desired);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS32 1
-
-    #if defined(__amd64__) || defined(__i686__)
-    inline int64_t
-    fenced_compare_exchange_strong_64(int64_t *ptr, int64_t expected, int64_t desired)
-    {
-        return __sync_val_compare_and_swap_8(ptr, expected, desired);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS64 1
-    #endif
-    }}}
-
-#elif defined(__ICL) || defined(_MSC_VER)
-
-    #if defined(_MSC_VER)
-    #include <Windows.h>
-    #include <intrin.h>
-    #endif
-
-    namespace boost { namespace atomics { namespace detail {
-    inline int32_t
-    fenced_compare_exchange_strong(int32_t *ptr, int32_t expected, int32_t desired)
-    {
-        return _InterlockedCompareExchange(reinterpret_cast<volatile long*>(ptr), desired, expected);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS32 1
-    #if defined(_WIN64)
-    inline int64_t
-    fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired)
-    {
-        return _InterlockedCompareExchange64(ptr, desired, expected);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS64 1
-    #endif
-    }}}
-
-#elif (defined(__ICC) || defined(__ECC))
-    namespace boost { namespace atomics { namespace detail {
-    inline int32_t
-    fenced_compare_exchange_strong_32(int32_t *ptr, int32_t expected, int32_t desired)
-    {
-        return _InterlockedCompareExchange((void*)ptr, desired, expected);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS32 1
-    #if defined(__x86_64)
-    inline int64_t
-    fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired)
-    {
-        return cas64<int>(ptr, expected, desired);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS64 1
-    #elif defined(__ECC)    //IA-64 version
-    inline int64_t
-    fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired)
-    {
-        return _InterlockedCompareExchange64((void*)ptr, desired, expected);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS64 1
-    #endif
-    }}}
-
-#elif (defined(__SUNPRO_CC) && defined(__sparc))
-    #include <sys/atomic.h>
-    namespace boost { namespace atomics { namespace detail {
-    inline int32_t
-    fenced_compare_exchange_strong_32(int32_t *ptr, int32_t expected, int32_t desired)
-    {
-        return atomic_cas_32((volatile unsigned int*)ptr, expected, desired);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS32 1
-
-    /* FIXME: check for 64 bit mode */
-    inline int64_t
-    fenced_compare_exchange_strong_64(int64_t *ptr, int64_t expected, int64_t desired)
-    {
-        return atomic_cas_64((volatile unsigned long long*)ptr, expected, desired);
-    }
-    #define BOOST_ATOMIC_HAVE_CAS64 1
-    }}}
-#endif
-
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-#ifdef BOOST_ATOMIC_HAVE_CAS32
-template<typename T>
-class atomic_generic_cas32
-{
-private:
-    typedef atomic_generic_cas32 this_type;
-public:
-    explicit atomic_generic_cas32(T v) : i((int32_t)v) {}
-    atomic_generic_cas32() {}
-    T load(memory_order order=memory_order_seq_cst) const volatile
-    {
-        T expected=(T)i;
-        do { } while(!const_cast<this_type *>(this)->compare_exchange_weak(expected, expected, order, memory_order_relaxed));
-        return expected;
-    }
-    void store(T v, memory_order order=memory_order_seq_cst) volatile
-    {
-        exchange(v);
-    }
-    bool compare_exchange_strong(
-        T &expected,
-        T desired,
-        memory_order success_order,
-        memory_order failure_order) volatile
-    {
-        T found;
-        found=(T)fenced_compare_exchange_strong_32(&i, (int32_t)expected, (int32_t)desired);
-        bool success=(found==expected);
-        expected=found;
-        return success;
-    }
-    bool compare_exchange_weak(
-        T &expected,
-        T desired,
-        memory_order success_order,
-        memory_order failure_order) volatile
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-    T exchange(T r, memory_order order=memory_order_seq_cst) volatile
-    {
-        T expected=(T)i;
-        do { } while(!compare_exchange_weak(expected, r, order, memory_order_relaxed));
-        return expected;
-    }
-
-    bool is_lock_free(void) const volatile {return true;}
-    typedef T integral_type;
-private:
-    mutable int32_t i;
-};
-
-template<typename T>
-class platform_atomic_integral<T, 4> :
-    public build_atomic_from_exchange<atomic_generic_cas32<T> >
-{
-public:
-    typedef build_atomic_from_exchange<atomic_generic_cas32<T> > super;
-    explicit platform_atomic_integral(T v) : super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-template<typename T>
-class platform_atomic_integral<T, 1> :
-   public build_atomic_from_larger_type<atomic_generic_cas32<int32_t>, T>
-{
-public:
-    typedef build_atomic_from_larger_type<atomic_generic_cas32<int32_t>, T> super;
-
-    explicit platform_atomic_integral(T v) : super(v) {}
-    platform_atomic_integral(void) {}
-};
-
-template<typename T>
-class platform_atomic_integral<T, 2> :
-    public build_atomic_from_larger_type<atomic_generic_cas32<int32_t>, T>
-{
-public:
-    typedef build_atomic_from_larger_type<atomic_generic_cas32<int32_t>, T> super;
-
-    explicit platform_atomic_integral(T v) : super(v) {}
-    platform_atomic_integral(void) {}
-};
-#endif
-
-} } }
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/int_sizes.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,140 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/int_sizes.hpp
+ *
+ * This header defines macros for testing buitin integer type sizes
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+// GCC and compatible compilers define internal macros with builtin type traits
+#if defined(__SIZEOF_SHORT__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__
+#endif
+#if defined(__SIZEOF_INT__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__
+#endif
+#if defined(__SIZEOF_LONG__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__
+#endif
+#if defined(__SIZEOF_LONG_LONG__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__
+#endif
+#if defined(__SIZEOF_WCHAR_T__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__
+#endif
+#if defined(__SIZEOF_POINTER__)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__
+#elif defined(_MSC_VER)
+#if defined(_M_AMD64) || defined(_M_IA64)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8
+#else
+#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4
+#endif
+#endif
+
+#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
+    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)
+
+// Try to deduce sizes from limits
+#include <limits.h>
+#include <boost/cstdint.hpp>
+
+#if (USHRT_MAX + 0) == 0xff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1
+#elif (USHRT_MAX + 0) == 0xffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2
+#elif (USHRT_MAX + 0) == 0xffffffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4
+#elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8
+#endif
+
+#if (UINT_MAX + 0) == 0xff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1
+#elif (UINT_MAX + 0) == 0xffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2
+#elif (UINT_MAX + 0) == 0xffffffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4
+#elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8
+#endif
+
+#if (ULONG_MAX + 0) == 0xff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1
+#elif (ULONG_MAX + 0) == 0xffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2
+#elif (ULONG_MAX + 0) == 0xffffffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4
+#elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8
+#endif
+
+#if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
+#else
+
+// The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp
+#if defined(ULLONG_MAX)
+#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX
+#elif defined(ULONG_LONG_MAX)
+#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX
+#elif defined(ULONGLONG_MAX)
+#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX
+#elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer
+#define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX
+#endif
+
+#if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1
+#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2
+#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4
+#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
+#endif
+
+#endif // defined(__hpux)
+
+#endif
+
+#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
+
+#include <wchar.h>
+#include <boost/cstdint.hpp>
+
+#if defined(_MSC_VER) && _MSC_VER <= 1310
+// MSVC 7.1 defines WCHAR_MAX to a value not suitable for constant expressions
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
+#elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
+#elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
+#elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4
+#elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff)
+#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8
+#endif
+#endif
+
+#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
+    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
+    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
+#error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers.
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/linux-arm.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_LINUX_ARM_HPP
-#define BOOST_ATOMIC_DETAIL_LINUX_ARM_HPP
-
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  Copyright (c) 2009, 2011 Helge Bahmann
-//  Copyright (c) 2009 Phil Endecott
-//  Copyright (c) 2013 Tim Blechmann
-//  Linux-specific code by Phil Endecott
-
-// Different ARM processors have different atomic instructions.  In particular,
-// architecture versions before v6 (which are still in widespread use, e.g. the
-// Intel/Marvell XScale chips like the one in the NSLU2) have only atomic swap.
-// On Linux the kernel provides some support that lets us abstract away from
-// these differences: it provides emulated CAS and barrier functions at special
-// addresses that are guaranteed not to be interrupted by the kernel.  Using
-// this facility is slightly slower than inline assembler would be, but much
-// faster than a system call.
-//
-// While this emulated CAS is "strong" in the sense that it does not fail
-// "spuriously" (i.e.: it never fails to perform the exchange when the value
-// found equals the value expected), it does not return the found value on
-// failure. To satisfy the atomic API, compare_exchange_{weak|strong} must
-// return the found value on failure, and we have to manually load this value
-// after the emulated CAS reports failure. This in turn introduces a race
-// between the CAS failing (due to the "wrong" value being found) and subsequently
-// loading (which might turn up the "right" value). From an application's
-// point of view this looks like "spurious failure", and therefore the
-// emulated CAS is only good enough to provide compare_exchange_weak
-// semantics.
-
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/memory_order.hpp>
-#include <boost/atomic/detail/config.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-inline void
-arm_barrier(void)
-{
-    void (*kernel_dmb)(void) = (void (*)(void)) 0xffff0fa0;
-    kernel_dmb();
-}
-
-inline void
-platform_fence_before(memory_order order)
-{
-    switch(order) {
-        case memory_order_release:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            arm_barrier();
-        case memory_order_consume:
-        default:;
-    }
-}
-
-inline void
-platform_fence_after(memory_order order)
-{
-    switch(order) {
-        case memory_order_acquire:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            arm_barrier();
-        default:;
-    }
-}
-
-inline void
-platform_fence_before_store(memory_order order)
-{
-    platform_fence_before(order);
-}
-
-inline void
-platform_fence_after_store(memory_order order)
-{
-    if (order == memory_order_seq_cst)
-        arm_barrier();
-}
-
-inline void
-platform_fence_after_load(memory_order order)
-{
-    platform_fence_after(order);
-}
-
-template<typename T>
-inline bool
-platform_cmpxchg32(T & expected, T desired, volatile T * ptr)
-{
-    typedef T (*kernel_cmpxchg32_t)(T oldval, T newval, volatile T * ptr);
-
-    if (((kernel_cmpxchg32_t) 0xffff0fc0)(expected, desired, ptr) == 0) {
-        return true;
-    } else {
-        expected = *ptr;
-        return false;
-    }
-}
-
-}
-}
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-inline void
-atomic_thread_fence(memory_order order)
-{
-    switch(order) {
-        case memory_order_acquire:
-        case memory_order_release:
-        case memory_order_acq_rel:
-        case memory_order_seq_cst:
-            atomics::detail::arm_barrier();
-        default:;
-    }
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-inline void
-atomic_signal_fence(memory_order)
-{
-    __asm__ __volatile__ ("" ::: "memory");
-}
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before_store(order);
-        const_cast<volatile uint32_t &>(v_) = 0;
-        atomics::detail::platform_fence_after_store(order);
-    }
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        uint32_t expected = v_;
-        do {
-            if (expected == 1)
-                break;
-        } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_));
-        atomics::detail::platform_fence_after(order);
-        return expected;
-    }
-};
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-}
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-#include <boost/atomic/detail/cas32weak.hpp>
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/operations.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/operations.hpp
+ *
+ * This header defines atomic operations, including the emulated version.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_
+
+#include <boost/atomic/detail/operations_lockfree.hpp>
+#include <boost/atomic/detail/ops_emulated.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/operations_fwd.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,34 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/operations_fwd.hpp
+ *
+ * This header contains forward declaration of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< unsigned int Size, bool Signed >
+struct operations;
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/operations_lockfree.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/operations_lockfree.hpp
+ *
+ * This header defines lockfree atomic operations.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/platform.hpp>
+
+#if !defined(BOOST_ATOMIC_EMULATED)
+#include BOOST_ATOMIC_DETAIL_HEADER(boost/atomic/detail/ops_)
+#else
+#include <boost/atomic/detail/operations_fwd.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_cas_based.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,91 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_cas_based.hpp
+ *
+ * This header contains CAS-based implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< typename Base >
+struct cas_based_operations :
+    public Base
+{
+    typedef typename Base::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, old_val + v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, old_val - v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, old_val & v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, old_val | v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        while (!Base::compare_exchange_weak(storage, old_val, old_val ^ v, order, memory_order_relaxed)) {}
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        Base::store(storage, (storage_type)0, order);
+    }
+};
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_emulated.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,149 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_emulated.hpp
+ *
+ * This header contains lockpool-based implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/detail/lockpool.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< typename T >
+struct emulated_operations
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        lockpool::scoped_lock lock(&storage);
+        const_cast< storage_type& >(storage) = v;
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
+    {
+        lockpool::scoped_lock lock(&storage);
+        return const_cast< storage_type const& >(storage);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s += v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s -= v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s = v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        const bool res = old_val == expected;
+        if (res)
+            s = desired;
+        expected = old_val;
+
+        return res;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s &= v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s |= v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type& s = const_cast< storage_type& >(storage);
+        lockpool::scoped_lock lock(&storage);
+        storage_type old_val = s;
+        s ^= v;
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return false;
+    }
+};
+
+template< unsigned int Size, bool Signed >
+struct operations :
+    public emulated_operations< typename make_storage_type< Size, Signed >::type >
+{
+};
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_extending_cas_based.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_extending_cas_based.hpp
+ *
+ * This header contains a boilerplate of the \c operations template implementation that requires sign/zero extension in arithmetic operations.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< typename Base, unsigned int Size, bool Signed >
+struct extending_cas_based_operations :
+    public Base
+{
+    typedef typename Base::storage_type storage_type;
+    typedef typename make_storage_type< Size, Signed >::type emulated_storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        emulated_storage_type new_val;
+        do
+        {
+            new_val = static_cast< emulated_storage_type >(old_val) + static_cast< emulated_storage_type >(v);
+        }
+        while (!Base::compare_exchange_weak(storage, old_val, static_cast< storage_type >(new_val), order, memory_order_relaxed));
+        return old_val;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type old_val = Base::load(storage, memory_order_relaxed);
+        emulated_storage_type new_val;
+        do
+        {
+            new_val = static_cast< emulated_storage_type >(old_val) - static_cast< emulated_storage_type >(v);
+        }
+        while (!Base::compare_exchange_weak(storage, old_val, static_cast< storage_type >(new_val), order, memory_order_relaxed));
+        return old_val;
+    }
+};
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_alpha.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,874 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_alpha.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+/*
+  Refer to http://h71000.www7.hp.com/doc/82final/5601/5601pro_004.html
+  (HP OpenVMS systems documentation) and the Alpha Architecture Reference Manual.
+ */
+
+/*
+    NB: The most natural thing would be to write the increment/decrement
+    operators along the following lines:
+
+    __asm__ __volatile__
+    (
+        "1: ldl_l %0,%1 \n"
+        "addl %0,1,%0 \n"
+        "stl_c %0,%1 \n"
+        "beq %0,1b\n"
+        : "=&b" (tmp)
+        : "m" (value)
+        : "cc"
+    );
+
+    However according to the comments on the HP website and matching
+    comments in the Linux kernel sources this defies branch prediction,
+    as the cpu assumes that backward branches are always taken; so
+    instead copy the trick from the Linux kernel, introduce a forward
+    branch and back again.
+
+    I have, however, had a hard time measuring the difference between
+    the two versions in microbenchmarks -- I am leaving it in nevertheless
+    as it apparently does not hurt either.
+*/
+
+struct gcc_alpha_operations_base
+{
+    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            __asm__ __volatile__ ("mb" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            __asm__ __volatile__ ("mb" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("mb" ::: "memory");
+    }
+};
+
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public gcc_alpha_operations_base
+{
+    typedef typename make_storage_type< 4u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "mov %3, %1\n"
+            "ldl_l %0, %2\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (tmp)        // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        int success;
+        storage_type current;
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %2, %4\n"                // current = *(&storage)
+            "cmpeq %2, %0, %3\n"            // success = current == expected
+            "mov %2, %0\n"                  // expected = current
+            "beq %3, 2f\n"                  // if (success == 0) goto end
+            "stl_c %1, %4\n"                // storage = desired; desired = store succeeded
+            "mov %1, %3\n"                  // success = desired
+            "2:\n"
+            : "+&r" (expected),  // %0
+              "+&r" (desired),   // %1
+              "=&r" (current),   // %2
+              "=&r" (success)    // %3
+            : "m" (storage)      // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        storage_type current, tmp;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "mov %5, %1\n"                  // tmp = desired
+            "ldl_l %2, %4\n"                // current = *(&storage)
+            "cmpeq %2, %0, %3\n"            // success = current == expected
+            "mov %2, %0\n"                  // expected = current
+            "beq %3, 2f\n"                  // if (success == 0) goto end
+            "stl_c %1, %4\n"                // storage = tmp; tmp = store succeeded
+            "beq %1, 3f\n"                  // if (tmp == 0) goto retry
+            "mov %1, %3\n"                  // success = tmp
+            "2:\n"
+
+            ".subsection 2\n"
+            "3: br 1b\n"
+            ".previous\n"
+
+            : "+&r" (expected),  // %0
+              "=&r" (tmp),       // %1
+              "=&r" (current),   // %2
+              "=&r" (success)    // %3
+            : "m" (storage),     // %4
+              "r" (desired)      // %5
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "addl %0, %3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "subl %0, %3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "and %0, %3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "bis %0, %3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "xor %0, %3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+
+template< >
+struct operations< 1u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "addl %0, %3, %1\n"
+            "zapnot %1, #1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "subl %0, %3, %1\n"
+            "zapnot %1, #1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 1u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "addl %0, %3, %1\n"
+            "sextb %1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "subl %0, %3, %1\n"
+            "sextb %1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+template< >
+struct operations< 2u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "addl %0, %3, %1\n"
+            "zapnot %1, #3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "subl %0, %3, %1\n"
+            "zapnot %1, #3, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 2u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "addl %0, %3, %1\n"
+            "sextw %1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldl_l %0, %2\n"
+            "subl %0, %3, %1\n"
+            "sextw %1, %1\n"
+            "stl_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public gcc_alpha_operations_base
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "mov %3, %1\n"
+            "ldq_l %0, %2\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (tmp)        // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        int success;
+        storage_type current;
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %2, %4\n"                // current = *(&storage)
+            "cmpeq %2, %0, %3\n"            // success = current == expected
+            "mov %2, %0\n"                  // expected = current
+            "beq %3, 2f\n"                  // if (success == 0) goto end
+            "stq_c %1, %4\n"                // storage = desired; desired = store succeeded
+            "mov %1, %3\n"                  // success = desired
+            "2:\n"
+            : "+&r" (expected),  // %0
+              "+&r" (desired),   // %1
+              "=&r" (current),   // %2
+              "=&r" (success)    // %3
+            : "m" (storage)      // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        storage_type current, tmp;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "mov %5, %1\n"                  // tmp = desired
+            "ldq_l %2, %4\n"                // current = *(&storage)
+            "cmpeq %2, %0, %3\n"            // success = current == expected
+            "mov %2, %0\n"                  // expected = current
+            "beq %3, 2f\n"                  // if (success == 0) goto end
+            "stq_c %1, %4\n"                // storage = tmp; tmp = store succeeded
+            "beq %1, 3f\n"                  // if (tmp == 0) goto retry
+            "mov %1, %3\n"                  // success = tmp
+            "2:\n"
+
+            ".subsection 2\n"
+            "3: br 1b\n"
+            ".previous\n"
+
+            : "+&r" (expected),  // %0
+              "=&r" (tmp),       // %1
+              "=&r" (current),   // %2
+              "=&r" (success)    // %3
+            : "m" (storage),     // %4
+              "r" (desired)      // %5
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %0, %2\n"
+            "addq %0, %3, %1\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %0, %2\n"
+            "subq %0, %3, %1\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %0, %2\n"
+            "and %0, %3, %1\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %0, %2\n"
+            "bis %0, %3, %1\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, modified;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldq_l %0, %2\n"
+            "xor %0, %3, %1\n"
+            "stq_c %1, %2\n"
+            "beq %1, 2f\n"
+
+            ".subsection 2\n"
+            "2: br 1b\n"
+            ".previous\n"
+
+            : "=&r" (original),  // %0
+              "=&r" (modified)   // %1
+            : "m" (storage),     // %2
+              "r" (v)            // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("mb" ::: "memory");
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,971 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_arm.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_
+
+#include <boost/cstdint.hpp>
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+// From the ARM Architecture Reference Manual for architecture v6:
+//
+// LDREX{<cond>} <Rd>, [<Rn>]
+// <Rd> Specifies the destination register for the memory word addressed by <Rd>
+// <Rn> Specifies the register containing the address.
+//
+// STREX{<cond>} <Rd>, <Rm>, [<Rn>]
+// <Rd> Specifies the destination register for the returned status value.
+//      0  if the operation updates memory
+//      1  if the operation fails to update memory
+// <Rm> Specifies the register containing the word to be stored to memory.
+// <Rn> Specifies the register containing the address.
+// Rd must not be the same register as Rm or Rn.
+//
+// ARM v7 is like ARM v6 plus:
+// There are half-word and byte versions of the LDREX and STREX instructions,
+// LDREXH, LDREXB, STREXH and STREXB.
+// There are also double-word versions, LDREXD and STREXD.
+// (Actually it looks like these are available from version 6k onwards.)
+// FIXME these are not yet used; should be mostly a matter of copy-and-paste.
+// I think you can supply an immediate offset to the address.
+//
+// A memory barrier is effected using a "co-processor 15" instruction,
+// though a separate assembler mnemonic is available for it in v7.
+//
+// "Thumb 1" is a subset of the ARM instruction set that uses a 16-bit encoding.  It
+// doesn't include all instructions and in particular it doesn't include the co-processor
+// instruction used for the memory barrier or the load-locked/store-conditional
+// instructions.  So, if we're compiling in "Thumb 1" mode, we need to wrap all of our
+// asm blocks with code to temporarily change to ARM mode.
+//
+// You can only change between ARM and Thumb modes when branching using the bx instruction.
+// bx takes an address specified in a register.  The least significant bit of the address
+// indicates the mode, so 1 is added to indicate that the destination code is Thumb.
+// A temporary register is needed for the address and is passed as an argument to these
+// macros.  It must be one of the "low" registers accessible to Thumb code, specified
+// using the "l" attribute in the asm statement.
+//
+// Architecture v7 introduces "Thumb 2", which does include (almost?) all of the ARM
+// instruction set.  (Actually, there was an extension of v6 called v6T2 which supported
+// "Thumb 2" mode, but its architecture manual is no longer available, referring to v7.)
+// So in v7 we don't need to change to ARM mode; we can write "universal
+// assembler" which will assemble to Thumb 2 or ARM code as appropriate.  The only thing
+// we need to do to make this "universal" assembler mode work is to insert "IT" instructions
+// to annotate the conditional instructions.  These are ignored in other modes (e.g. v6),
+// so they can always be present.
+
+// A note about memory_order_consume. Technically, this architecture allows to avoid
+// unnecessary memory barrier after consume load since it supports data dependency ordering.
+// However, some compiler optimizations may break a seemingly valid code relying on data
+// dependency tracking by injecting bogus branches to aid out of order execution.
+// This may happen not only in Boost.Atomic code but also in user's code, which we have no
+// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.
+// For this reason we promote memory_order_consume to memory_order_acquire.
+
+#if defined(__thumb__) && !defined(__thumb2__)
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_START(TMPREG) "adr " #TMPREG ", 8f\n" "bx " #TMPREG "\n" ".arm\n" ".align 4\n" "8:\n"
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_END(TMPREG)   "adr " #TMPREG ", 9f + 1\n" "bx " #TMPREG "\n" ".thumb\n" ".align 2\n" "9:\n"
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(var) "=&l" (var)
+#else
+// The tmpreg may be wasted in this case, which is non-optimal.
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_START(TMPREG)
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_END(TMPREG)
+#define BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(var) "=&r" (var)
+#endif
+
+struct gcc_arm_operations_base
+{
+    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT
+    {
+#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_DMB)
+        // Older binutils (supposedly, older than 2.21.1) didn't support symbolic or numeric arguments of the "dmb" instruction such as "ish" or "#11".
+        // As a workaround we have to inject encoded bytes of the instruction. There are two encodings for the instruction: ARM and Thumb. See ARM Architecture Reference Manual, A8.8.43.
+        // Since we cannot detect binutils version at compile time, we'll have to always use this hack.
+        __asm__ __volatile__
+        (
+#if defined(__thumb2__)
+            ".short 0xF3BF, 0x8F5B\n" // dmb ish
+#else
+            ".word 0xF57FF05B\n" // dmb ish
+#endif
+            :
+            :
+            : "memory"
+        );
+#else
+        int tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "mcr\tp15, 0, r0, c7, c10, 5\n"
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : "=&l" (tmp)
+            :
+            : "memory"
+        );
+#endif
+    }
+};
+
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public gcc_arm_operations_base
+{
+    typedef typename make_storage_type< 4u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original;
+        fence_before(order);
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex %[original], %[storage]\n"          // load the original value
+            "strex %[tmp], %[value], %[storage]\n"     // store the replacement, tmp = store failed
+            "teq   %[tmp], #0\n"                       // check if store succeeded
+            "bne   1b\n"
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [tmp] "=&l" (tmp), [original] "=&r" (original), [storage] "+Q" (storage)
+            : [value] "r" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        uint32_t success;
+        uint32_t tmp;
+        storage_type original;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "mov     %[success], #0\n"                      // success = 0
+            "ldrex   %[original], %[storage]\n"             // original = *(&storage)
+            "cmp     %[original], %[expected]\n"            // flags = original==expected
+            "itt     eq\n"                                  // [hint that the following 2 instructions are conditional on flags.equal]
+            "strexeq %[success], %[desired], %[storage]\n"  // if (flags.equal) *(&storage) = desired, success = store failed
+            "eoreq   %[success], %[success], #1\n"          // if (flags.equal) success ^= 1 (i.e. make it 1 if store succeeded)
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [success] "=&r" (success),    // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [expected] "r" (expected),    // %4
+              [desired] "r" (desired)       // %5
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = original;
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        uint32_t success;
+        uint32_t tmp;
+        storage_type original;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "mov     %[success], #0\n"                      // success = 0
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"             // original = *(&storage)
+            "cmp     %[original], %[expected]\n"            // flags = original==expected
+            "bne     2f\n"                                  // if (!flags.equal) goto end
+            "strex   %[success], %[desired], %[storage]\n"  // *(&storage) = desired, success = store failed
+            "eors    %[success], %[success], #1\n"          // success ^= 1 (i.e. make it 1 if store succeeded); flags.equal = success == 0
+            "beq     1b\n"                                  // if (flags.equal) goto retry
+            "2:\n"
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [success] "=&r" (success),    // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [expected] "r" (expected),    // %4
+              [desired] "r" (desired)       // %5
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = original;
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "add     %[result], %[original], %[value]\n"  // result = original + value
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "sub     %[result], %[original], %[value]\n"  // result = original - value
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "and     %[result], %[original], %[value]\n"  // result = original & value
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "orr     %[result], %[original], %[value]\n"  // result = original | value
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "eor     %[result], %[original], %[value]\n"  // result = original ^ value
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+
+template< >
+struct operations< 1u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "add     %[result], %[original], %[value]\n"  // result = original + value
+            "uxtb    %[result], %[result]\n"              // zero extend result from 8 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "sub     %[result], %[original], %[value]\n"  // result = original - value
+            "uxtb    %[result], %[result]\n"              // zero extend result from 8 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 1u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "add     %[result], %[original], %[value]\n"  // result = original + value
+            "sxtb    %[result], %[result]\n"              // sign extend result from 8 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "sub     %[result], %[original], %[value]\n"  // result = original - value
+            "sxtb    %[result], %[result]\n"              // sign extend result from 8 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+template< >
+struct operations< 2u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "add     %[result], %[original], %[value]\n"  // result = original + value
+            "uxth    %[result], %[result]\n"              // zero extend result from 16 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "sub     %[result], %[original], %[value]\n"  // result = original - value
+            "uxth    %[result], %[result]\n"              // zero extend result from 16 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 2u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "add     %[result], %[original], %[value]\n"  // result = original + value
+            "sxth    %[result], %[result]\n"              // sign extend result from 16 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        uint32_t tmp;
+        storage_type original, result;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])
+            "1:\n"
+            "ldrex   %[original], %[storage]\n"           // original = *(&storage)
+            "sub     %[result], %[original], %[value]\n"  // result = original - value
+            "sxth    %[result], %[result]\n"              // sign extend result from 16 to 32 bits
+            "strex   %[tmp], %[result], %[storage]\n"     // *(&storage) = result, tmp = store failed
+            "teq     %[tmp], #0\n"                        // flags = tmp==0
+            "bne     1b\n"                                // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])
+            : [original] "=&r" (original),  // %0
+              [result] "=&r" (result),      // %1
+              [tmp] "=&l" (tmp),            // %2
+              [storage] "+Q" (storage)      // %3
+            : [value] "r" (v)               // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)
+
+// Unlike 32-bit operations, for 64-bit loads and stores we must use ldrexd/strexd.
+// Any other instructions result in a non-atomic sequence of 32-bit accesses.
+// See "ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition",
+// Section A3.5.3 "Atomicity in the ARM architecture".
+
+// In the asm blocks below we have to use 32-bit register pairs to compose 64-bit values.
+// In order to pass the 64-bit operands to/from asm blocks, we use undocumented gcc feature:
+// the lower half (Rt) of the operand is accessible normally, via the numbered placeholder (e.g. %0),
+// and the upper half (Rt2) - via the same placeholder with an 'H' after the '%' sign (e.g. %H0).
+// See: http://hardwarebug.org/2010/07/06/arm-inline-asm-secrets/
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public gcc_arm_operations_base
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        exchange(storage, v, order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "ldrexd %1, %H1, [%2]\n"
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original)   // %1
+            : "r" (&storage)     // %2
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original;
+        fence_before(order);
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd %1, %H1, [%3]\n"        // load the original value
+            "strexd %0, %2, %H2, [%3]\n"    // store the replacement, tmp = store failed
+            "teq    %0, #0\n"               // check if store succeeded
+            "bne    1b\n"
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original)   // %1
+            : "r" (v),           // %2
+              "r" (&storage)     // %3
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        uint32_t tmp;
+        storage_type original, old_val = expected;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "ldrexd   %1, %H1, [%3]\n"               // original = *(&storage)
+            "cmp      %1, %2\n"                      // flags = original.lo==old_val.lo
+            "ittt     eq\n"                          // [hint that the following 3 instructions are conditional on flags.equal]
+            "cmpeq    %H1, %H2\n"                    // if (flags.equal) flags = original.hi==old_val.hi
+            "strexdeq %0, %4, %H4, [%3]\n"           // if (flags.equal) *(&storage) = desired, tmp = store failed
+            "teqeq    %0, #0\n"                      // if (flags.equal) flags = tmp==0
+            "ite      eq\n"                          // [hint that the following 2 instructions are conditional on flags.equal]
+            "moveq    %2, #1\n"                      // if (flags.equal) old_val.lo = 1
+            "movne    %2, #0\n"                      // if (!flags.equal) old_val.lo = 0
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "+r" (old_val)     // %2
+            : "r" (&storage),    // %3
+              "r" (desired)      // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        const uint32_t success = (uint32_t)old_val;
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = original;
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        uint32_t tmp;
+        storage_type original, old_val = expected;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "cmp     %1, %2\n"                      // flags = original.lo==old_val.lo
+            "it      eq\n"                          // [hint that the following instruction is conditional on flags.equal]
+            "cmpeq   %H1, %H2\n"                    // if (flags.equal) flags = original.hi==old_val.hi
+            "bne     2f\n"                          // if (!flags.equal) goto end
+            "strexd  %0, %4, %H4, [%3]\n"           // *(&storage) = desired, tmp = store failed
+            "teq     %0, #0\n"                      // flags.equal = tmp == 0
+            "bne     1b\n"                          // if (flags.equal) goto retry
+            "2:\n"
+            "ite      eq\n"                         // [hint that the following 2 instructions are conditional on flags.equal]
+            "moveq    %2, #1\n"                     // if (flags.equal) old_val.lo = 1
+            "movne    %2, #0\n"                     // if (!flags.equal) old_val.lo = 0
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "+r" (old_val)     // %2
+            : "r" (&storage),    // %3
+              "r" (desired)      // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        const uint32_t success = (uint32_t)old_val;
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = original;
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage_type original, result;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "adds    %2, %1, %4\n"                  // result = original + value
+            "adc     %H2, %H1, %H4\n"
+            "strexd  %0, %2, %H2, [%3]\n"           // *(&storage) = result, tmp = store failed
+            "teq     %0, #0\n"                      // flags = tmp==0
+            "bne     1b\n"                          // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "=&r" (result)     // %2
+            : "r" (&storage),    // %3
+              "r" (v)            // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage_type original, result;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "subs    %2, %1, %4\n"                  // result = original - value
+            "sbc     %H2, %H1, %H4\n"
+            "strexd  %0, %2, %H2, [%3]\n"           // *(&storage) = result, tmp = store failed
+            "teq     %0, #0\n"                      // flags = tmp==0
+            "bne     1b\n"                          // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "=&r" (result)     // %2
+            : "r" (&storage),    // %3
+              "r" (v)            // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage_type original, result;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "and     %2, %1, %4\n"                  // result = original & value
+            "and     %H2, %H1, %H4\n"
+            "strexd  %0, %2, %H2, [%3]\n"           // *(&storage) = result, tmp = store failed
+            "teq     %0, #0\n"                      // flags = tmp==0
+            "bne     1b\n"                          // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "=&r" (result)     // %2
+            : "r" (&storage),    // %3
+              "r" (v)            // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage_type original, result;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "orr     %2, %1, %4\n"                  // result = original | value
+            "orr     %H2, %H1, %H4\n"
+            "strexd  %0, %2, %H2, [%3]\n"           // *(&storage) = result, tmp = store failed
+            "teq     %0, #0\n"                      // flags = tmp==0
+            "bne     1b\n"                          // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "=&r" (result)     // %2
+            : "r" (&storage),    // %3
+              "r" (v)            // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        storage_type original, result;
+        uint32_t tmp;
+        __asm__ __volatile__
+        (
+            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)
+            "1:\n"
+            "ldrexd  %1, %H1, [%3]\n"               // original = *(&storage)
+            "eor     %2, %1, %4\n"                  // result = original ^ value
+            "eor     %H2, %H1, %H4\n"
+            "strexd  %0, %2, %H2, [%3]\n"           // *(&storage) = result, tmp = store failed
+            "teq     %0, #0\n"                      // flags = tmp==0
+            "bne     1b\n"                          // if (!flags.equal) goto retry
+            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)
+            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0
+              "=&r" (original),  // %1
+              "=&r" (result)     // %2
+            : "r" (&storage),    // %3
+              "r" (v)            // %4
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+#endif // defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)
+
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        gcc_arm_operations_base::hardware_full_fence();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_atomic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,380 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_atomic.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#if defined(__clang__) && (defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B))
+#include <boost/atomic/detail/ops_gcc_x86_dcas.hpp>
+#include <boost/atomic/detail/ops_cas_based.hpp>
+#endif
+
+#if __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE || __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE ||\
+    __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE || __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE ||\
+    __GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE || __GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE ||\
+    __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE
+// There are platforms where we need to use larger storage types
+#include <boost/atomic/detail/int_sizes.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__INTEL_COMPILER)
+// This is used to suppress warning #32013 described below for Intel Compiler.
+// In debug builds the compiler does not inline any functions, so basically
+// every atomic function call results in this warning. I don't know any other
+// way to selectively disable just this one warning.
+#pragma system_header
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+/*!
+ * The function converts \c boost::memory_order values to the compiler-specific constants.
+ *
+ * NOTE: The intention is that the function is optimized away by the compiler, and the
+ *       compiler-specific constants are passed to the intrinsics. I know constexpr doesn't
+ *       work in this case because the standard atomics interface require memory ordering
+ *       constants to be passed as function arguments, at which point they stop being constexpr.
+ *       However it is crucial that the compiler sees constants and not runtime values,
+ *       because otherwise it just ignores the ordering value and always uses seq_cst.
+ *       This is the case with Intel C++ Compiler 14.0.3 (Composer XE 2013 SP1, update 3) and
+ *       gcc 4.8.2. Intel Compiler issues a warning in this case:
+ *
+ *       warning #32013: Invalid memory order specified. Defaulting to seq_cst memory order.
+ *
+ *       while gcc acts silently.
+ *
+ *       To mitigate the problem ALL functions, including the atomic<> members must be
+ *       declared with BOOST_FORCEINLINE. In this case the compilers are able to see that
+ *       all functions are called with constant orderings and call intrinstcts properly.
+ *
+ *       Unfortunately, this still doesn't work in debug mode as the compiler doesn't
+ *       inline functions even when marked with BOOST_FORCEINLINE. In this case all atomic
+ *       operaions will be executed with seq_cst semantics.
+ */
+BOOST_FORCEINLINE BOOST_CONSTEXPR int convert_memory_order_to_gcc(memory_order order) BOOST_NOEXCEPT
+{
+    return (order == memory_order_relaxed ? __ATOMIC_RELAXED : (order == memory_order_consume ? __ATOMIC_CONSUME :
+        (order == memory_order_acquire ? __ATOMIC_ACQUIRE : (order == memory_order_release ? __ATOMIC_RELEASE :
+        (order == memory_order_acq_rel ? __ATOMIC_ACQ_REL : __ATOMIC_SEQ_CST)))));
+}
+
+template< typename T >
+struct gcc_atomic_operations
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        __atomic_store_n(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_load_n(&storage, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_fetch_add(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_fetch_sub(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_exchange_n(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return __atomic_compare_exchange_n
+        (
+            &storage, &expected, desired, false,
+            atomics::detail::convert_memory_order_to_gcc(success_order),
+            atomics::detail::convert_memory_order_to_gcc(failure_order)
+        );
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return __atomic_compare_exchange_n
+        (
+            &storage, &expected, desired, true,
+            atomics::detail::convert_memory_order_to_gcc(success_order),
+            atomics::detail::convert_memory_order_to_gcc(failure_order)
+        );
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_fetch_and(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_fetch_or(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_fetch_xor(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return __atomic_test_and_set(&storage, atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        __atomic_clear(const_cast< storage_type* >(&storage), atomics::detail::convert_memory_order_to_gcc(order));
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile& storage) BOOST_NOEXCEPT
+    {
+        return __atomic_is_lock_free(sizeof(storage_type), &storage);
+    }
+};
+
+#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
+#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149
+// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+template< bool Signed >
+struct operations< 16u, Signed > :
+    public cas_based_operations< gcc_dcas_x86_64< Signed > >
+{
+};
+
+#else
+
+template< bool Signed >
+struct operations< 16u, Signed > :
+    public gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >
+{
+};
+
+#endif
+#endif
+
+
+#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
+#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+
+// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public cas_based_operations< gcc_dcas_x86< Signed > >
+{
+};
+
+#elif (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
+
+#define BOOST_ATOMIC_DETAIL_INT64_EXTENDED
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
+{
+};
+
+#else
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >
+{
+};
+
+#endif
+#endif
+
+#if BOOST_ATOMIC_INT32_LOCK_FREE > 0
+#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
+
+#define BOOST_ATOMIC_DETAIL_INT32_EXTENDED
+
+#if !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >
+{
+};
+
+#else // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
+{
+};
+
+#endif // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
+
+#else
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >
+{
+};
+
+#endif
+#endif
+
+#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
+#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
+
+#define BOOST_ATOMIC_DETAIL_INT16_EXTENDED
+
+#if !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >
+{
+};
+
+#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >
+{
+};
+
+#else
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
+{
+};
+
+#endif
+
+#else
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >
+{
+};
+
+#endif
+#endif
+
+#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
+#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
+    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE) ||\
+    (__GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE) ||\
+    (__GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE)
+
+#if !defined(BOOST_ATOMIC_DETAIL_INT16_EXTENDED)
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >
+{
+};
+
+#elif !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >
+{
+};
+
+#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >
+{
+};
+
+#else
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
+{
+};
+
+#endif
+
+#else
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public gcc_atomic_operations< typename make_storage_type< 1u, Signed >::type >
+{
+};
+
+#endif
+#endif
+
+#undef BOOST_ATOMIC_DETAIL_INT16_EXTENDED
+#undef BOOST_ATOMIC_DETAIL_INT32_EXTENDED
+#undef BOOST_ATOMIC_DETAIL_INT64_EXTENDED
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    __atomic_thread_fence(atomics::detail::convert_memory_order_to_gcc(order));
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    __atomic_signal_fence(atomics::detail::convert_memory_order_to_gcc(order));
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_ppc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,775 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_ppc.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+/*
+    Refer to: Motorola: "Programming Environments Manual for 32-Bit
+    Implementations of the PowerPC Architecture", Appendix E:
+    "Synchronization Programming Examples" for an explanation of what is
+    going on here (can be found on the web at various places by the
+    name "MPCFPE32B.pdf", Google is your friend...)
+
+    Most of the atomic operations map to instructions in a relatively
+    straight-forward fashion, but "load"s may at first glance appear
+    a bit strange as they map to:
+
+            lwz %rX, addr
+            cmpw %rX, %rX
+            bne- 1f
+        1:
+
+    That is, the CPU is forced to perform a branch that "formally" depends
+    on the value retrieved from memory. This scheme has an overhead of
+    about 1-2 clock cycles per load, but it allows to map "acquire" to
+    the "isync" instruction instead of "sync" uniformly and for all type
+    of atomic operations. Since "isync" has a cost of about 15 clock
+    cycles, while "sync" hast a cost of about 50 clock cycles, the small
+    penalty to atomic loads more than compensates for this.
+
+    Byte- and halfword-sized atomic values are realized by encoding the
+    value to be represented into a word, performing sign/zero extension
+    as appropriate. This means that after add/sub operations the value
+    needs fixing up to accurately preserve the wrap-around semantic of
+    the smaller type. (Nothing special needs to be done for the bit-wise
+    and the "exchange type" operators as the compiler already sees to
+    it that values carried in registers are extended appropriately and
+    everything falls into place naturally).
+
+    The register constraint "b"  instructs gcc to use any register
+    except r0; this is sometimes required because the encoding for
+    r0 is used to signify "constant zero" in a number of instructions,
+    making r0 unusable in this place. For simplicity this constraint
+    is used everywhere since I am to lazy to look this up on a
+    per-instruction basis, and ppc has enough registers for this not
+    to pose a problem.
+*/
+
+// A note about memory_order_consume. Technically, this architecture allows to avoid
+// unnecessary memory barrier after consume load since it supports data dependency ordering.
+// However, some compiler optimizations may break a seemingly valid code relying on data
+// dependency tracking by injecting bogus branches to aid out of order execution.
+// This may happen not only in Boost.Atomic code but also in user's code, which we have no
+// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.
+// For this reason we promote memory_order_consume to memory_order_acquire.
+
+struct gcc_ppc_operations_base
+{
+    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
+    {
+#if defined(__powerpc64__)
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("sync" ::: "memory");
+        else if ((order & memory_order_release) != 0)
+            __asm__ __volatile__ ("lwsync" ::: "memory");
+#else
+        if ((order & memory_order_release) != 0)
+            __asm__ __volatile__ ("sync" ::: "memory");
+#endif
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            __asm__ __volatile__ ("isync" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("sync" ::: "memory");
+    }
+};
+
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public gcc_ppc_operations_base
+{
+    typedef typename make_storage_type< 4u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "stw %1, %0\n"
+            : "+m" (storage)
+            : "r" (v)
+        );
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v;
+        __asm__ __volatile__
+        (
+            "lwz %0, %1\n"
+            "cmpw %0, %0\n"
+            "bne- 1f\n"
+            "1:\n"
+            : "=&r" (v)
+            : "m" (storage)
+            : "cr0"
+        );
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y1\n"
+            "stwcx. %2,%y1\n"
+            "bne- 1b\n"
+            : "=&b" (original), "+Z" (storage)
+            : "b" (v)
+            : "cr0"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "li %1, 0\n"
+            "lwarx %0,%y2\n"
+            "cmpw %0, %3\n"
+            "bne- 1f\n"
+            "stwcx. %4,%y2\n"
+            "bne- 1f\n"
+            "li %1, 1\n"
+            "1:"
+            : "=&b" (expected), "=&b" (success), "+Z" (storage)
+            : "b" (expected), "b" (desired)
+            : "cr0"
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "li %1, 0\n"
+            "0: lwarx %0,%y2\n"
+            "cmpw %0, %3\n"
+            "bne- 1f\n"
+            "stwcx. %4,%y2\n"
+            "bne- 0b\n"
+            "li %1, 1\n"
+            "1:"
+            : "=&b" (expected), "=&b" (success), "+Z" (storage)
+            : "b" (expected), "b" (desired)
+            : "cr0"
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "and %1,%0,%3\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "or %1,%0,%3\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "xor %1,%0,%3\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+
+template< >
+struct operations< 1u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "rlwinm %1, %1, 0, 0xff\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "rlwinm %1, %1, 0, 0xff\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 1u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "extsb %1, %1\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "extsb %1, %1\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+template< >
+struct operations< 2u, false > :
+    public operations< 4u, false >
+{
+    typedef operations< 4u, false > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "rlwinm %1, %1, 0, 0xffff\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "rlwinm %1, %1, 0, 0xffff\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+template< >
+struct operations< 2u, true > :
+    public operations< 4u, true >
+{
+    typedef operations< 4u, true > base_type;
+    typedef base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "extsh %1, %1\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "lwarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "extsh %1, %1\n"
+            "stwcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+};
+
+
+#if defined(__powerpc64__)
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public gcc_ppc_operations_base
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "std %1, %0\n"
+            : "+m" (storage)
+            : "r" (v)
+        );
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v;
+        __asm__ __volatile__
+        (
+            "ld %0, %1\n"
+            "cmpd %0, %0\n"
+            "bne- 1f\n"
+            "1:\n"
+            : "=&b" (v)
+            : "m" (storage)
+            : "cr0"
+        );
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y1\n"
+            "stdcx. %2,%y1\n"
+            "bne- 1b\n"
+            : "=&b" (original), "+Z" (storage)
+            : "b" (v)
+            : "cr0"
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "li %1, 0\n"
+            "ldarx %0,%y2\n"
+            "cmpd %0, %3\n"
+            "bne- 1f\n"
+            "stdcx. %4,%y2\n"
+            "bne- 1f\n"
+            "li %1, 1\n"
+            "1:"
+            : "=&b" (expected), "=&b" (success), "+Z" (storage)
+            : "b" (expected), "b" (desired)
+            : "cr0"
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        int success;
+        fence_before(success_order);
+        __asm__ __volatile__
+        (
+            "li %1, 0\n"
+            "0: ldarx %0,%y2\n"
+            "cmpd %0, %3\n"
+            "bne- 1f\n"
+            "stdcx. %4,%y2\n"
+            "bne- 0b\n"
+            "li %1, 1\n"
+            "1:"
+            : "=&b" (expected), "=&b" (success), "+Z" (storage)
+            : "b" (expected), "b" (desired)
+            : "cr0"
+        );
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        return !!success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y2\n"
+            "add %1,%0,%3\n"
+            "stdcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y2\n"
+            "sub %1,%0,%3\n"
+            "stdcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y2\n"
+            "and %1,%0,%3\n"
+            "stdcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y2\n"
+            "or %1,%0,%3\n"
+            "stdcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type original, tmp;
+        fence_before(order);
+        __asm__ __volatile__
+        (
+            "1:\n"
+            "ldarx %0,%y2\n"
+            "xor %1,%0,%3\n"
+            "stdcx. %1,%y2\n"
+            "bne- 1b\n"
+            : "=&b" (original), "=&b" (tmp), "+Z" (storage)
+            : "b" (v)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
+        );
+        fence_after(order);
+        return original;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, 0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+#endif // defined(__powerpc64__)
+
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    switch (order)
+    {
+    case memory_order_consume:
+    case memory_order_acquire:
+        __asm__ __volatile__ ("isync" ::: "memory");
+        break;
+    case memory_order_release:
+#if defined(__powerpc64__)
+        __asm__ __volatile__ ("lwsync" ::: "memory");
+        break;
+#endif
+    case memory_order_acq_rel:
+    case memory_order_seq_cst:
+        __asm__ __volatile__ ("sync" ::: "memory");
+        break;
+    default:;
+    }
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_sparc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,245 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2010 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_sparc.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/ops_cas_based.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+struct gcc_sparc_cas_base
+{
+    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("membar #Sync" ::: "memory");
+        else if ((order & memory_order_release) != 0)
+            __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("membar #Sync" ::: "memory");
+        else if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __asm__ __volatile__ ("membar #Sync" ::: "memory");
+    }
+};
+
+template< bool Signed >
+struct gcc_sparc_cas32 :
+    public gcc_sparc_cas_base
+{
+    typedef typename make_storage_type< 4u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before_store(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        storage_type previous = expected;
+        __asm__ __volatile__
+        (
+            "cas [%1], %2, %0"
+            : "+r" (desired)
+            : "r" (&storage), "r" (previous)
+            : "memory"
+        );
+        const bool success = (desired == previous);
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = desired;
+        return success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public cas_based_operations< gcc_sparc_cas32< Signed > >
+{
+    typedef cas_based_operations< gcc_sparc_cas32< Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        __asm__ __volatile__
+        (
+            "swap [%1], %0"
+            : "+r" (v)
+            : "r" (&storage)
+            : "memory"
+        );
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!exchange(storage, (storage_type)1, order);
+    }
+};
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >
+{
+};
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >
+{
+};
+
+template< bool Signed >
+struct gcc_sparc_cas64 :
+    public gcc_sparc_cas_base
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before_store(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        fence_before(success_order);
+        storage_type previous = expected;
+        __asm__ __volatile__
+        (
+            "casx [%1], %2, %0"
+            : "+r" (desired)
+            : "r" (&storage), "r" (previous)
+            : "memory"
+        );
+        const bool success = (desired == previous);
+        if (success)
+            fence_after(success_order);
+        else
+            fence_after(failure_order);
+        expected = desired;
+        return success;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public cas_based_operations< gcc_sparc_cas64< Signed > >
+{
+};
+
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    switch (order)
+    {
+    case memory_order_release:
+        __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
+        break;
+    case memory_order_consume:
+    case memory_order_acquire:
+        __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
+        break;
+    case memory_order_acq_rel:
+        __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore" ::: "memory");
+        break;
+    case memory_order_seq_cst:
+        __asm__ __volatile__ ("membar #Sync" ::: "memory");
+        break;
+    case memory_order_relaxed:
+    default:
+        break;
+    }
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_sync.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,237 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2011 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_sync.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+struct gcc_sync_operations_base
+{
+    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            __sync_synchronize();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            __sync_synchronize();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & (memory_order_acquire | memory_order_consume)) != 0)
+            __sync_synchronize();
+    }
+};
+
+template< typename T >
+struct gcc_sync_operations :
+    public gcc_sync_operations_base
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before_store(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return __sync_fetch_and_add(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return __sync_fetch_and_sub(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        // GCC docs mention that not all architectures may support full exchange semantics for this intrinsic. However, GCC's implementation of
+        // std::atomic<> uses this intrinsic unconditionally. We do so as well. In case if some architectures actually don't support this, we can always
+        // add a check here and fall back to a CAS loop.
+        if ((order & memory_order_release) != 0)
+            __sync_synchronize();
+        return __sync_lock_test_and_set(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type expected2 = expected;
+        storage_type old_val = __sync_val_compare_and_swap(&storage, expected2, desired);
+
+        if (old_val == expected2)
+        {
+            return true;
+        }
+        else
+        {
+            expected = old_val;
+            return false;
+        }
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return __sync_fetch_and_and(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return __sync_fetch_and_or(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return __sync_fetch_and_xor(&storage, v);
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            __sync_synchronize();
+        return !!__sync_lock_test_and_set(&storage, 1);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        __sync_lock_release(&storage);
+        if (order == memory_order_seq_cst)
+            __sync_synchronize();
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
+template< bool Signed >
+struct operations< 1u, Signed > :
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)
+    public gcc_sync_operations< typename make_storage_type< 1u, Signed >::type >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >
+#else
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
+#endif
+{
+};
+#endif
+
+#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
+template< bool Signed >
+struct operations< 2u, Signed > :
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
+    public gcc_sync_operations< typename make_storage_type< 2u, Signed >::type >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >
+#else
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
+#endif
+{
+};
+#endif
+
+#if BOOST_ATOMIC_INT32_LOCK_FREE > 0
+template< bool Signed >
+struct operations< 4u, Signed > :
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+    public gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >
+#else
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
+#endif
+{
+};
+#endif
+
+#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
+template< bool Signed >
+struct operations< 8u, Signed > :
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+    public gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >
+#else
+    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
+#endif
+{
+};
+#endif
+
+#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
+template< bool Signed >
+struct operations< 16u, Signed > :
+    public gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >
+{
+};
+#endif
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __sync_synchronize();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_x86.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,510 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_x86.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+#include <boost/atomic/detail/ops_gcc_x86_dcas.hpp>
+#include <boost/atomic/detail/ops_cas_based.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(__x86_64__)
+#define BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "rdx"
+#else
+#define BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "edx"
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+struct gcc_x86_operations_base
+{
+    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            __asm__ __volatile__ ("" ::: "memory");
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_acquire) != 0)
+            __asm__ __volatile__ ("" ::: "memory");
+    }
+};
+
+template< typename T, typename Derived >
+struct gcc_x86_operations :
+    public gcc_x86_operations_base
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        if (order != memory_order_seq_cst)
+        {
+            fence_before(order);
+            storage = v;
+            fence_after(order);
+        }
+        else
+        {
+            Derived::exchange(storage, v, order);
+        }
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        return Derived::fetch_add(storage, -v, order);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!Derived::exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public gcc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >
+{
+    typedef gcc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "lock; xaddb %0, %1"
+            : "+q" (v), "+m" (storage)
+            :
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "xchgb %0, %1"
+            : "+q" (v), "+m" (storage)
+            :
+            : "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchgb %3, %1\n\t"
+            "sete %2"
+            : "+a" (previous), "+m" (storage), "=q" (success)
+            : "q" (desired)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        expected = previous;
+        return success;
+    }
+
+#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\
+    __asm__ __volatile__\
+    (\
+        "xor %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER ", %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "\n\t"\
+        ".align 16\n\t"\
+        "1: movb %[arg], %%dl\n\t"\
+        op " %%al, %%dl\n\t"\
+        "lock; cmpxchgb %%dl, %[storage]\n\t"\
+        "jne 1b"\
+        : [res] "+a" (result), [storage] "+m" (storage)\
+        : [arg] "q" (argument)\
+        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, "memory"\
+    )
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("andb", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("orb", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("xorb", v, res);
+        return res;
+    }
+
+#undef BOOST_ATOMIC_DETAIL_CAS_LOOP
+};
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public gcc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >
+{
+    typedef gcc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "lock; xaddw %0, %1"
+            : "+q" (v), "+m" (storage)
+            :
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "xchgw %0, %1"
+            : "+q" (v), "+m" (storage)
+            :
+            : "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchgw %3, %1\n\t"
+            "sete %2"
+            : "+a" (previous), "+m" (storage), "=q" (success)
+            : "q" (desired)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        expected = previous;
+        return success;
+    }
+
+#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\
+    __asm__ __volatile__\
+    (\
+        "xor %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER ", %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "\n\t"\
+        ".align 16\n\t"\
+        "1: movw %[arg], %%dx\n\t"\
+        op " %%ax, %%dx\n\t"\
+        "lock; cmpxchgw %%dx, %[storage]\n\t"\
+        "jne 1b"\
+        : [res] "+a" (result), [storage] "+m" (storage)\
+        : [arg] "q" (argument)\
+        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, "memory"\
+    )
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("andw", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("orw", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("xorw", v, res);
+        return res;
+    }
+
+#undef BOOST_ATOMIC_DETAIL_CAS_LOOP
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public gcc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >
+{
+    typedef gcc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "lock; xaddl %0, %1"
+            : "+r" (v), "+m" (storage)
+            :
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "xchgl %0, %1"
+            : "+r" (v), "+m" (storage)
+            :
+            : "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchgl %3, %1\n\t"
+            "sete %2"
+            : "+a" (previous), "+m" (storage), "=q" (success)
+            : "r" (desired)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        expected = previous;
+        return success;
+    }
+
+#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\
+    __asm__ __volatile__\
+    (\
+        "xor %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER ", %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "\n\t"\
+        ".align 16\n\t"\
+        "1: movl %[arg], %%edx\n\t"\
+        op " %%eax, %%edx\n\t"\
+        "lock; cmpxchgl %%edx, %[storage]\n\t"\
+        "jne 1b"\
+        : [res] "+a" (result), [storage] "+m" (storage)\
+        : [arg] "r" (argument)\
+        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, "memory"\
+    )
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("andl", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("orl", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("xorl", v, res);
+        return res;
+    }
+
+#undef BOOST_ATOMIC_DETAIL_CAS_LOOP
+};
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public cas_based_operations< gcc_dcas_x86< Signed > >
+{
+};
+
+#elif defined(__x86_64__)
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public gcc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >
+{
+    typedef gcc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "lock; xaddq %0, %1"
+            : "+r" (v), "+m" (storage)
+            :
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        __asm__ __volatile__
+        (
+            "xchgq %0, %1"
+            : "+r" (v), "+m" (storage)
+            :
+            : "memory"
+        );
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchgq %3, %1\n\t"
+            "sete %2"
+            : "+a" (previous), "+m" (storage), "=q" (success)
+            : "r" (desired)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        expected = previous;
+        return success;
+    }
+
+#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\
+    __asm__ __volatile__\
+    (\
+        "xor %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER ", %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "\n\t"\
+        ".align 16\n\t"\
+        "1: movq %[arg], %%rdx\n\t"\
+        op " %%rax, %%rdx\n\t"\
+        "lock; cmpxchgq %%rdx, %[storage]\n\t"\
+        "jne 1b"\
+        : [res] "+a" (result), [storage] "+m" (storage)\
+        : [arg] "r" (argument)\
+        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, "memory"\
+    )
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("andq", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("orq", v, res);
+        return res;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        BOOST_ATOMIC_DETAIL_CAS_LOOP("xorq", v, res);
+        return res;
+    }
+
+#undef BOOST_ATOMIC_DETAIL_CAS_LOOP
+};
+
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+template< bool Signed >
+struct operations< 16u, Signed > :
+    public cas_based_operations< gcc_dcas_x86_64< Signed > >
+{
+};
+
+#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order == memory_order_seq_cst)
+    {
+        __asm__ __volatile__
+        (
+#if defined(__x86_64__) || defined(__SSE2__)
+            "mfence\n"
+#else
+            "lock; addl $0, (%%esp)\n"
+#endif
+            ::: "memory"
+        );
+    }
+    else if ((order & (memory_order_acquire | memory_order_release)) != 0)
+    {
+        __asm__ __volatile__ ("" ::: "memory");
+    }
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#undef BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_gcc_x86_dcas.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,332 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_gcc_x86_dcas.hpp
+ *
+ * This header contains implementation of the double-width CAS primitive for x86.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_
+
+#include <boost/cstdint.hpp>
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/capabilities.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+
+template< bool Signed >
+struct gcc_dcas_x86
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        if ((((uint32_t)&storage) & 0x00000007) == 0)
+        {
+#if defined(__SSE2__)
+            __asm__ __volatile__
+            (
+#if defined(__AVX__)
+                "vmovq %1, %%xmm4\n\t"
+                "vmovq %%xmm4, %0\n\t"
+#else
+                "movq %1, %%xmm4\n\t"
+                "movq %%xmm4, %0\n\t"
+#endif
+                : "=m" (storage)
+                : "m" (v)
+                : "memory", "xmm4"
+            );
+#else
+            __asm__ __volatile__
+            (
+                "fildll %1\n\t"
+                "fistpll %0\n\t"
+                : "=m" (storage)
+                : "m" (v)
+                : "memory"
+            );
+#endif
+        }
+        else
+        {
+#if defined(__PIC__)
+            uint32_t scratch;
+            __asm__ __volatile__
+            (
+                "movl %%ebx, %[scratch]\n\t"
+                "movl %[value_lo], %%ebx\n\t"
+                "movl 0(%[dest]), %%eax\n\t"
+                "movl 4(%[dest]), %%edx\n\t"
+                ".align 16\n\t"
+                "1: lock; cmpxchg8b 0(%[dest])\n\t"
+                "jne 1b\n\t"
+                "movl %[scratch], %%ebx"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+                : [scratch] "=m,m" (scratch)
+                : [value_lo] "a,a" ((uint32_t)v), "c,c" ((uint32_t)(v >> 32)), [dest] "D,S" (&storage)
+#else
+                : [scratch] "=m" (scratch)
+                : [value_lo] "a" ((uint32_t)v), "c" ((uint32_t)(v >> 32)), [dest] "D" (&storage)
+#endif
+                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "edx", "memory"
+            );
+#else
+            __asm__ __volatile__
+            (
+                "movl 0(%[dest]), %%eax\n\t"
+                "movl 4(%[dest]), %%edx\n\t"
+                ".align 16\n\t"
+                "1: lock; cmpxchg8b 0(%[dest])\n\t"
+                "jne 1b\n\t"
+                :
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+                : [value_lo] "b,b" ((uint32_t)v), "c,c" ((uint32_t)(v >> 32)), [dest] "D,S" (&storage)
+#else
+                : [value_lo] "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32)), [dest] "D" (&storage)
+#endif
+                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "eax", "edx", "memory"
+            );
+#endif
+        }
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type value;
+
+        if ((((uint32_t)&storage) & 0x00000007) == 0)
+        {
+#if defined(__SSE2__)
+            __asm__ __volatile__
+            (
+#if defined(__AVX__)
+                "vmovq %1, %%xmm4\n\t"
+                "vmovq %%xmm4, %0\n\t"
+#else
+                "movq %1, %%xmm4\n\t"
+                "movq %%xmm4, %0\n\t"
+#endif
+                : "=m" (value)
+                : "m" (storage)
+                : "memory", "xmm4"
+            );
+#else
+            __asm__ __volatile__
+            (
+                "fildll %1\n\t"
+                "fistpll %0\n\t"
+                : "=m" (value)
+                : "m" (storage)
+                : "memory"
+            );
+#endif
+        }
+        else
+        {
+#if defined(__clang__)
+            // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
+            value = __sync_val_compare_and_swap(&storage, (storage_type)0, (storage_type)0);
+#else
+            // We don't care for comparison result here; the previous value will be stored into value anyway.
+            // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
+            __asm__ __volatile__
+            (
+                "movl %%ebx, %%eax\n\t"
+                "movl %%ecx, %%edx\n\t"
+                "lock; cmpxchg8b %[storage]"
+                : "=&A" (value)
+                : [storage] "m" (storage)
+                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+            );
+#endif
+        }
+
+        return value;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+#if defined(__clang__)
+        // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
+        storage_type old_expected = expected;
+        expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
+        return expected == old_expected;
+#elif defined(__PIC__)
+        // Make sure ebx is saved and restored properly in case
+        // of position independent code. To make this work
+        // setup register constraints such that ebx can not be
+        // used by accident e.g. as base address for the variable
+        // to be modified. Accessing "scratch" should always be okay,
+        // as it can only be placed on the stack (and therefore
+        // accessed through ebp or esp only).
+        //
+        // In theory, could push/pop ebx onto/off the stack, but movs
+        // to a prepared stack slot turn out to be faster.
+
+        uint32_t scratch;
+        bool success;
+        __asm__ __volatile__
+        (
+            "movl %%ebx, %[scratch]\n\t"
+            "movl %[desired_lo], %%ebx\n\t"
+            "lock; cmpxchg8b %[dest]\n\t"
+            "movl %[scratch], %%ebx\n\t"
+            "sete %[success]"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+            : "+A,A,A,A,A,A" (expected), [dest] "+m,m,m,m,m,m" (storage), [scratch] "=m,m,m,m,m,m" (scratch), [success] "=q,m,q,m,q,m" (success)
+            : [desired_lo] "S,S,D,D,m,m" ((uint32_t)desired), "c,c,c,c,c,c" ((uint32_t)(desired >> 32))
+#else
+            : "+A" (expected), [dest] "+m" (storage), [scratch] "=m" (scratch), [success] "=q" (success)
+            : [desired_lo] "S" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32))
+#endif
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return success;
+#else
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchg8b %[dest]\n\t"
+            "sete %[success]"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+            : "+A,A" (expected), [dest] "+m,m" (storage), [success] "=q,m" (success)
+            : "b,b" ((uint32_t)desired), "c,c" ((uint32_t)(desired >> 32))
+#else
+            : "+A" (expected), [dest] "+m" (storage), [success] "=q" (success)
+            : "b" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32))
+#endif
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return success;
+#endif
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+template< bool Signed >
+struct gcc_dcas_x86_64
+{
+    typedef typename make_storage_type< 16u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        uint64_t const* p_value = (uint64_t const*)&v;
+        __asm__ __volatile__
+        (
+            "movq 0(%[dest]), %%rax\n\t"
+            "movq 8(%[dest]), %%rdx\n\t"
+            ".align 16\n\t"
+            "1: lock; cmpxchg16b 0(%[dest])\n\t"
+            "jne 1b"
+            :
+            : "b" (p_value[0]), "c" (p_value[1]), [dest] "r" (&storage)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "rax", "rdx", "memory"
+        );
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
+    {
+#if defined(__clang__)
+        // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
+        storage_type value = storage_type();
+        return __sync_val_compare_and_swap(&storage, value, value);
+#else
+        storage_type value;
+
+        // We don't care for comparison result here; the previous value will be stored into value anyway.
+        // Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
+        __asm__ __volatile__
+        (
+            "movq %%rbx, %%rax\n\t"
+            "movq %%rcx, %%rdx\n\t"
+            "lock; cmpxchg16b %[storage]"
+            : "=&A" (value)
+            : [storage] "m" (storage)
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+
+        return value;
+#endif
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+#if defined(__clang__)
+        // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
+        storage_type old_expected = expected;
+        expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
+        return expected == old_expected;
+#else
+        uint64_t const* p_desired = (uint64_t const*)&desired;
+        bool success;
+        __asm__ __volatile__
+        (
+            "lock; cmpxchg16b %[dest]\n\t"
+            "sete %[success]"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+            : "+A,A" (expected), [dest] "+m,m" (storage), [success] "=q,m" (success)
+            : "b,b" (p_desired[0]), "c,c" (p_desired[1])
+#else
+            : "+A" (expected), [dest] "+m" (storage), [success] "=q" (success)
+            : "b" (p_desired[0]), "c" (p_desired[1])
+#endif
+            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+        );
+        return success;
+#endif
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_linux_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,177 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009, 2011 Helge Bahmann
+ * Copyright (c) 2009 Phil Endecott
+ * Copyright (c) 2013 Tim Blechmann
+ * Linux-specific code by Phil Endecott
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_linux_arm.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/ops_cas_based.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+// Different ARM processors have different atomic instructions.  In particular,
+// architecture versions before v6 (which are still in widespread use, e.g. the
+// Intel/Marvell XScale chips like the one in the NSLU2) have only atomic swap.
+// On Linux the kernel provides some support that lets us abstract away from
+// these differences: it provides emulated CAS and barrier functions at special
+// addresses that are guaranteed not to be interrupted by the kernel.  Using
+// this facility is slightly slower than inline assembler would be, but much
+// faster than a system call.
+//
+// While this emulated CAS is "strong" in the sense that it does not fail
+// "spuriously" (i.e.: it never fails to perform the exchange when the value
+// found equals the value expected), it does not return the found value on
+// failure. To satisfy the atomic API, compare_exchange_{weak|strong} must
+// return the found value on failure, and we have to manually load this value
+// after the emulated CAS reports failure. This in turn introduces a race
+// between the CAS failing (due to the "wrong" value being found) and subsequently
+// loading (which might turn up the "right" value). From an application's
+// point of view this looks like "spurious failure", and therefore the
+// emulated CAS is only good enough to provide compare_exchange_weak
+// semantics.
+
+struct linux_arm_cas_base
+{
+    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & memory_order_release) != 0)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        if (order == memory_order_seq_cst)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT
+    {
+        if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            hardware_full_fence();
+    }
+
+    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT
+    {
+        typedef void (*kernel_dmb_t)(void);
+        ((kernel_dmb_t)0xffff0fa0)();
+    }
+};
+
+template< bool Signed >
+struct linux_arm_cas :
+    public linux_arm_cas_base
+{
+    typedef typename make_storage_type< 4u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        fence_before_store(order);
+        storage = v;
+        fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        while (true)
+        {
+            storage_type tmp = expected;
+            if (compare_exchange_weak(storage, tmp, desired, success_order, failure_order))
+                return true;
+            if (tmp != expected)
+            {
+                expected = tmp;
+                return false;
+            }
+        }
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        typedef storage_type (*kernel_cmpxchg32_t)(storage_type oldval, storage_type newval, volatile storage_type* ptr);
+
+        if (((kernel_cmpxchg32_t)0xffff0fc0)(expected, desired, &storage) == 0)
+        {
+            return true;
+        }
+        else
+        {
+            expected = storage;
+            return false;
+        }
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< cas_based_operations< linux_arm_cas< Signed > >, 1u, Signed >
+{
+};
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< cas_based_operations< linux_arm_cas< Signed > >, 2u, Signed >
+{
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public cas_based_operations< linux_arm_cas< Signed > >
+{
+};
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        linux_arm_cas_base::hardware_full_fence();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        __asm__ __volatile__ ("" ::: "memory");
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_arm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,820 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_msvc_arm.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_
+
+#include <intrin.h>
+#include <boost/memory_order.hpp>
+#include <boost/type_traits/make_signed.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/interlocked.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/ops_msvc_common.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#define BOOST_ATOMIC_DETAIL_ARM_LOAD8(p) __iso_volatile_load8((const volatile __int8*)(p))
+#define BOOST_ATOMIC_DETAIL_ARM_LOAD16(p) __iso_volatile_load16((const volatile __int16*)(p))
+#define BOOST_ATOMIC_DETAIL_ARM_LOAD32(p) __iso_volatile_load32((const volatile __int32*)(p))
+#define BOOST_ATOMIC_DETAIL_ARM_LOAD64(p) __iso_volatile_load64((const volatile __int64*)(p))
+#define BOOST_ATOMIC_DETAIL_ARM_STORE8(p, v) __iso_volatile_store8((volatile __int8*)(p), (__int8)(v))
+#define BOOST_ATOMIC_DETAIL_ARM_STORE16(p, v) __iso_volatile_store16((volatile __int16*)(p), (__int16)(v))
+#define BOOST_ATOMIC_DETAIL_ARM_STORE32(p, v) __iso_volatile_store32((volatile __int32*)(p), (__int32)(v))
+#define BOOST_ATOMIC_DETAIL_ARM_STORE64(p, v) __iso_volatile_store64((volatile __int64*)(p), (__int64)(v))
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+// A note about memory_order_consume. Technically, this architecture allows to avoid
+// unnecessary memory barrier after consume load since it supports data dependency ordering.
+// However, some compiler optimizations may break a seemingly valid code relying on data
+// dependency tracking by injecting bogus branches to aid out of order execution.
+// This may happen not only in Boost.Atomic code but also in user's code, which we have no
+// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.
+// For this reason we promote memory_order_consume to memory_order_acquire.
+
+struct msvc_arm_operations_base
+{
+    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT
+    {
+        __dmb(0xB); // _ARM_BARRIER_ISH, see armintr.h from MSVC 11 and later
+    }
+
+    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+        if ((order & memory_order_release) != 0)
+            hardware_full_fence();
+
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+        if (order == memory_order_seq_cst)
+            hardware_full_fence();
+
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+        if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+            hardware_full_fence();
+
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE BOOST_CONSTEXPR memory_order cas_common_order(memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        // Combine order flags together and promote memory_order_consume to memory_order_acquire
+        return static_cast< memory_order >(((failure_order | success_order) & ~memory_order_consume) | (((failure_order | success_order) & memory_order_consume) << 1u));
+    }
+};
+
+template< typename T, typename Derived >
+struct msvc_arm_operations :
+    public msvc_arm_operations_base
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        typedef typename make_signed< storage_type >::type signed_storage_type;
+        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!Derived::exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        Derived::store(storage, (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public msvc_arm_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >
+{
+    typedef msvc_arm_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before_store(order);
+        BOOST_ATOMIC_DETAIL_ARM_STORE8(&storage, v);
+        base_type::fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD8(&storage);
+        base_type::fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected, old_val;
+
+        switch (cas_common_order(success_order, failure_order))
+        {
+        case memory_order_relaxed:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELAXED(&storage, desired, previous));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_ACQUIRE(&storage, desired, previous));
+            break;
+        case memory_order_release:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELEASE(&storage, desired, previous));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&storage, desired, previous));
+            break;
+        }
+        expected = old_val;
+
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8(&storage, v));
+            break;
+        }
+        return v;
+    }
+};
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public msvc_arm_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >
+{
+    typedef msvc_arm_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before_store(order);
+        BOOST_ATOMIC_DETAIL_ARM_STORE16(&storage, v);
+        base_type::fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD16(&storage);
+        base_type::fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected, old_val;
+
+        switch (cas_common_order(success_order, failure_order))
+        {
+        case memory_order_relaxed:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELAXED(&storage, desired, previous));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_ACQUIRE(&storage, desired, previous));
+            break;
+        case memory_order_release:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELEASE(&storage, desired, previous));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&storage, desired, previous));
+            break;
+        }
+        expected = old_val;
+
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16(&storage, v));
+            break;
+        }
+        return v;
+    }
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public msvc_arm_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >
+{
+    typedef msvc_arm_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before_store(order);
+        BOOST_ATOMIC_DETAIL_ARM_STORE32(&storage, v);
+        base_type::fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD32(&storage);
+        base_type::fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected, old_val;
+
+        switch (cas_common_order(success_order, failure_order))
+        {
+        case memory_order_relaxed:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELAXED(&storage, desired, previous));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_ACQUIRE(&storage, desired, previous));
+            break;
+        case memory_order_release:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELEASE(&storage, desired, previous));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));
+            break;
+        }
+        expected = old_val;
+
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));
+            break;
+        }
+        return v;
+    }
+};
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public msvc_arm_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >
+{
+    typedef msvc_arm_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before_store(order);
+        BOOST_ATOMIC_DETAIL_ARM_STORE64(&storage, v);
+        base_type::fence_after_store(order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD64(&storage);
+        base_type::fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected, old_val;
+
+        switch (cas_common_order(success_order, failure_order))
+        {
+        case memory_order_relaxed:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELAXED(&storage, desired, previous));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_ACQUIRE(&storage, desired, previous));
+            break;
+        case memory_order_release:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELEASE(&storage, desired, previous));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&storage, desired, previous));
+            break;
+        }
+        expected = old_val;
+
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64(&storage, v));
+            break;
+        }
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        switch (order)
+        {
+        case memory_order_relaxed:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_RELAXED(&storage, v));
+            break;
+        case memory_order_consume:
+        case memory_order_acquire:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_ACQUIRE(&storage, v));
+            break;
+        case memory_order_release:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_RELEASE(&storage, v));
+            break;
+        case memory_order_acq_rel:
+        case memory_order_seq_cst:
+        default:
+            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64(&storage, v));
+            break;
+        }
+        return v;
+    }
+};
+
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    if (order != memory_order_relaxed)
+        msvc_arm_operations_base::hardware_full_fence();
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#undef BOOST_ATOMIC_DETAIL_ARM_LOAD8
+#undef BOOST_ATOMIC_DETAIL_ARM_LOAD16
+#undef BOOST_ATOMIC_DETAIL_ARM_LOAD32
+#undef BOOST_ATOMIC_DETAIL_ARM_LOAD64
+#undef BOOST_ATOMIC_DETAIL_ARM_STORE8
+#undef BOOST_ATOMIC_DETAIL_ARM_STORE16
+#undef BOOST_ATOMIC_DETAIL_ARM_STORE32
+#undef BOOST_ATOMIC_DETAIL_ARM_STORE64
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_common.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_msvc_common.hpp
+ *
+ * This header contains common tools for MSVC implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+// Define compiler barriers
+#if defined(__INTEL_COMPILER)
+#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER() __memory_barrier()
+#elif defined(_MSC_VER) && !defined(_WIN32_WCE)
+extern "C" void _ReadWriteBarrier(void);
+#pragma intrinsic(_ReadWriteBarrier)
+#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER() _ReadWriteBarrier()
+#endif
+
+#ifndef BOOST_ATOMIC_DETAIL_COMPILER_BARRIER
+#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER()
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_msvc_x86.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,879 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_msvc_x86.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/type_traits/make_signed.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/interlocked.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+#include <boost/cstdint.hpp>
+#include <boost/atomic/detail/ops_cas_based.hpp>
+#endif
+#include <boost/atomic/detail/ops_msvc_common.hpp>
+#if !defined(_M_IX86) && !(defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8) && defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16))
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+// frame pointer register 'ebx' modified by inline assembly code. See the note below.
+#pragma warning(disable: 4731)
+#endif
+
+#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
+extern "C" void _mm_mfence(void);
+#if defined(BOOST_MSVC)
+#pragma intrinsic(_mm_mfence)
+#endif
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+/*
+ * Implementation note for asm blocks.
+ *
+ * http://msdn.microsoft.com/en-us/data/k1a8ss06%28v=vs.105%29
+ *
+ * Some SSE types require eight-byte stack alignment, forcing the compiler to emit dynamic stack-alignment code.
+ * To be able to access both the local variables and the function parameters after the alignment, the compiler
+ * maintains two frame pointers. If the compiler performs frame pointer omission (FPO), it will use EBP and ESP.
+ * If the compiler does not perform FPO, it will use EBX and EBP. To ensure code runs correctly, do not modify EBX
+ * in asm code if the function requires dynamic stack alignment as it could modify the frame pointer.
+ * Either move the eight-byte aligned types out of the function, or avoid using EBX.
+ *
+ * Since we have no way of knowing that the compiler uses FPO, we have to always save and restore ebx
+ * whenever we have to clobber it. Additionally, we disable warning C4731 above so that the compiler
+ * doesn't spam about ebx use.
+ */
+
+struct msvc_x86_operations_base
+{
+    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT
+    {
+#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
+        // Use mfence only if SSE2 is available
+        _mm_mfence();
+#else
+        long tmp;
+        BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&tmp, 0);
+#endif
+    }
+
+    static BOOST_FORCEINLINE void fence_before(memory_order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE void fence_after_load(memory_order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+        // On x86 and x86_64 there is no need for a hardware barrier,
+        // even if seq_cst memory order is requested, because all
+        // seq_cst writes are implemented with lock-prefixed operations
+        // or xchg which has implied lock prefix. Therefore normal loads
+        // are already ordered with seq_cst stores on these architectures.
+    }
+};
+
+template< typename T, typename Derived >
+struct msvc_x86_operations :
+    public msvc_x86_operations_base
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        if (order != memory_order_seq_cst)
+        {
+            fence_before(order);
+            storage = v;
+            fence_after(order);
+        }
+        else
+        {
+            Derived::exchange(storage, v, order);
+        }
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type v = storage;
+        fence_after_load(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        typedef typename make_signed< storage_type >::type signed_storage_type;
+        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!Derived::exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));
+        expected = old_val;
+        return (previous == old_val);
+    }
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_AND)
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));
+    }
+#else
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res & v, order, memory_order_relaxed)) {}
+        return res;
+    }
+#endif
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_OR)
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));
+    }
+#else
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res | v, order, memory_order_relaxed)) {}
+        return res;
+    }
+#endif
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_XOR)
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));
+    }
+#else
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res ^ v, order, memory_order_relaxed)) {}
+        return res;
+    }
+#endif
+};
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8)
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&storage, desired, previous));
+        expected = old_val;
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8(&storage, v));
+    }
+};
+
+#elif defined(_M_IX86)
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        __asm
+        {
+            mov edx, storage
+            movzx eax, v
+            lock xadd byte ptr [edx], al
+            mov v, al
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        __asm
+        {
+            mov edx, storage
+            movzx eax, v
+            xchg byte ptr [edx], al
+            mov v, al
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(success_order);
+        bool success;
+        __asm
+        {
+            mov esi, expected
+            mov edi, storage
+            movzx eax, byte ptr [esi]
+            movzx edx, desired
+            lock cmpxchg byte ptr [edi], dl
+            mov byte ptr [esi], al
+            sete success
+        };
+        // The success and failure fences are equivalent anyway
+        base_type::fence_after(success_order);
+        return success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, byte ptr [edi]
+            align 16
+        again:
+            mov dl, al
+            and dl, bl
+            lock cmpxchg byte ptr [edi], dl
+            jne again
+            mov v, al
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, byte ptr [edi]
+            align 16
+        again:
+            mov dl, al
+            or dl, bl
+            lock cmpxchg byte ptr [edi], dl
+            jne again
+            mov v, al
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, byte ptr [edi]
+            align 16
+        again:
+            mov dl, al
+            xor dl, bl
+            lock cmpxchg byte ptr [edi], dl
+            jne again
+            mov v, al
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+};
+
+#else
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >
+{
+};
+
+#endif
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16)
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&storage, desired, previous));
+        expected = old_val;
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16(&storage, v));
+    }
+};
+
+#elif defined(_M_IX86)
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        __asm
+        {
+            mov edx, storage
+            movzx eax, v
+            lock xadd word ptr [edx], ax
+            mov v, ax
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        __asm
+        {
+            mov edx, storage
+            movzx eax, v
+            xchg word ptr [edx], ax
+            mov v, ax
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(success_order);
+        bool success;
+        __asm
+        {
+            mov esi, expected
+            mov edi, storage
+            movzx eax, word ptr [esi]
+            movzx edx, desired
+            lock cmpxchg word ptr [edi], dx
+            mov word ptr [esi], ax
+            sete success
+        };
+        // The success and failure fences are equivalent anyway
+        base_type::fence_after(success_order);
+        return success;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, word ptr [edi]
+            align 16
+        again:
+            mov dx, ax
+            and dx, bx
+            lock cmpxchg word ptr [edi], dx
+            jne again
+            mov v, ax
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, word ptr [edi]
+            align 16
+        again:
+            mov dx, ax
+            or dx, bx
+            lock cmpxchg word ptr [edi], dx
+            jne again
+            mov v, ax
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            xor edx, edx
+            mov edi, storage
+            movzx ebx, v
+            movzx eax, word ptr [edi]
+            align 16
+        again:
+            mov dx, ax
+            xor dx, bx
+            lock cmpxchg word ptr [edi], dx
+            jne again
+            mov v, ax
+            mov ebx, backup
+        };
+        base_type::fence_after(order);
+        return v;
+    }
+};
+
+#else
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >
+{
+};
+
+#endif
+
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
+
+template< bool Signed >
+struct msvc_dcas_x86
+{
+    typedef typename make_storage_type< 8u, Signed >::type storage_type;
+
+    // Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, 8.1.1. Guaranteed Atomic Operations:
+    //
+    // The Pentium processor (and newer processors since) guarantees that the following additional memory operations will always be carried out atomically:
+    // * Reading or writing a quadword aligned on a 64-bit boundary
+    //
+    // Luckily, the memory is almost always 8-byte aligned in our case because atomic<> uses 64 bit native types for storage and dynamic memory allocations
+    // have at least 8 byte alignment. The only unfortunate case is when atomic is placeod on the stack and it is not 8-byte aligned (like on 32 bit Windows).
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type volatile* p = &storage;
+        if (((uint32_t)p & 0x00000007) == 0)
+        {
+#if defined(_M_IX86_FP) && _M_IX86_FP >= 2
+#if defined(__AVX__)
+            __asm
+            {
+                mov edx, p
+                vmovq xmm4, v
+                vmovq qword ptr [edx], xmm4
+            };
+#else
+            __asm
+            {
+                mov edx, p
+                movq xmm4, v
+                movq qword ptr [edx], xmm4
+            };
+#endif
+#else
+            __asm
+            {
+                mov edx, p
+                fild v
+                fistp qword ptr [edx]
+            };
+#endif
+        }
+        else
+        {
+            int backup;
+            __asm
+            {
+                mov backup, ebx
+                mov edi, p
+                mov ebx, dword ptr [v]
+                mov ecx, dword ptr [v + 4]
+                mov eax, dword ptr [edi]
+                mov edx, dword ptr [edi + 4]
+                align 16
+            again:
+                lock cmpxchg8b qword ptr [edi]
+                jne again
+                mov ebx, backup
+            };
+        }
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type const volatile* p = &storage;
+        storage_type value;
+
+        if (((uint32_t)p & 0x00000007) == 0)
+        {
+#if defined(_M_IX86_FP) && _M_IX86_FP >= 2
+#if defined(__AVX__)
+            __asm
+            {
+                mov edx, p
+                vmovq xmm4, qword ptr [edx]
+                vmovq value, xmm4
+            };
+#else
+            __asm
+            {
+                mov edx, p
+                movq xmm4, qword ptr [edx]
+                movq value, xmm4
+            };
+#endif
+#else
+            __asm
+            {
+                mov edx, p
+                fild qword ptr [edx]
+                fistp value
+            };
+#endif
+        }
+        else
+        {
+            // We don't care for comparison result here; the previous value will be stored into value anyway.
+            // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
+            __asm
+            {
+                mov edi, p
+                mov eax, ebx
+                mov edx, ecx
+                lock cmpxchg8b qword ptr [edi]
+                mov dword ptr [value], eax
+                mov dword ptr [value + 4], edx
+            };
+        }
+
+        return value;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type volatile* p = &storage;
+#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64)
+        const storage_type old_val = (storage_type)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(p, desired, expected);
+        const bool result = (old_val == expected);
+        expected = old_val;
+        return result;
+#else
+        bool result;
+        int backup;
+        __asm
+        {
+            mov backup, ebx
+            mov edi, p
+            mov esi, expected
+            mov ebx, dword ptr [desired]
+            mov ecx, dword ptr [desired + 4]
+            mov eax, dword ptr [esi]
+            mov edx, dword ptr [esi + 4]
+            lock cmpxchg8b qword ptr [edi]
+            mov dword ptr [esi], eax
+            mov dword ptr [esi + 4], edx
+            mov ebx, backup
+            sete result
+        };
+        return result;
+#endif
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public cas_based_operations< msvc_dcas_x86< Signed > >
+{
+};
+
+#elif defined(_M_AMD64)
+
+template< bool Signed >
+struct operations< 8u, Signed > :
+    public msvc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >
+{
+    typedef msvc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&storage, desired, previous));
+        expected = old_val;
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64(&storage, v));
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64(&storage, v));
+    }
+};
+
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+template< bool Signed >
+struct msvc_dcas_x86_64
+{
+    typedef typename make_storage_type< 16u, Signed >::type storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type value = const_cast< storage_type& >(storage);
+        while (!BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, v, &value)) {}
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
+    {
+        storage_type value = storage_type();
+        BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, value, &value);
+        return value;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
+    {
+        return !!BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, desired, &expected);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 16u, Signed > :
+    public cas_based_operations< msvc_dcas_x86_64< Signed > >
+{
+};
+
+#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    if (order == memory_order_seq_cst)
+        msvc_x86_operations_base::hardware_full_fence();
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/ops_windows.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,215 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/ops_windows.hpp
+ *
+ * This header contains implementation of the \c operations template.
+ *
+ * This implementation is the most basic version for Windows. It should
+ * work for any non-MSVC-like compilers as long as there are Interlocked WinAPI
+ * functions available. This version is also used for WinCE.
+ *
+ * Notably, this implementation is not as efficient as other
+ * versions based on compiler intrinsics.
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/type_traits/make_signed.hpp>
+#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/interlocked.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/operations_fwd.hpp>
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/ops_msvc_common.hpp>
+#include <boost/atomic/detail/ops_extending_cas_based.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+struct windows_operations_base
+{
+    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT
+    {
+        long tmp;
+        BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&tmp, 0);
+    }
+
+    static BOOST_FORCEINLINE void fence_before(memory_order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+
+    static BOOST_FORCEINLINE void fence_after(memory_order) BOOST_NOEXCEPT
+    {
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    }
+};
+
+template< typename T, typename Derived >
+struct windows_operations :
+    public windows_operations_base
+{
+    typedef T storage_type;
+
+    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        Derived::exchange(storage, v, order);
+    }
+
+    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return Derived::fetch_add(const_cast< storage_type volatile& >(storage), (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        typedef typename make_signed< storage_type >::type signed_storage_type;
+        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_weak(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+    }
+
+    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        return !!Derived::exchange(storage, (storage_type)1, order);
+    }
+
+    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+    {
+        store(storage, (storage_type)0, order);
+    }
+
+    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
+    {
+        return true;
+    }
+};
+
+template< bool Signed >
+struct operations< 4u, Signed > :
+    public windows_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >
+{
+    typedef windows_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
+    typedef typename base_type::storage_type storage_type;
+
+    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));
+        base_type::fence_after(order);
+        return v;
+    }
+
+    static BOOST_FORCEINLINE bool compare_exchange_strong(
+        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
+    {
+        storage_type previous = expected;
+        base_type::fence_before(success_order);
+        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));
+        expected = old_val;
+        // The success and failure fences are the same anyway
+        base_type::fence_after(success_order);
+        return (previous == old_val);
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+#if defined(BOOST_ATOMIC_INTERLOCKED_AND)
+        base_type::fence_before(order);
+        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));
+        base_type::fence_after(order);
+        return v;
+#else
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res & v, order, memory_order_relaxed)) {}
+        return res;
+#endif
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+#if defined(BOOST_ATOMIC_INTERLOCKED_OR)
+        base_type::fence_before(order);
+        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));
+        base_type::fence_after(order);
+        return v;
+#else
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res | v, order, memory_order_relaxed)) {}
+        return res;
+#endif
+    }
+
+    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+    {
+#if defined(BOOST_ATOMIC_INTERLOCKED_XOR)
+        base_type::fence_before(order);
+        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));
+        base_type::fence_after(order);
+        return v;
+#else
+        storage_type res = storage;
+        while (!compare_exchange_strong(storage, res, res ^ v, order, memory_order_relaxed)) {}
+        return res;
+#endif
+    }
+};
+
+template< bool Signed >
+struct operations< 1u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >
+{
+};
+
+template< bool Signed >
+struct operations< 2u, Signed > :
+    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >
+{
+};
+
+BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+    if (order == memory_order_seq_cst)
+        windows_operations_base::hardware_full_fence();
+    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    if (order != memory_order_relaxed)
+        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/pause.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,43 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * (C) Copyright 2013 Tim Blechmann
+ * (C) Copyright 2013 Andrey Semashev
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_
+
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86))
+extern "C" void _mm_pause(void);
+#if defined(BOOST_MSVC)
+#pragma intrinsic(_mm_pause)
+#endif
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+BOOST_FORCEINLINE void pause() BOOST_NOEXCEPT
+{
+#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86))
+    _mm_pause();
+#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+    __asm__ __volatile__("pause;");
+#endif
+}
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/detail/storage_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,168 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2009 Helge Bahmann
+ * Copyright (c) 2012 Tim Blechmann
+ * Copyright (c) 2013 - 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/detail/storage_type.hpp
+ *
+ * This header defines underlying types used as storage
+ */
+
+#ifndef BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_
+
+#include <cstring>
+#include <boost/cstdint.hpp>
+#include <boost/atomic/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace atomics {
+namespace detail {
+
+template< unsigned int Size >
+struct buffer_storage
+{
+    unsigned char data[Size];
+
+    BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT
+    {
+        bool result = true;
+        for (unsigned int i = 0; i < Size && result; ++i)
+        {
+            result &= data[i] == 0;
+        }
+        return result;
+    }
+
+    BOOST_FORCEINLINE bool operator== (buffer_storage const& that) const BOOST_NOEXCEPT
+    {
+        return std::memcmp(data, that.data, Size) == 0;
+    }
+
+    BOOST_FORCEINLINE bool operator!= (buffer_storage const& that) const BOOST_NOEXCEPT
+    {
+        return std::memcmp(data, that.data, Size) != 0;
+    }
+};
+
+template< unsigned int Size, bool Signed >
+struct make_storage_type
+{
+    typedef buffer_storage< Size > type;
+};
+
+template< >
+struct make_storage_type< 1u, false >
+{
+    typedef boost::uint8_t type;
+};
+
+template< >
+struct make_storage_type< 1u, true >
+{
+    typedef boost::int8_t type;
+};
+
+template< >
+struct make_storage_type< 2u, false >
+{
+    typedef boost::uint16_t type;
+};
+
+template< >
+struct make_storage_type< 2u, true >
+{
+    typedef boost::int16_t type;
+};
+
+template< >
+struct make_storage_type< 4u, false >
+{
+    typedef boost::uint32_t type;
+};
+
+template< >
+struct make_storage_type< 4u, true >
+{
+    typedef boost::int32_t type;
+};
+
+template< >
+struct make_storage_type< 8u, false >
+{
+    typedef boost::uint64_t type;
+};
+
+template< >
+struct make_storage_type< 8u, true >
+{
+    typedef boost::int64_t type;
+};
+
+#if defined(BOOST_HAS_INT128)
+
+template< >
+struct make_storage_type< 16u, false >
+{
+    typedef boost::uint128_type type;
+};
+
+template< >
+struct make_storage_type< 16u, true >
+{
+    typedef boost::int128_type type;
+};
+
+#elif !defined(BOOST_NO_ALIGNMENT)
+
+struct BOOST_ALIGNMENT(16) storage128_t
+{
+    boost::uint64_t data[2];
+
+    BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT
+    {
+        return data[0] == 0 && data[1] == 0;
+    }
+};
+
+BOOST_FORCEINLINE bool operator== (storage128_t const& left, storage128_t const& right) BOOST_NOEXCEPT
+{
+    return left.data[0] == right.data[0] && left.data[1] == right.data[1];
+}
+BOOST_FORCEINLINE bool operator!= (storage128_t const& left, storage128_t const& right) BOOST_NOEXCEPT
+{
+    return !(left == right);
+}
+
+template< bool Signed >
+struct make_storage_type< 16u, Signed >
+{
+    typedef storage128_t type;
+};
+
+#endif
+
+template< typename T >
+struct storage_size_of
+{
+    enum _
+    {
+        size = sizeof(T),
+        value = (size == 3 ? 4 : (size >= 5 && size <= 7 ? 8 : (size >= 9 && size <= 15 ? 16 : size)))
+    };
+};
+
+} // namespace detail
+} // namespace atomics
+} // namespace boost
+
+#endif // BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/type-classification.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_TYPE_CLASSIFICATION_HPP
-#define BOOST_ATOMIC_DETAIL_TYPE_CLASSIFICATION_HPP
-
-//  Copyright (c) 2011 Helge Bahmann
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/atomic/detail/config.hpp>
-#include <boost/type_traits/is_integral.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-template<typename T, bool IsInt = boost::is_integral<T>::value>
-struct classify
-{
-    typedef void type;
-};
-
-template<typename T>
-struct classify<T, true> {typedef int type;};
-
-template<typename T>
-struct classify<T*, false> {typedef void* type;};
-
-template<typename T>
-struct storage_size_of
-{
-    enum _
-    {
-        size = sizeof(T),
-        value = (size == 3 ? 4 : (size >= 5 && size <= 7 ? 8 : (size >= 9 && size <= 15 ? 16 : size)))
-    };
-};
-
-}}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/atomic/detail/windows.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1669 +0,0 @@
-#ifndef BOOST_ATOMIC_DETAIL_WINDOWS_HPP
-#define BOOST_ATOMIC_DETAIL_WINDOWS_HPP
-
-//  Copyright (c) 2009 Helge Bahmann
-//  Copyright (c) 2012 Andrey Semashev
-//  Copyright (c) 2013 Tim Blechmann, Andrey Semashev
-//
-//  Distributed under the Boost Software License, Version 1.0.
-//  See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string.h>
-#include <cstddef>
-#include <boost/cstdint.hpp>
-#include <boost/type_traits/make_signed.hpp>
-#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/interlocked.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-#ifdef _MSC_VER
-#pragma warning(push)
-// 'order' : unreferenced formal parameter
-#pragma warning(disable: 4100)
-#endif
-
-#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86))
-extern "C" void _mm_pause(void);
-#pragma intrinsic(_mm_pause)
-#define BOOST_ATOMIC_X86_PAUSE() _mm_pause()
-#else
-#define BOOST_ATOMIC_X86_PAUSE()
-#endif
-
-#if defined(_M_IX86) && _M_IX86 >= 500
-#define BOOST_ATOMIC_X86_HAS_CMPXCHG8B 1
-#endif
-
-// Define hardware barriers
-#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
-extern "C" void _mm_mfence(void);
-#pragma intrinsic(_mm_mfence)
-#endif
-
-// Define compiler barriers
-#if defined(__INTEL_COMPILER)
-#define BOOST_ATOMIC_COMPILER_BARRIER() __memory_barrier()
-#elif defined(_MSC_VER) && _MSC_VER >= 1310 && !defined(_WIN32_WCE)
-extern "C" void _ReadWriteBarrier(void);
-#pragma intrinsic(_ReadWriteBarrier)
-#define BOOST_ATOMIC_COMPILER_BARRIER() _ReadWriteBarrier()
-#endif
-
-#ifndef BOOST_ATOMIC_COMPILER_BARRIER
-#define BOOST_ATOMIC_COMPILER_BARRIER()
-#endif
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-BOOST_FORCEINLINE void hardware_full_fence(void)
-{
-#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
-    // Use mfence only if SSE2 is available
-    _mm_mfence();
-#else
-    long tmp;
-    BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&tmp, 0);
-#endif
-}
-
-BOOST_FORCEINLINE void
-platform_fence_before(memory_order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-}
-
-BOOST_FORCEINLINE void
-platform_fence_after(memory_order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-}
-
-BOOST_FORCEINLINE void
-platform_fence_before_store(memory_order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-}
-
-BOOST_FORCEINLINE void
-platform_fence_after_store(memory_order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-}
-
-BOOST_FORCEINLINE void
-platform_fence_after_load(memory_order order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-
-    // On x86 and x86_64 there is no need for a hardware barrier,
-    // even if seq_cst memory order is requested, because all
-    // seq_cst writes are implemented with lock-prefixed operations
-    // or xchg which has implied lock prefix. Therefore normal loads
-    // are already ordered with seq_cst stores on these architectures.
-
-#if !(defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86)))
-    if (order == memory_order_seq_cst)
-        hardware_full_fence();
-#endif
-}
-
-} // namespace detail
-} // namespace atomics
-
-#define BOOST_ATOMIC_THREAD_FENCE 2
-BOOST_FORCEINLINE void
-atomic_thread_fence(memory_order order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-    if (order == memory_order_seq_cst)
-        atomics::detail::hardware_full_fence();
-}
-
-#define BOOST_ATOMIC_SIGNAL_FENCE 2
-BOOST_FORCEINLINE void
-atomic_signal_fence(memory_order)
-{
-    BOOST_ATOMIC_COMPILER_BARRIER();
-}
-
-#undef BOOST_ATOMIC_COMPILER_BARRIER
-
-class atomic_flag
-{
-private:
-    atomic_flag(const atomic_flag &) /* = delete */ ;
-    atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
-    uint32_t v_;
-public:
-    BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
-
-    bool
-    test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before(order);
-        const uint32_t old = (uint32_t)BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, 1);
-        atomics::detail::platform_fence_after(order);
-        return old != 0;
-    }
-
-    void
-    clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        atomics::detail::platform_fence_before_store(order);
-        BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, 0);
-        atomics::detail::platform_fence_after_store(order);
-    }
-};
-
-} // namespace boost
-
-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
-
-#include <boost/atomic/detail/base.hpp>
-
-#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
-
-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
-#define BOOST_ATOMIC_INT_LOCK_FREE 2
-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
-#if defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B) || defined(_M_AMD64) || defined(_M_IA64)
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
-#else
-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
-#endif
-#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
-
-namespace boost {
-namespace atomics {
-namespace detail {
-
-#if defined(_MSC_VER)
-#pragma warning(push)
-// 'char' : forcing value to bool 'true' or 'false' (performance warning)
-#pragma warning(disable: 4800)
-#endif
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8
-    typedef value_type storage_type;
-#else
-    typedef uint32_t storage_type;
-#endif
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            v_ = static_cast< storage_type >(v);
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = static_cast< value_type >(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(&v_, v));
-#else
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&v_, v));
-#endif
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        typedef typename make_signed< value_type >::type signed_value_type;
-        return fetch_add(static_cast< value_type >(-static_cast< signed_value_type >(v)), order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE8
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&v_, v));
-#else
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, v));
-#endif
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&v_, desired, previous));
-#else
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired, previous));
-#endif
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_AND8
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND8(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_AND)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_OR8
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR8(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_OR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_XOR8
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR8(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_XOR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16
-    typedef value_type storage_type;
-#else
-    typedef uint32_t storage_type;
-#endif
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            v_ = static_cast< storage_type >(v);
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = static_cast< value_type >(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(&v_, v));
-#else
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&v_, v));
-#endif
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        typedef typename make_signed< value_type >::type signed_value_type;
-        return fetch_add(static_cast< value_type >(-static_cast< signed_value_type >(v)), order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE16
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&v_, v));
-#else
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, v));
-#endif
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&v_, desired, previous));
-#else
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired, previous));
-#endif
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_AND16
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND16(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_AND)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_OR16
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR16(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_OR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#ifdef BOOST_ATOMIC_INTERLOCKED_XOR16
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR16(&v_, v));
-        platform_fence_after(order);
-        return v;
-#elif defined(BOOST_ATOMIC_INTERLOCKED_XOR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef value_type storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            v_ = static_cast< storage_type >(v);
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = static_cast< value_type >(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&v_, v));
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        typedef typename make_signed< value_type >::type signed_value_type;
-        return fetch_add(static_cast< value_type >(-static_cast< signed_value_type >(v)), order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, v));
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired, previous));
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_AND)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_OR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for(; !compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_XOR)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-// MSVC 2012 fails to recognize sizeof(T) as a constant expression in template specializations
-enum msvc_sizeof_pointer_workaround { sizeof_pointer = sizeof(void*) };
-
-template<bool Sign>
-class base_atomic<void*, void*, sizeof_pointer, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef std::ptrdiff_t difference_type;
-    typedef void* value_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = (value_type)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(&v_, v);
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool compare_exchange_strong(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        value_type oldval = (value_type)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(&v_, desired, previous);
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool compare_exchange_weak(value_type & expected, value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        value_type res = (value_type)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(&v_, v);
-        platform_fence_after(order);
-        return res;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T*, void*, sizeof_pointer, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T* value_type;
-    typedef std::ptrdiff_t difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            const_cast<volatile value_type &>(v_) = v;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        value_type v = const_cast<const volatile value_type &>(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = (value_type)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(&v_, v);
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        value_type oldval = (value_type)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(&v_, desired, previous);
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        v = v * sizeof(*v_);
-        platform_fence_before(order);
-        value_type res = (value_type)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(&v_, v);
-        platform_fence_after(order);
-        return res;
-    }
-
-    value_type
-    fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        return fetch_add(-v, order);
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    value_type v_;
-};
-
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 1, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8
-    typedef uint8_t storage_type;
-#else
-    typedef uint32_t storage_type;
-#endif
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(reinterpret_cast< storage_type const& >(v))
-    {
-    }
-#else
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-#endif
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE8
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&v_, tmp));
-#else
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, tmp));
-#endif
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&v_, desired_s, expected_s));
-#else
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired_s, expected_s));
-#endif
-        bool success = (oldval == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &oldval, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 2, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16
-    typedef uint16_t storage_type;
-#else
-    typedef uint32_t storage_type;
-#endif
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16
-    BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(reinterpret_cast< storage_type const& >(v))
-    {
-    }
-#else
-    explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-#endif
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_EXCHANGE16
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&v_, tmp));
-#else
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, tmp));
-#endif
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-#ifdef BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&v_, desired_s, expected_s));
-#else
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired_s, expected_s));
-#endif
-        bool success = (oldval == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &oldval, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 4, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint32_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&v_, tmp));
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&v_, desired_s, expected_s));
-        bool success = (oldval == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &oldval, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void) const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#if defined(_M_AMD64) || defined(_M_IA64)
-
-template<typename T, bool Sign>
-class base_atomic<T, int, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef value_type storage_type;
-    typedef T difference_type;
-
-protected:
-    typedef value_type value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT: v_(v) {}
-
-    void
-    store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            platform_fence_before(order);
-            v_ = static_cast< storage_type >(v);
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
-    {
-        value_type v = static_cast< value_type >(v_);
-        platform_fence_after_load(order);
-        return v;
-    }
-
-    value_type
-    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&v_, v));
-        platform_fence_after(order);
-        return v;
-    }
-
-    value_type
-    fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        typedef typename make_signed< value_type >::type signed_value_type;
-        return fetch_add(static_cast< value_type >(-static_cast< signed_value_type >(v)), order);
-    }
-
-    value_type
-    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&v_, v));
-        platform_fence_after(order);
-        return v;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        value_type previous = expected;
-        platform_fence_before(success_order);
-        value_type oldval = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&v_, desired, previous));
-        bool success = (previous == oldval);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        expected = oldval;
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    value_type
-    fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_AND64)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_AND64(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_OR64)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_OR64(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    value_type
-    fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-#if defined(BOOST_ATOMIC_INTERLOCKED_XOR64)
-        platform_fence_before(order);
-        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_XOR64(&v_, v));
-        platform_fence_after(order);
-        return v;
-#else
-        value_type tmp = load(memory_order_relaxed);
-        for (; !compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed);)
-        {
-            BOOST_ATOMIC_X86_PAUSE();
-        }
-        return tmp;
-#endif
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-template<typename T, bool Sign>
-class base_atomic<T, void, 8, Sign>
-{
-private:
-    typedef base_atomic this_type;
-    typedef T value_type;
-    typedef uint64_t storage_type;
-
-protected:
-    typedef value_type const& value_arg_type;
-
-public:
-    BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
-    explicit base_atomic(value_type const& v) : v_(0)
-    {
-        memcpy(&v_, &v, sizeof(value_type));
-    }
-
-    void
-    store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        if (order != memory_order_seq_cst) {
-            storage_type tmp = 0;
-            memcpy(&tmp, &v, sizeof(value_type));
-            platform_fence_before(order);
-            const_cast<volatile storage_type &>(v_) = tmp;
-        } else {
-            exchange(v, order);
-        }
-    }
-
-    value_type
-    load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = const_cast<volatile storage_type &>(v_);
-        platform_fence_after_load(order);
-        value_type v;
-        memcpy(&v, &tmp, sizeof(value_type));
-        return v;
-    }
-
-    value_type
-    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
-    {
-        storage_type tmp = 0;
-        memcpy(&tmp, &v, sizeof(value_type));
-        platform_fence_before(order);
-        tmp = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&v_, tmp));
-        platform_fence_after(order);
-        value_type res;
-        memcpy(&res, &tmp, sizeof(value_type));
-        return res;
-    }
-
-    bool
-    compare_exchange_strong(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        storage_type expected_s = 0, desired_s = 0;
-        memcpy(&expected_s, &expected, sizeof(value_type));
-        memcpy(&desired_s, &desired, sizeof(value_type));
-        platform_fence_before(success_order);
-        storage_type oldval = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&v_, desired_s, expected_s));
-        bool success = (oldval == expected_s);
-        if (success)
-            platform_fence_after(success_order);
-        else
-            platform_fence_after(failure_order);
-        memcpy(&expected, &oldval, sizeof(value_type));
-        return success;
-    }
-
-    bool
-    compare_exchange_weak(
-        value_type & expected,
-        value_type const& desired,
-        memory_order success_order,
-        memory_order failure_order) volatile BOOST_NOEXCEPT
-    {
-        return compare_exchange_strong(expected, desired, success_order, failure_order);
-    }
-
-    bool
-    is_lock_free(void)const volatile BOOST_NOEXCEPT
-    {
-        return true;
-    }
-
-    BOOST_ATOMIC_DECLARE_BASE_OPERATORS
-
-    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
-    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
-
-private:
-    storage_type v_;
-};
-
-#elif defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B)
-
-template<typename T>
-inline bool
-platform_cmpxchg64_strong(T & expected, T desired, volatile T * p) BOOST_NOEXCEPT
-{
-#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64)
-    const T oldval = BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(p, desired, expected);
-    const bool result = (oldval == expected);
-    expected = oldval;
-    return result;
-#else
-    bool result;
-    __asm
-    {
-        mov edi, p
-        mov esi, expected
-        mov ebx, dword ptr [desired]
-        mov ecx, dword ptr [desired + 4]
-        mov eax, dword ptr [esi]
-        mov edx, dword ptr [esi + 4]
-        lock cmpxchg8b qword ptr [edi]
-        mov dword ptr [esi], eax
-        mov dword ptr [esi + 4], edx
-        sete result
-    };
-    return result;
-#endif
-}
-
-// Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, 8.1.1. Guaranteed Atomic Operations:
-//
-// The Pentium processor (and newer processors since) guarantees that the following additional memory operations will always be carried out atomically:
-// * Reading or writing a quadword aligned on a 64-bit boundary
-//
-// Luckily, the memory is almost always 8-byte aligned in our case because atomic<> uses 64 bit native types for storage and dynamic memory allocations
-// have at least 8 byte alignment. The only unfortunate case is when atomic is placeod on the stack and it is not 8-byte aligned (like on 32 bit Windows).
-
-template<typename T>
-inline void
-platform_store64(T value, volatile T * p) BOOST_NOEXCEPT
-{
-    if (((uint32_t)p & 0x00000007) == 0)
-    {
-#if defined(_M_IX86_FP) && _M_IX86_FP >= 2
-        __asm
-        {
-            mov edx, p
-            movq xmm4, value
-            movq qword ptr [edx], xmm4
-        };
-#else
-        __asm
-        {
-            mov edx, p
-            fild value
-            fistp qword ptr [edx]
-        };
-#endif
-    }
-    else
-    {
-        __asm
-        {
-            mov edi, p
-            mov ebx, dword ptr [value]
-            mov ecx, dword ptr [value + 4]
-            mov eax, dword ptr [edi]
-            mov edx, dword ptr [edi + 4]
-            align 16
-again:
-            lock cmpxchg8b qword ptr [edi]
-            jne again
-        };
-    }
-}
-
-template<typename T>
-inline T
-platform_load64(const volatile T * p) BOOST_NOEXCEPT
-{
-    T value;
-
-    if (((uint32_t)p & 0x00000007) == 0)
-    {
-#if defined(_M_IX86_FP) && _M_IX86_FP >= 2
-        __asm
-        {
-            mov edx, p
-            movq xmm4, qword ptr [edx]
-            movq value, xmm4
-        };
-#else
-        __asm
-        {
-            mov edx, p
-            fild qword ptr [edx]
-            fistp value
-        };
-#endif
-    }
-    else
-    {
-        // We don't care for comparison result here; the previous value will be stored into value anyway.
-        // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
-        __asm
-        {
-            mov edi, p
-            mov eax, ebx
-            mov edx, ecx
-            lock cmpxchg8b qword ptr [edi]
-            mov dword ptr [value], eax
-            mov dword ptr [value + 4], edx
-        };
-    }
-
-    return value;
-}
-
-#endif
-
-} // namespace detail
-} // namespace atomics
-} // namespace boost
-
-/* pull in 64-bit atomic type using cmpxchg8b above */
-#if defined(BOOST_ATOMIC_X86_HAS_CMPXCHG8B)
-#include <boost/atomic/detail/cas64strong.hpp>
-#endif
-
-#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/atomic/fences.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+/*
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Copyright (c) 2011 Helge Bahmann
+ * Copyright (c) 2013 Tim Blechmann
+ * Copyright (c) 2014 Andrey Semashev
+ */
+/*!
+ * \file   atomic/fences.hpp
+ *
+ * This header contains definition of \c atomic_thread_fence and \c atomic_signal_fence functions.
+ */
+
+#ifndef BOOST_ATOMIC_FENCES_HPP_INCLUDED_
+#define BOOST_ATOMIC_FENCES_HPP_INCLUDED_
+
+#include <boost/memory_order.hpp>
+#include <boost/atomic/capabilities.hpp>
+#include <boost/atomic/detail/operations.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+/*
+ * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,
+ *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.
+ */
+
+namespace boost {
+
+namespace atomics {
+
+#if BOOST_ATOMIC_THREAD_FENCE > 0
+BOOST_FORCEINLINE void atomic_thread_fence(memory_order order) BOOST_NOEXCEPT
+{
+    detail::thread_fence(order);
+}
+#else
+BOOST_FORCEINLINE void atomic_thread_fence(memory_order) BOOST_NOEXCEPT
+{
+    detail::lockpool::thread_fence();
+}
+#endif
+
+#if BOOST_ATOMIC_SIGNAL_FENCE > 0
+BOOST_FORCEINLINE void atomic_signal_fence(memory_order order) BOOST_NOEXCEPT
+{
+    detail::signal_fence(order);
+}
+#else
+BOOST_FORCEINLINE void atomic_signal_fence(memory_order) BOOST_NOEXCEPT
+{
+    detail::lockpool::signal_fence();
+}
+#endif
+
+} // namespace atomics
+
+using atomics::atomic_thread_fence;
+using atomics::atomic_signal_fence;
+
+} // namespace boost
+
+#endif // BOOST_ATOMIC_FENCES_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/config/platform/haiku.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+//  (C) Copyright Jessica Hamilton 2014.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for most recent version.
+
+//  Haiku specific config options:
+
+#define BOOST_PLATFORM "Haiku"
+
+#define BOOST_HAS_UNISTD_H
+#define BOOST_HAS_STDINT_H
+#define BOOST_HASH_NO_EXTENSIONS
+
+#ifndef BOOST_DISABLE_THREADS
+#  define BOOST_HAS_THREADS
+#endif
+
+#define BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#define BOOST_NO_CXX11_ATOMIC_SMART_PTR
+#define BOOST_NO_CXX11_STATIC_ASSERT
+#define BOOST_NO_CXX11_VARIADIC_MACROS
+
+//
+// thread API's not auto detected:
+//
+#define BOOST_HAS_SCHED_YIELD
+#define BOOST_HAS_PTHREAD_YIELD
+#define BOOST_HAS_GETTIMEOFDAY
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/adaptive_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,351 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_ADAPTIVE_POOL_HPP
+#define BOOST_CONTAINER_ADAPTIVE_POOL_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/throw_exception.hpp>
+#include <boost/container/detail/adaptive_node_pool.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/singleton.hpp>
+#include <boost/container/detail/placement_new.hpp>
+
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/move/utility_core.hpp>
+#include <cstddef>
+
+
+namespace boost {
+namespace container {
+
+//!An STL node allocator that uses a modified DLMalloc as memory
+//!source.
+//!
+//!This node allocator shares a segregated storage between all instances
+//!of adaptive_pool with equal sizeof(T).
+//!
+//!NodesPerBlock is the number of nodes allocated at once when the allocator
+//!needs runs out of nodes. MaxFreeBlocks is the maximum number of totally free blocks
+//!that the adaptive node pool will hold. The rest of the totally free blocks will be
+//!deallocated to the memory manager.
+//!
+//!OverheadPercent is the (approximated) maximum size overhead (1-20%) of the allocator:
+//!(memory usable for nodes / total memory allocated from the memory allocator)
+template < class T
+         , std::size_t NodesPerBlock   BOOST_CONTAINER_DOCONLY(= ADP_nodes_per_block)
+         , std::size_t MaxFreeBlocks   BOOST_CONTAINER_DOCONLY(= ADP_max_free_blocks)
+         , std::size_t OverheadPercent BOOST_CONTAINER_DOCONLY(= ADP_overhead_percent)
+         BOOST_CONTAINER_DOCIGN(BOOST_MOVE_I unsigned Version)
+         >
+class adaptive_pool
+{
+   //!If Version is 1, the allocator is a STL conforming allocator. If Version is 2,
+   //!the allocator offers advanced expand in place and burst allocation capabilities.
+   public:
+   typedef unsigned int allocation_type;
+   typedef adaptive_pool
+      <T, NodesPerBlock, MaxFreeBlocks, OverheadPercent
+         BOOST_CONTAINER_DOCIGN(BOOST_MOVE_I Version)
+         >   self_t;
+
+   static const std::size_t nodes_per_block        = NodesPerBlock;
+   static const std::size_t max_free_blocks        = MaxFreeBlocks;
+   static const std::size_t overhead_percent       = OverheadPercent;
+   static const std::size_t real_nodes_per_block   = NodesPerBlock;
+
+   BOOST_CONTAINER_DOCIGN(BOOST_STATIC_ASSERT((Version <=2)));
+
+   public:
+   //-------
+   typedef T                                    value_type;
+   typedef T *                                  pointer;
+   typedef const T *                            const_pointer;
+   typedef typename ::boost::container::
+      container_detail::unvoid<T>::type &       reference;
+   typedef const typename ::boost::container::
+      container_detail::unvoid<T>::type &       const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+
+   typedef boost::container::container_detail::
+      version_type<self_t, Version>             version;
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef boost::container::container_detail::
+      basic_multiallocation_chain<void*>              multiallocation_chain_void;
+   typedef boost::container::container_detail::
+      transform_multiallocation_chain
+         <multiallocation_chain_void, T>              multiallocation_chain;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   //!Obtains adaptive_pool from
+   //!adaptive_pool
+   template<class T2>
+   struct rebind
+   {
+      typedef adaptive_pool
+         < T2
+         , NodesPerBlock
+         , MaxFreeBlocks
+         , OverheadPercent
+         BOOST_CONTAINER_DOCIGN(BOOST_MOVE_I Version)
+         >       other;
+   };
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   private:
+   //!Not assignable from related adaptive_pool
+   template<class T2, unsigned Version2, std::size_t N2, std::size_t F2>
+   adaptive_pool& operator=
+      (const adaptive_pool<T2, Version2, N2, F2>&);
+
+   //!Not assignable from other adaptive_pool
+   adaptive_pool& operator=(const adaptive_pool&);
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+   //!Default constructor
+   adaptive_pool() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Copy constructor from other adaptive_pool.
+   adaptive_pool(const adaptive_pool &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Copy constructor from related adaptive_pool.
+   template<class T2>
+   adaptive_pool
+      (const adaptive_pool<T2, NodesPerBlock, MaxFreeBlocks, OverheadPercent
+            BOOST_CONTAINER_DOCIGN(BOOST_MOVE_I Version)> &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Destructor
+   ~adaptive_pool() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Returns the number of elements that could be allocated.
+   //!Never throws
+   size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return size_type(-1)/sizeof(T);   }
+
+   //!Allocate memory for an array of count elements.
+   //!Throws std::bad_alloc if there is no enough memory
+   pointer allocate(size_type count, const void * = 0)
+   {
+      if(BOOST_UNLIKELY(count > this->max_size()))
+         boost::container::throw_bad_alloc();
+
+      if(Version == 1 && count == 1){
+         typedef typename container_detail::shared_adaptive_node_pool
+            <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+         typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+         return pointer(static_cast<T*>(singleton_t::instance().allocate_node()));
+      }
+      else{
+         return static_cast<pointer>(boost_cont_malloc(count*sizeof(T)));
+      }
+   }
+
+   //!Deallocate allocated memory.
+   //!Never throws
+   void deallocate(const pointer &ptr, size_type count) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      (void)count;
+      if(Version == 1 && count == 1){
+         typedef container_detail::shared_adaptive_node_pool
+            <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+         typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+         singleton_t::instance().deallocate_node(ptr);
+      }
+      else{
+         boost_cont_free(ptr);
+      }
+   }
+
+   pointer allocation_command(allocation_type command,
+                         size_type limit_size,
+                         size_type &prefer_in_recvd_out_size,
+                         pointer &reuse)
+   {
+      pointer ret = this->priv_allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse);
+      if(BOOST_UNLIKELY(!ret && !(command & BOOST_CONTAINER_NOTHROW_ALLOCATION)))
+         boost::container::throw_bad_alloc();
+      return ret;
+   }
+
+   //!Returns maximum the number of objects the previously allocated memory
+   //!pointed by p can hold.
+   size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return boost_cont_size(p);  }
+
+   //!Allocates just one object. Memory allocated with this function
+   //!must be deallocated only with deallocate_one().
+   //!Throws bad_alloc if there is no enough memory
+   pointer allocate_one()
+   {
+      typedef container_detail::shared_adaptive_node_pool
+         <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      return (pointer)singleton_t::instance().allocate_node();
+   }
+
+   //!Allocates many elements of size == 1.
+   //!Elements must be individually deallocated with deallocate_one()
+   void allocate_individual(std::size_t num_elements, multiallocation_chain &chain)
+   {
+      typedef container_detail::shared_adaptive_node_pool
+         <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      singleton_t::instance().allocate_nodes(num_elements, static_cast<typename shared_pool_t::multiallocation_chain&>(chain));
+      //typename shared_pool_t::multiallocation_chain ch;
+      //singleton_t::instance().allocate_nodes(num_elements, ch);
+      //chain.incorporate_after
+         //(chain.before_begin(), (T*)&*ch.begin(), (T*)&*ch.last(), ch.size());
+   }
+
+   //!Deallocates memory previously allocated with allocate_one().
+   //!You should never use deallocate_one to deallocate memory allocated
+   //!with other functions different from allocate_one(). Never throws
+   void deallocate_one(pointer p) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      typedef container_detail::shared_adaptive_node_pool
+         <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      singleton_t::instance().deallocate_node(p);
+   }
+
+   void deallocate_individual(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      typedef container_detail::shared_adaptive_node_pool
+         <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      //typename shared_pool_t::multiallocation_chain ch(&*chain.begin(), &*chain.last(), chain.size());
+      //singleton_t::instance().deallocate_nodes(ch);
+      singleton_t::instance().deallocate_nodes(chain);
+   }
+
+   //!Allocates many elements of size elem_size.
+   //!Elements must be individually deallocated with deallocate()
+   void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));/*
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
+      if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after(chain.before_begin()
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             ,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
+      if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes
+            (n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain)))){
+         boost::container::throw_bad_alloc();
+      }
+   }
+
+   //!Allocates n_elements elements, each one of size elem_sizes[i]
+   //!Elements must be individually deallocated with deallocate()
+   void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));/*
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
+      if(BOOST_UNLIKELY(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after(chain.before_begin()
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             ,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
+      if(BOOST_UNLIKELY(!boost_cont_multialloc_arrays
+         (n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain)))){
+         boost::container::throw_bad_alloc();
+      }
+   }
+
+   void deallocate_many(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {/*
+      boost_cont_memchain ch;
+      void *beg(&*chain.begin()), *last(&*chain.last());
+      size_t size(chain.size());
+      BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, beg, last, size);
+      boost_cont_multidealloc(&ch);*/
+      boost_cont_multidealloc(reinterpret_cast<boost_cont_memchain *>(&chain));
+   }
+
+   //!Deallocates all free blocks of the pool
+   static void deallocate_free_blocks() BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      typedef container_detail::shared_adaptive_node_pool
+         <sizeof(T), NodesPerBlock, MaxFreeBlocks, OverheadPercent> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      singleton_t::instance().deallocate_free_blocks();
+   }
+
+   //!Swaps allocators. Does not throw. If each allocator is placed in a
+   //!different memory segment, the result is undefined.
+   friend void swap(adaptive_pool &, adaptive_pool &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!An allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator==(const adaptive_pool &, const adaptive_pool &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return true;   }
+
+   //!An allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const adaptive_pool &, const adaptive_pool &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return false;   }
+
+   private:
+   pointer priv_allocation_command
+      (allocation_type command,   std::size_t limit_size
+      ,size_type &prefer_in_recvd_out_size, pointer &reuse_ptr)
+   {
+      std::size_t const preferred_size = prefer_in_recvd_out_size;
+      boost_cont_command_ret_t ret = {0 , 0};
+      if(BOOST_UNLIKELY(limit_size > this->max_size() || preferred_size > this->max_size())){
+         return pointer();
+      }
+      std::size_t l_size = limit_size*sizeof(T);
+      std::size_t p_size = preferred_size*sizeof(T);
+      std::size_t r_size;
+      {
+         void* reuse_ptr_void = reuse_ptr;
+         ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+         reuse_ptr = ret.second ? static_cast<T*>(reuse_ptr_void) : 0;
+      }
+      prefer_in_recvd_out_size = r_size/sizeof(T);
+      return (pointer)ret.first;
+   }
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINER_ADAPTIVE_POOL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,372 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_ALLOCATOR_HPP
+#define BOOST_CONTAINER_ALLOCATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/throw_exception.hpp>
+#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/static_assert.hpp>
+#include <cstddef>
+#include <cassert>
+
+namespace boost {
+namespace container {
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+template<unsigned Version, unsigned int AllocationDisableMask>
+class allocator<void, Version, AllocationDisableMask>
+{
+   typedef allocator<void, Version, AllocationDisableMask>   self_t;
+   public:
+   typedef void                                 value_type;
+   typedef void *                               pointer;
+   typedef const void*                          const_pointer;
+   typedef int &                                reference;
+   typedef const int &                          const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+   typedef boost::container::container_detail::
+      version_type<self_t, Version>             version;
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef boost::container::container_detail::
+         basic_multiallocation_chain<void*>        multiallocation_chain;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   //!Obtains an allocator that allocates
+   //!objects of type T2
+   template<class T2>
+   struct rebind
+   {
+      typedef allocator< T2
+                       #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+                       , Version, AllocationDisableMask
+                       #endif
+                       > other;
+   };
+
+   //!Default constructor
+   //!Never throws
+   allocator()
+   {}
+
+   //!Constructor from other allocator.
+   //!Never throws
+   allocator(const allocator &)
+   {}
+
+   //!Constructor from related allocator.
+   //!Never throws
+   template<class T2>
+      allocator(const allocator<T2, Version, AllocationDisableMask> &)
+   {}
+};
+
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+//!\file
+//! This class is an extended STL-compatible that offers advanced allocation mechanism
+//!(in-place expansion, shrinking, burst-allocation...)
+//!
+//! This allocator is a wrapper around a modified DLmalloc.
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+template<class T>
+#else
+//! If Version is 1, the allocator is a STL conforming allocator. If Version is 2,
+//! the allocator offers advanced expand in place and burst allocation capabilities.
+//
+//! AllocationDisableMask works only if Version is 2 and it can be an inclusive OR
+//! of allocation types the user wants to disable.
+template<class T, unsigned Version, unsigned int AllocationDisableMask>
+#endif   //#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+class allocator
+{
+   typedef unsigned int allocation_type;
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   private:
+
+   //Self type
+   typedef allocator<T, Version, AllocationDisableMask>   self_t;
+
+   //Not assignable from related allocator
+   template<class T2, unsigned int Version2, unsigned int AllocationDisableMask2>
+   allocator& operator=(const allocator<T2, Version2, AllocationDisableMask2>&);
+
+   //Not assignable from other allocator
+   allocator& operator=(const allocator&);
+
+   static const unsigned int ForbiddenMask =
+      BOOST_CONTAINER_ALLOCATE_NEW | BOOST_CONTAINER_EXPAND_BWD | BOOST_CONTAINER_EXPAND_FWD ;
+
+   //The mask can't disable all the allocation types
+   BOOST_STATIC_ASSERT((  (AllocationDisableMask & ForbiddenMask) != ForbiddenMask  ));
+
+   //The mask is only valid for version 2 allocators
+   BOOST_STATIC_ASSERT((  Version != 1 || (AllocationDisableMask == 0)  ));
+
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+   typedef T                                    value_type;
+   typedef T *                                  pointer;
+   typedef const T *                            const_pointer;
+   typedef T &                                  reference;
+   typedef const T &                            const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+
+   typedef boost::container::container_detail::
+      version_type<self_t, Version>                version;
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef boost::container::container_detail::
+         basic_multiallocation_chain<void*>        void_multiallocation_chain;
+
+   typedef boost::container::container_detail::
+      transform_multiallocation_chain
+         <void_multiallocation_chain, T>           multiallocation_chain;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   //!Obtains an allocator that allocates
+   //!objects of type T2
+   template<class T2>
+   struct rebind
+   {
+      typedef allocator<T2, Version, AllocationDisableMask> other;
+   };
+
+   //!Default constructor
+   //!Never throws
+   allocator() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from other allocator.
+   //!Never throws
+   allocator(const allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from related allocator.
+   //!Never throws
+   template<class T2>
+   allocator(const allocator<T2
+            #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+            , Version, AllocationDisableMask
+            #endif
+            > &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Allocates memory for an array of count elements.
+   //!Throws std::bad_alloc if there is no enough memory
+   //!If Version is 2, this allocated memory can only be deallocated
+   //!with deallocate() or (for Version == 2) deallocate_many()
+   pointer allocate(size_type count, const void * hint= 0)
+   {
+      (void)hint;
+      if(count > this->max_size())
+         boost::container::throw_bad_alloc();
+      void *ret = boost_cont_malloc(count*sizeof(T));
+      if(!ret)
+         boost::container::throw_bad_alloc();
+      return static_cast<pointer>(ret);
+   }
+
+   //!Deallocates previously allocated memory.
+   //!Never throws
+   void deallocate(pointer ptr, size_type) BOOST_NOEXCEPT_OR_NOTHROW
+   {  boost_cont_free(ptr);  }
+
+   //!Returns the maximum number of elements that could be allocated.
+   //!Never throws
+   size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return size_type(-1)/sizeof(T);   }
+
+   //!Swaps two allocators, does nothing
+   //!because this allocator is stateless
+   friend void swap(self_t &, self_t &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!An allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator==(const allocator &, const allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return true;   }
+
+   //!An allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const allocator &, const allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return false;   }
+
+   //!An advanced function that offers in-place expansion shrink to fit and new allocation
+   //!capabilities. Memory allocated with this function can only be deallocated with deallocate()
+   //!or deallocate_many().
+   //!This function is available only with Version == 2
+   pointer allocation_command(allocation_type command,
+                         size_type limit_size,
+                         size_type &prefer_in_recvd_out_size,
+                         pointer &reuse)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      const allocation_type mask(AllocationDisableMask);
+      command &= ~mask;
+      pointer ret = this->priv_allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse);
+      if(!ret && !(command & BOOST_CONTAINER_NOTHROW_ALLOCATION))
+         boost::container::throw_bad_alloc();
+      return ret;
+   }
+
+   //!Returns maximum the number of objects the previously allocated memory
+   //!pointed by p can hold.
+   //!Memory must not have been allocated with
+   //!allocate_one or allocate_individual.
+   //!This function is available only with Version == 2
+   size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      return boost_cont_size(p);
+   }
+
+   //!Allocates just one object. Memory allocated with this function
+   //!must be deallocated only with deallocate_one().
+   //!Throws bad_alloc if there is no enough memory
+   //!This function is available only with Version == 2
+   pointer allocate_one()
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      return this->allocate(1);
+   }
+
+   //!Allocates many elements of size == 1.
+   //!Elements must be individually deallocated with deallocate_one()
+   //!This function is available only with Version == 2
+   void allocate_individual(std::size_t num_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      this->allocate_many(1, num_elements, chain);
+   }
+
+   //!Deallocates memory previously allocated with allocate_one().
+   //!You should never use deallocate_one to deallocate memory allocated
+   //!with other functions different from allocate_one() or allocate_individual.
+   //Never throws
+   void deallocate_one(pointer p) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      return this->deallocate(p, 1);
+   }
+
+   //!Deallocates memory allocated with allocate_one() or allocate_individual().
+   //!This function is available only with Version == 2
+   void deallocate_individual(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      return this->deallocate_many(chain);
+   }
+
+   //!Allocates many elements of size elem_size.
+   //!Elements must be individually deallocated with deallocate()
+   //!This function is available only with Version == 2
+   void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));/*
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
+      if(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after(chain.before_begin()
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             ,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
+      if(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain))){
+         boost::container::throw_bad_alloc();
+      }
+   }
+
+   //!Allocates n_elements elements, each one of size elem_sizes[i]
+   //!Elements must be individually deallocated with deallocate()
+   //!This function is available only with Version == 2
+   void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
+      if(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after(chain.before_begin()
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
+                             ,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             ,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );
+      /*
+      if(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain))){
+         boost::container::throw_bad_alloc();
+      }*/
+   }
+
+   //!Deallocates several elements allocated by
+   //!allocate_many(), allocate(), or allocation_command().
+   //!This function is available only with Version == 2
+   void deallocate_many(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      boost_cont_memchain ch;
+      void *beg(&*chain.begin()), *last(&*chain.last());
+      size_t size(chain.size());
+      BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, beg, last, size);
+      boost_cont_multidealloc(&ch);
+      //boost_cont_multidealloc(reinterpret_cast<boost_cont_memchain *>(&chain));
+   }
+
+   private:
+
+   pointer priv_allocation_command
+      (allocation_type command,    std::size_t limit_size
+      ,size_type &prefer_in_recvd_out_size
+      ,pointer &reuse_ptr)
+   {
+      std::size_t const preferred_size = prefer_in_recvd_out_size;
+      boost_cont_command_ret_t ret = {0 , 0};
+      if((limit_size > this->max_size()) | (preferred_size > this->max_size())){
+         return pointer();
+      }
+      std::size_t l_size = limit_size*sizeof(T);
+      std::size_t p_size = preferred_size*sizeof(T);
+      std::size_t r_size;
+      {
+         void* reuse_ptr_void = reuse_ptr;
+         ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+         reuse_ptr = ret.second ? static_cast<T*>(reuse_ptr_void) : 0;
+      }
+      prefer_in_recvd_out_size = r_size/sizeof(T);
+      return (pointer)ret.first;
+   }
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINER_ALLOCATOR_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/adaptive_node_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,167 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_ADAPTIVE_NODE_POOL_HPP
+#define BOOST_CONTAINER_DETAIL_ADAPTIVE_NODE_POOL_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/intrusive/set.hpp>
+#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/container/detail/pool_common_alloc.hpp>
+#include <boost/container/detail/mutex.hpp>
+#include <boost/container/detail/adaptive_node_pool_impl.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/container/detail/type_traits.hpp>
+
+#include <cstddef>
+#include <cmath>
+#include <cassert>
+
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template<bool AlignOnly>
+struct select_private_adaptive_node_pool_impl
+{
+   typedef boost::container::container_detail::
+         private_adaptive_node_pool_impl
+            < fake_segment_manager
+            , unsigned(AlignOnly)*::boost::container::adaptive_pool_flag::align_only
+            | ::boost::container::adaptive_pool_flag::size_ordered | ::boost::container::adaptive_pool_flag::address_ordered
+            > type;
+};
+
+//!Pooled memory allocator using an smart adaptive pool. Includes
+//!a reference count but the class does not delete itself, this is
+//!responsibility of user classes. Node size (NodeSize) and the number of
+//!nodes allocated per block (NodesPerBlock) are known at compile time.
+template< std::size_t NodeSize
+        , std::size_t NodesPerBlock
+        , std::size_t MaxFreeBlocks
+        , std::size_t OverheadPercent
+        >
+class private_adaptive_node_pool
+   :  public select_private_adaptive_node_pool_impl<(OverheadPercent == 0)>::type
+{
+   typedef typename select_private_adaptive_node_pool_impl<OverheadPercent == 0>::type base_t;
+   //Non-copyable
+   private_adaptive_node_pool(const private_adaptive_node_pool &);
+   private_adaptive_node_pool &operator=(const private_adaptive_node_pool &);
+
+   public:
+   typedef typename base_t::multiallocation_chain multiallocation_chain;
+   static const std::size_t nodes_per_block = NodesPerBlock;
+
+   //!Constructor. Never throws
+   private_adaptive_node_pool()
+      :  base_t(0
+               , NodeSize
+               , NodesPerBlock
+               , MaxFreeBlocks
+               , (unsigned char)OverheadPercent)
+   {}
+};
+
+//!Pooled memory allocator using adaptive pool. Includes
+//!a reference count but the class does not delete itself, this is
+//!responsibility of user classes. Node size (NodeSize) and the number of
+//!nodes allocated per block (NodesPerBlock) are known at compile time
+template< std::size_t NodeSize
+        , std::size_t NodesPerBlock
+        , std::size_t MaxFreeBlocks
+        , std::size_t OverheadPercent
+        >
+class shared_adaptive_node_pool
+   : public private_adaptive_node_pool
+      <NodeSize, NodesPerBlock, MaxFreeBlocks, OverheadPercent>
+{
+ private:
+   typedef private_adaptive_node_pool
+      <NodeSize, NodesPerBlock, MaxFreeBlocks, OverheadPercent> private_node_allocator_t;
+ public:
+   typedef typename private_node_allocator_t::multiallocation_chain multiallocation_chain;
+
+   //!Constructor. Never throws
+   shared_adaptive_node_pool()
+   : private_node_allocator_t(){}
+
+   //!Destructor. Deallocates all allocated blocks. Never throws
+   ~shared_adaptive_node_pool()
+   {}
+
+   //!Allocates array of count elements. Can throw std::bad_alloc
+   void *allocate_node()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      return private_node_allocator_t::allocate_node();
+   }
+
+   //!Deallocates an array pointed by ptr. Never throws
+   void deallocate_node(void *ptr)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_node(ptr);
+   }
+
+   //!Allocates a singly linked list of n nodes ending in null pointer.
+   //!can throw std::bad_alloc
+   void allocate_nodes(const std::size_t n, multiallocation_chain &chain)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      return private_node_allocator_t::allocate_nodes(n, chain);
+   }
+
+   void deallocate_nodes(multiallocation_chain &chain)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_nodes(chain);
+   }
+
+   //!Deallocates all the free blocks of memory. Never throws
+   void deallocate_free_blocks()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_free_blocks();
+   }
+
+   private:
+   default_mutex mutex_;
+};
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ADAPTIVE_NODE_POOL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/addressof.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_ADDRESSOF_HPP
+#define BOOST_CONTAINER_DETAIL_ADDRESSOF_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template <typename T>
+inline T* addressof(T& obj)
+{
+   return static_cast<T*>(
+      static_cast<void*>(
+         const_cast<char*>(
+            &reinterpret_cast<const char&>(obj)
+   )));
+}
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ADDRESSOF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/algorithm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_ALGORITHM_HPP
+#define BOOST_CONTAINER_DETAIL_ALGORITHM_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/algorithm.hpp>
+
+namespace boost {
+namespace container {
+
+using boost::intrusive::algo_equal;
+using boost::intrusive::algo_lexicographical_compare;
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ALGORITHM_HPP
--- a/DEPENDENCIES/generic/include/boost/container/detail/algorithms.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2012.
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/container for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_CONTAINER_DETAIL_ALGORITHMS_HPP
-#define BOOST_CONTAINER_DETAIL_ALGORITHMS_HPP
-
-#if defined(_MSC_VER)
-#  pragma once
-#endif
-
-#include "config_begin.hpp"
-#include <boost/container/detail/workaround.hpp>
-
-#include <boost/type_traits/has_trivial_copy.hpp>
-#include <boost/type_traits/has_trivial_assign.hpp>
-#include <boost/detail/no_exceptions_support.hpp>
-
-#include <boost/container/detail/type_traits.hpp>
-#include <boost/container/detail/mpl.hpp>
-#include <boost/container/detail/iterators.hpp>
-
-
-#include <cstring>
-
-namespace boost {
-namespace container {
-
-template<class It>
-struct is_value_init_construct_iterator
-{
-   static const bool value = false;
-};
-
-template<class U, class D>
-struct is_value_init_construct_iterator<value_init_construct_iterator<U, D> >
-{
-   static const bool value = true;
-};
-
-template<class It>
-struct is_emplace_iterator
-{
-   static const bool value = false;
-};
-
-template<class U, class EF, class D>
-struct is_emplace_iterator<emplace_iterator<U, EF, D> >
-{
-   static const bool value = true;
-};
-
-template<class A, class T, class InpIt>
-inline void construct_in_place(A &a, T* dest, InpIt source)
-{     boost::container::allocator_traits<A>::construct(a, dest, *source);  }
-//#endif
-
-template<class A, class T, class U, class D>
-inline void construct_in_place(A &a, T *dest, value_init_construct_iterator<U, D>)
-{
-   boost::container::allocator_traits<A>::construct(a, dest);
-}
-
-template<class A, class T, class U, class D>
-inline void construct_in_place(A &a, T *dest, default_init_construct_iterator<U, D>)
-{
-   boost::container::allocator_traits<A>::construct(a, dest, default_init);
-}
-
-template<class A, class T, class U, class EF, class D>
-inline void construct_in_place(A &a, T *dest, emplace_iterator<U, EF, D> ei)
-{
-   ei.construct_in_place(a, dest);
-}
-
-}  //namespace container {
-}  //namespace boost {
-
-#include <boost/container/detail/config_end.hpp>
-
-#endif   //#ifndef BOOST_CONTAINER_DETAIL_ALGORITHMS_HPP
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/alloc_helpers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,60 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_ALLOC_TRAITS_HPP
+#define BOOST_CONTAINER_DETAIL_ALLOC_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+// move
+#include <boost/move/adl_move_swap.hpp>
+#include <boost/move/utility_core.hpp>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template<class AllocatorType>
+inline void swap_alloc(AllocatorType &, AllocatorType &, container_detail::false_type)
+   BOOST_NOEXCEPT_OR_NOTHROW
+{}
+
+template<class AllocatorType>
+inline void swap_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
+{  boost::adl_move_swap(l, r);   }
+
+template<class AllocatorType>
+inline void assign_alloc(AllocatorType &, const AllocatorType &, container_detail::false_type)
+   BOOST_NOEXCEPT_OR_NOTHROW
+{}
+
+template<class AllocatorType>
+inline void assign_alloc(AllocatorType &l, const AllocatorType &r, container_detail::true_type)
+{  l = r;   }
+
+template<class AllocatorType>
+inline void move_alloc(AllocatorType &, AllocatorType &, container_detail::false_type)
+   BOOST_NOEXCEPT_OR_NOTHROW
+{}
+
+template<class AllocatorType>
+inline void move_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
+{  l = ::boost::move(r);   }
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ALLOC_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/alloc_lib.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,326 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_ALLOC_LIB_EXT_H
+#define BOOST_CONTAINER_ALLOC_LIB_EXT_H
+
+#include <stddef.h>
+
+#ifdef _MSC_VER
+#pragma warning (push)
+#pragma warning (disable : 4127)
+
+/*
+   we need to import/export our code only if the user has specifically
+   asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+   libraries to be dynamically linked, or BOOST_CONTAINER_DYN_LINK
+   if they want just this one to be dynamically liked:
+*/
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
+
+/* export if this is our own source, otherwise import: */
+#ifdef BOOST_CONTAINER_SOURCE
+# define BOOST_CONTAINER_DECL __declspec(dllexport)
+#else
+# define BOOST_CONTAINER_DECL __declspec(dllimport)
+#endif  /* BOOST_CONTAINER_SOURCE */
+#endif  /* DYN_LINK */
+#endif  /* _MSC_VER */
+
+/* if BOOST_CONTAINER_DECL isn't defined yet define it now: */
+#ifndef BOOST_CONTAINER_DECL
+#define BOOST_CONTAINER_DECL
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!An forward iterator to traverse the elements of a memory chain container.*/
+typedef struct multialloc_node_impl
+{
+   struct multialloc_node_impl *next_node_ptr;
+} boost_cont_memchain_node;
+
+
+/*!An forward iterator to traverse the elements of a memory chain container.*/
+typedef struct multialloc_it_impl
+{
+   boost_cont_memchain_node *node_ptr;
+} boost_cont_memchain_it;
+
+/*!Memory chain: A container holding memory portions allocated by boost_cont_multialloc_nodes
+   and boost_cont_multialloc_arrays functions.*/
+typedef struct boost_cont_memchain_impl
+{
+   size_t                   num_mem;
+   boost_cont_memchain_node  root_node;
+   boost_cont_memchain_node *last_node_ptr;
+} boost_cont_memchain;
+
+/*!Advances the iterator one position so that it points to the next element in the memory chain*/
+#define BOOST_CONTAINER_MEMIT_NEXT(IT)         (IT.node_ptr = IT.node_ptr->next_node_ptr)
+
+/*!Returns the address of the memory chain currently pointed by the iterator*/
+#define BOOST_CONTAINER_MEMIT_ADDR(IT)      ((void*)IT.node_ptr)
+
+/*!Initializer for an iterator pointing to the position before the first element*/
+#define BOOST_CONTAINER_MEMCHAIN_BEFORE_BEGIN_IT(PMEMCHAIN)   { &((PMEMCHAIN)->root_node) }
+
+/*!Initializer for an iterator pointing to the first element*/
+#define BOOST_CONTAINER_MEMCHAIN_BEGIN_IT(PMEMCHAIN)   {(PMEMCHAIN)->root_node.next_node_ptr }
+
+/*!Initializer for an iterator pointing to the last element*/
+#define BOOST_CONTAINER_MEMCHAIN_LAST_IT(PMEMCHAIN)    {(PMEMCHAIN)->last_node_ptr }
+
+/*!Initializer for an iterator pointing to one past the last element (end iterator)*/
+#define BOOST_CONTAINER_MEMCHAIN_END_IT(PMEMCHAIN)     {(boost_cont_memchain_node *)0 }
+
+/*!True if IT is the end iterator, false otherwise*/
+#define BOOST_CONTAINER_MEMCHAIN_IS_END_IT(PMEMCHAIN, IT) (!(IT).node_ptr)
+
+/*!The address of the first memory portion hold by the memory chain*/
+#define BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(PMEMCHAIN)((void*)((PMEMCHAIN)->root_node.next_node_ptr))
+
+/*!The address of the last memory portion hold by the memory chain*/
+#define BOOST_CONTAINER_MEMCHAIN_LASTMEM(PMEMCHAIN) ((void*)((PMEMCHAIN)->last_node_ptr))
+
+/*!The number of memory portions hold by the memory chain*/
+#define BOOST_CONTAINER_MEMCHAIN_SIZE(PMEMCHAIN) ((PMEMCHAIN)->num_mem)
+
+/*!Initializes the memory chain from the first memory portion, the last memory
+   portion and number of portions obtained from another memory chain*/
+#define BOOST_CONTAINER_MEMCHAIN_INIT_FROM(PMEMCHAIN, FIRST, LAST, NUM)\
+   (PMEMCHAIN)->last_node_ptr = (boost_cont_memchain_node *)(LAST), \
+   (PMEMCHAIN)->root_node.next_node_ptr  = (boost_cont_memchain_node *)(FIRST), \
+   (PMEMCHAIN)->num_mem  = (NUM);\
+/**/
+
+/*!Default initializes a memory chain. Postconditions: begin iterator is end iterator,
+   the number of portions is zero.*/
+#define BOOST_CONTAINER_MEMCHAIN_INIT(PMEMCHAIN)\
+   ((PMEMCHAIN)->root_node.next_node_ptr = 0, (PMEMCHAIN)->last_node_ptr = &((PMEMCHAIN)->root_node), (PMEMCHAIN)->num_mem = 0)\
+/**/
+
+/*!True if the memory chain is empty (holds no memory portions*/
+#define BOOST_CONTAINER_MEMCHAIN_EMPTY(PMEMCHAIN)\
+   ((PMEMCHAIN)->num_mem == 0)\
+/**/
+
+/*!Inserts a new memory portions in the front of the chain*/
+#define BOOST_CONTAINER_MEMCHAIN_PUSH_BACK(PMEMCHAIN, MEM)\
+   do{\
+      boost_cont_memchain *____chain____ = (PMEMCHAIN);\
+      boost_cont_memchain_node *____tmp_mem____ = (boost_cont_memchain_node *)(MEM);\
+      ____chain____->last_node_ptr->next_node_ptr = ____tmp_mem____;\
+      ____tmp_mem____->next_node_ptr = 0;\
+      ____chain____->last_node_ptr = ____tmp_mem____;\
+      ++____chain____->num_mem;\
+   }while(0)\
+/**/
+
+/*!Inserts a new memory portions in the back of the chain*/
+#define BOOST_CONTAINER_MEMCHAIN_PUSH_FRONT(PMEMCHAIN, MEM)\
+   do{\
+      boost_cont_memchain *____chain____ = (PMEMCHAIN);\
+      boost_cont_memchain_node *____tmp_mem____   = (boost_cont_memchain_node *)(MEM);\
+      boost_cont_memchain *____root____  = &((PMEMCHAIN)->root_node);\
+      if(!____chain____->root_node.next_node_ptr){\
+         ____chain____->last_node_ptr = ____tmp_mem____;\
+      }\
+      boost_cont_memchain_node *____old_first____ = ____root____->next_node_ptr;\
+      ____tmp_mem____->next_node_ptr = ____old_first____;\
+      ____root____->next_node_ptr = ____tmp_mem____;\
+      ++____chain____->num_mem;\
+   }while(0)\
+/**/
+
+/*!Erases the memory portion after the portion pointed by BEFORE_IT from the memory chain*/
+/*!Precondition: BEFORE_IT must be a valid iterator of the memory chain and it can't be the end iterator*/
+#define BOOST_CONTAINER_MEMCHAIN_ERASE_AFTER(PMEMCHAIN, BEFORE_IT)\
+   do{\
+      boost_cont_memchain *____chain____ = (PMEMCHAIN);\
+      boost_cont_memchain_node *____prev_node____  = (BEFORE_IT).node_ptr;\
+      boost_cont_memchain_node *____erase_node____ = ____prev_node____->next_node_ptr;\
+      if(____chain____->last_node_ptr == ____erase_node____){\
+         ____chain____->last_node_ptr = &____chain____->root_node;\
+      }\
+      ____prev_node____->next_node_ptr = ____erase_node____->next_node_ptr;\
+      --____chain____->num_mem;\
+   }while(0)\
+/**/
+
+/*!Erases the first portion from the memory chain.
+   Precondition: the memory chain must not be empty*/
+#define BOOST_CONTAINER_MEMCHAIN_POP_FRONT(PMEMCHAIN)\
+   do{\
+      boost_cont_memchain *____chain____ = (PMEMCHAIN);\
+      boost_cont_memchain_node *____prev_node____  = &____chain____->root_node;\
+      boost_cont_memchain_node *____erase_node____ = ____prev_node____->next_node_ptr;\
+      if(____chain____->last_node_ptr == ____erase_node____){\
+         ____chain____->last_node_ptr = &____chain____->root_node;\
+      }\
+      ____prev_node____->next_node_ptr = ____erase_node____->next_node_ptr;\
+      --____chain____->num_mem;\
+   }while(0)\
+/**/
+
+/*!Joins two memory chains inserting the portions of the second chain at the back of the first chain*/
+/*
+#define BOOST_CONTAINER_MEMCHAIN_SPLICE_BACK(PMEMCHAIN, PMEMCHAIN2)\
+   do{\
+      boost_cont_memchain *____chain____  = (PMEMCHAIN);\
+      boost_cont_memchain *____chain2____ = (PMEMCHAIN2);\
+      if(!____chain2____->root_node.next_node_ptr){\
+         break;\
+      }\
+      else if(!____chain____->first_mem){\
+         ____chain____->first_mem  = ____chain2____->first_mem;\
+         ____chain____->last_node_ptr = ____chain2____->last_node_ptr;\
+         ____chain____->num_mem  = ____chain2____->num_mem;\
+         BOOST_CONTAINER_MEMCHAIN_INIT(*____chain2____);\
+      }\
+      else{\
+         ____chain____->last_node_ptr->next_node_ptr = ____chain2____->first_mem;\
+         ____chain____->last_node_ptr = ____chain2____->last_node_ptr;\
+         ____chain____->num_mem += ____chain2____->num_mem;\
+      }\
+   }while(0)\*/
+/**/
+
+/*!Joins two memory chains inserting the portions of the second chain at the back of the first chain*/
+#define BOOST_CONTAINER_MEMCHAIN_INCORPORATE_AFTER(PMEMCHAIN, BEFORE_IT, FIRST, BEFORELAST, NUM)\
+   do{\
+      boost_cont_memchain *____chain____  = (PMEMCHAIN);\
+      boost_cont_memchain_node *____pnode____  = (BEFORE_IT).node_ptr;\
+      boost_cont_memchain_node *____next____   = ____pnode____->next_node_ptr;\
+      boost_cont_memchain_node *____first____  = (boost_cont_memchain_node *)(FIRST);\
+      boost_cont_memchain_node *____blast____  = (boost_cont_memchain_node *)(BEFORELAST);\
+      size_t ____num____ = (NUM);\
+      if(!____num____){\
+         break;\
+      }\
+      if(____pnode____ == ____chain____->last_node_ptr){\
+         ____chain____->last_node_ptr = ____blast____;\
+      }\
+      ____pnode____->next_node_ptr  = ____first____;\
+      ____blast____->next_node_ptr  = ____next____;\
+      ____chain____->num_mem  += ____num____;\
+   }while(0)\
+/**/
+
+BOOST_CONTAINER_DECL size_t boost_cont_size(const void *p);
+
+BOOST_CONTAINER_DECL void* boost_cont_malloc(size_t bytes);
+
+BOOST_CONTAINER_DECL void  boost_cont_free(void* mem);
+
+BOOST_CONTAINER_DECL void* boost_cont_memalign(size_t bytes, size_t alignment);
+
+/*!Indicates the all elements allocated by boost_cont_multialloc_nodes or boost_cont_multialloc_arrays
+   must be contiguous.*/
+#define DL_MULTIALLOC_ALL_CONTIGUOUS        ((size_t)(-1))
+
+/*!Indicates the number of contiguous elements allocated by boost_cont_multialloc_nodes or boost_cont_multialloc_arrays
+   should be selected by those functions.*/
+#define DL_MULTIALLOC_DEFAULT_CONTIGUOUS    ((size_t)(0))
+
+BOOST_CONTAINER_DECL int boost_cont_multialloc_nodes
+   (size_t n_elements, size_t elem_size, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL int boost_cont_multialloc_arrays
+   (size_t n_elements, const size_t *sizes, size_t sizeof_element, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL void boost_cont_multidealloc(boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL size_t boost_cont_footprint();
+
+BOOST_CONTAINER_DECL size_t boost_cont_allocated_memory();
+
+BOOST_CONTAINER_DECL size_t boost_cont_chunksize(const void *p);
+
+BOOST_CONTAINER_DECL int boost_cont_all_deallocated();
+
+typedef struct boost_cont_malloc_stats_impl
+{
+   size_t max_system_bytes;
+   size_t system_bytes;
+   size_t in_use_bytes;
+} boost_cont_malloc_stats_t;
+
+BOOST_CONTAINER_DECL boost_cont_malloc_stats_t boost_cont_malloc_stats();
+
+BOOST_CONTAINER_DECL size_t boost_cont_in_use_memory();
+
+BOOST_CONTAINER_DECL int boost_cont_trim(size_t pad);
+
+BOOST_CONTAINER_DECL int boost_cont_mallopt
+   (int parameter_number, int parameter_value);
+
+BOOST_CONTAINER_DECL int boost_cont_grow
+   (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received);
+
+BOOST_CONTAINER_DECL int boost_cont_shrink
+   (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received, int do_commit);
+
+BOOST_CONTAINER_DECL void* boost_cont_alloc
+   (size_t minbytes, size_t preferred_bytes, size_t *received_bytes);
+
+BOOST_CONTAINER_DECL int boost_cont_malloc_check();
+
+typedef unsigned int allocation_type;
+
+enum
+{
+   // constants for allocation commands
+   BOOST_CONTAINER_ALLOCATE_NEW          = 0X01,
+   BOOST_CONTAINER_EXPAND_FWD            = 0X02,
+   BOOST_CONTAINER_EXPAND_BWD            = 0X04,
+   BOOST_CONTAINER_SHRINK_IN_PLACE       = 0X08,
+   BOOST_CONTAINER_NOTHROW_ALLOCATION    = 0X10,
+//   BOOST_CONTAINER_ZERO_MEMORY           = 0X20,
+   BOOST_CONTAINER_TRY_SHRINK_IN_PLACE   = 0X40,
+   BOOST_CONTAINER_EXPAND_BOTH           = BOOST_CONTAINER_EXPAND_FWD | BOOST_CONTAINER_EXPAND_BWD,
+   BOOST_CONTAINER_EXPAND_OR_NEW         = BOOST_CONTAINER_ALLOCATE_NEW | BOOST_CONTAINER_EXPAND_BOTH
+};
+
+//#define BOOST_CONTAINERDLMALLOC__FOOTERS
+#ifndef BOOST_CONTAINERDLMALLOC__FOOTERS
+enum {   BOOST_CONTAINER_ALLOCATION_PAYLOAD = sizeof(size_t)   };
+#else
+enum {   BOOST_CONTAINER_ALLOCATION_PAYLOAD = sizeof(size_t)*2   };
+#endif
+
+typedef struct boost_cont_command_ret_impl
+{
+   void *first;
+   int   second;
+}boost_cont_command_ret_t;
+
+BOOST_CONTAINER_DECL boost_cont_command_ret_t boost_cont_allocation_command
+   ( allocation_type command
+   , size_t sizeof_object
+   , size_t limit_objects
+   , size_t preferred_objects
+   , size_t *received_objects
+   , void *reuse_ptr
+   );
+
+BOOST_CONTAINER_DECL int boost_cont_mallopt(int param_number, int value);
+
+#ifdef __cplusplus
+}  //extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#pragma warning (pop)
+#endif
+
+
+#endif   //#define BOOST_CONTAINERDLMALLOC__EXT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/alloc_lib_auto_link.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
+#define BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/auto_link.hpp>
+#include <boost/container/detail/alloc_lib.h>
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/auto_link.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_AUTO_LINK_HPP_INCLUDED
+#define BOOST_CONTAINER_DETAIL_AUTO_LINK_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+//
+// Automatically link to the correct build variant where possible.
+//
+#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_CONTAINER_NO_LIB) && !defined(BOOST_CONTAINER_SOURCE)
+//
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_container
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_AUTO_LINK_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/compare_functors.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_COMPARE_FUNCTORS_HPP
+#define BOOST_CONTAINER_DETAIL_COMPARE_FUNCTORS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace container {
+
+template<class Allocator>
+class equal_to_value
+{
+   typedef typename Allocator::value_type value_type;
+   const value_type &t_;
+
+   public:
+   explicit equal_to_value(const value_type &t)
+      :  t_(t)
+   {}
+
+   bool operator()(const value_type &t)const
+   {  return t_ == t;   }
+};
+
+template<class Node, class Pred>
+struct value_to_node_compare
+   :  Pred
+{
+   typedef Pred predicate_type;
+   typedef Node node_type;
+
+   value_to_node_compare()
+      : Pred()
+   {}
+
+   explicit value_to_node_compare(Pred pred)
+      :  Pred(pred)
+   {}
+
+   bool operator()(const Node &a, const Node &b) const
+   {  return static_cast<const Pred&>(*this)(a.m_data, b.m_data);  }
+
+   bool operator()(const Node &a) const
+   {  return static_cast<const Pred&>(*this)(a.m_data);  }
+
+   bool operator()(const Node &a, const Node &b)
+   {  return static_cast<Pred&>(*this)(a.m_data, b.m_data);  }
+
+   bool operator()(const Node &a)
+   {  return static_cast<Pred&>(*this)(a.m_data);  }
+
+   predicate_type &       predicate()        { return static_cast<predicate_type&>(*this); }
+   const predicate_type & predicate()  const { return static_cast<predicate_type&>(*this); }
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //BOOST_CONTAINER_DETAIL_COMPARE_FUNCTORS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/construct_in_place.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_CONSTRUCT_IN_PLACE_HPP
+#define BOOST_CONTAINER_DETAIL_CONSTRUCT_IN_PLACE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/allocator_traits.hpp>
+#include <boost/container/detail/iterators.hpp>
+
+namespace boost {
+namespace container {
+
+template<class Allocator, class T, class InpIt>
+inline void construct_in_place(Allocator &a, T* dest, InpIt source)
+{     boost::container::allocator_traits<Allocator>::construct(a, dest, *source);  }
+
+template<class Allocator, class T, class U, class D>
+inline void construct_in_place(Allocator &a, T *dest, value_init_construct_iterator<U, D>)
+{
+   boost::container::allocator_traits<Allocator>::construct(a, dest);
+}
+
+template <class T, class Difference>
+class default_init_construct_iterator;
+
+template<class Allocator, class T, class U, class D>
+inline void construct_in_place(Allocator &a, T *dest, default_init_construct_iterator<U, D>)
+{
+   boost::container::allocator_traits<Allocator>::construct(a, dest, default_init);
+}
+
+template <class T, class EmplaceFunctor, class Difference>
+class emplace_iterator;
+
+template<class Allocator, class T, class U, class EF, class D>
+inline void construct_in_place(Allocator &a, T *dest, emplace_iterator<U, EF, D> ei)
+{
+   ei.construct_in_place(a, dest);
+}
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_CONSTRUCT_IN_PLACE_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/copy_move_algo.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1133 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_UTILITIES_HPP
+#define BOOST_CONTAINER_DETAIL_UTILITIES_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+// container
+#include <boost/container/allocator_traits.hpp>
+// container/detail
+#include <boost/container/detail/iterator.hpp>
+#include <boost/container/detail/iterator_to_raw_pointer.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/type_traits.hpp>
+// move
+#include <boost/move/adl_move_swap.hpp>
+#include <boost/move/iterator.hpp>
+#include <boost/move/utility_core.hpp>
+// other
+#include <boost/core/no_exceptions_support.hpp>
+// std
+#include <cstring> //for emmove/memcpy
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template<class I>
+struct are_elements_contiguous
+{
+   static const bool value = false;
+};
+
+/////////////////////////
+//    raw pointers
+/////////////////////////
+
+template<class T>
+struct are_elements_contiguous<T*>
+{
+   static const bool value = true;
+};
+
+/////////////////////////
+//    move iterators
+/////////////////////////
+
+template<class It>
+struct are_elements_contiguous< ::boost::move_iterator<It> >
+   : are_elements_contiguous<It>
+{};
+
+/////////////////////////
+//    predeclarations
+/////////////////////////
+
+#ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
+
+template<class Pointer>
+class vector_iterator;
+
+template<class Pointer>
+class vector_const_iterator;
+
+#endif   //BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
+
+}  //namespace container_detail {
+}  //namespace container {
+
+namespace interprocess {
+
+template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
+class offset_ptr;
+
+}  //namespace interprocess {
+
+namespace container {
+
+namespace container_detail {
+
+/////////////////////////
+//vector_[const_]iterator
+/////////////////////////
+
+#ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
+
+template<class Pointer>
+struct are_elements_contiguous<boost::container::container_detail::vector_iterator<Pointer> >
+{
+   static const bool value = true;
+};
+
+template<class Pointer>
+struct are_elements_contiguous<boost::container::container_detail::vector_const_iterator<Pointer> >
+{
+   static const bool value = true;
+};
+
+#endif   //BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
+
+/////////////////////////
+//    offset_ptr
+/////////////////////////
+
+template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
+struct are_elements_contiguous< ::boost::interprocess::offset_ptr<PointedType, DifferenceType, OffsetType, OffsetAlignment> >
+{
+   static const bool value = true;
+};
+
+template <typename I, typename O>
+struct are_contiguous_and_same
+{
+   static const bool is_same_io =
+      is_same< typename remove_const< typename ::boost::container::iterator_traits<I>::value_type >::type
+             , typename ::boost::container::iterator_traits<O>::value_type
+             >::value;
+   static const bool value = is_same_io &&
+      are_elements_contiguous<I>::value &&
+      are_elements_contiguous<O>::value;
+};
+
+template <typename I, typename O>
+struct is_memtransfer_copy_assignable
+{
+   static const bool value = are_contiguous_and_same<I, O>::value &&
+      container_detail::is_trivially_copy_assignable< typename ::boost::container::iterator_traits<I>::value_type >::value;
+};
+
+template <typename I, typename O>
+struct is_memtransfer_copy_constructible
+{
+   static const bool value = are_contiguous_and_same<I, O>::value &&
+      container_detail::is_trivially_copy_constructible< typename ::boost::container::iterator_traits<I>::value_type >::value;
+};
+
+template <typename I, typename O, typename R>
+struct enable_if_memtransfer_copy_constructible
+   : enable_if_c<container_detail::is_memtransfer_copy_constructible<I, O>::value, R>
+{};
+
+template <typename I, typename O, typename R>
+struct disable_if_memtransfer_copy_constructible
+   : enable_if_c<!container_detail::is_memtransfer_copy_constructible<I, O>::value, R>
+{};
+
+template <typename I, typename O, typename R>
+struct enable_if_memtransfer_copy_assignable
+   : enable_if_c<container_detail::is_memtransfer_copy_assignable<I, O>::value, R>
+{};
+
+template <typename I, typename O, typename R>
+struct disable_if_memtransfer_copy_assignable
+   : enable_if_c<!container_detail::is_memtransfer_copy_assignable<I, O>::value, R>
+{};
+
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline F memmove(I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{
+   typedef typename boost::container::iterator_traits<I>::value_type value_type;
+   typename boost::container::iterator_traits<I>::difference_type n = boost::container::iterator_distance(f, l);
+   std::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n);
+   boost::container::iterator_advance(r, n);
+   return r;
+}
+
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+F memmove_n(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{
+   typedef typename boost::container::iterator_traits<I>::value_type value_type;
+   std::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n);
+   boost::container::iterator_advance(r, n);
+   return r;
+}
+
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+I memmove_n_source(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{
+   typedef typename boost::container::iterator_traits<I>::value_type value_type;
+   std::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n);
+   boost::container::iterator_advance(f, n);
+   return f;
+}
+
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+I memmove_n_source_dest(I f, typename boost::container::iterator_traits<I>::difference_type n, F &r) BOOST_NOEXCEPT_OR_NOTHROW
+{
+   typedef typename boost::container::iterator_traits<I>::value_type value_type;
+   std::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n);
+   boost::container::iterator_advance(f, n);
+   boost::container::iterator_advance(r, n);
+   return f;
+}
+
+template <typename O>
+struct is_memzero_initializable
+{
+   typedef typename ::boost::container::iterator_traits<O>::value_type value_type;
+   static const bool value = are_elements_contiguous<O>::value &&
+      (  container_detail::is_integral<value_type>::value || container_detail::is_enum<value_type>::value
+      #if defined(BOOST_CONTAINER_MEMZEROED_POINTER_IS_NULL)
+      || container_detail::is_pointer<value_type>::value
+      #endif
+      #if defined(BOOST_CONTAINER_MEMZEROED_FLOATING_POINT_IS_ZERO)
+      || container_detail::is_floating_point<value_type>::value
+      #endif
+      #if defined(BOOST_CONTAINER_MEMZEROED_FLOATING_POINT_IS_ZERO) && defined(BOOST_CONTAINER_MEMZEROED_POINTER_IS_NULL)
+      || container_detail::is_pod<value_type>::value
+      #endif
+      );
+};
+
+template <typename O, typename R>
+struct enable_if_memzero_initializable
+   : enable_if_c<container_detail::is_memzero_initializable<O>::value, R>
+{};
+
+template <typename O, typename R>
+struct disable_if_memzero_initializable
+   : enable_if_c<!container_detail::is_memzero_initializable<O>::value, R>
+{};
+
+template <typename I, typename R>
+struct enable_if_trivially_destructible
+   : enable_if_c < false/*container_detail::is_trivially_destructible
+                  <typename boost::container::iterator_traits<I>::value_type>::value*/
+               , R>
+{};
+
+template <typename I, typename R>
+struct disable_if_trivially_destructible
+   : enable_if_c <true/*!container_detail::is_trivially_destructible
+                  <typename boost::container::iterator_traits<I>::value_type>::value*/
+               , R>
+{};
+
+}  //namespace container_detail {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_move_alloc
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; f != l; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, boost::move(*f));
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_move_alloc(Allocator &a, I f, I l, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (f != l) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f));
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_move_alloc(Allocator &, I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove(f, l, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_move_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, boost::move(*f));
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_move_alloc_n(Allocator &a, I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f));
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_move_alloc_n(Allocator &, I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_move_alloc_n_source
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, boost::move(*f));
+//!   \endcode
+//!
+//! <b>Returns</b>: f (after incremented)
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, I>::type
+   uninitialized_move_alloc_n_source(Allocator &a, I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f));
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return f;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, I>::type
+   uninitialized_move_alloc_n_source(Allocator &, I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_copy_alloc
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; f != l; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, *f);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_copy_alloc(Allocator &a, I f, I l, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (f != l) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), *f);
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_copy_alloc(Allocator &, I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove(f, l, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_copy_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, *f);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_copy_alloc_n(Allocator &a, I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), *f);
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, F>::type
+   uninitialized_copy_alloc_n(Allocator &, I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_copy_alloc_n_source
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, *f);
+//!   \endcode
+//!
+//! <b>Returns</b>: f (after incremented)
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_constructible<I, F, I>::type
+   uninitialized_copy_alloc_n_source(Allocator &a, I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), *f);
+         ++f; ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return f;
+}
+
+template
+   <typename Allocator,
+    typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_constructible<I, F, I>::type
+   uninitialized_copy_alloc_n_source(Allocator &, I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_value_init_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename F> // F models ForwardIterator
+inline typename container_detail::disable_if_memzero_initializable<F, F>::type
+   uninitialized_value_init_alloc_n(Allocator &a, typename allocator_traits<Allocator>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r));
+         ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+template
+   <typename Allocator,
+    typename F> // F models ForwardIterator
+inline typename container_detail::enable_if_memzero_initializable<F, F>::type
+   uninitialized_value_init_alloc_n(Allocator &, typename allocator_traits<Allocator>::difference_type n, F r)
+{
+   typedef typename boost::container::iterator_traits<F>::value_type value_type;
+   std::memset((void*)container_detail::iterator_to_raw_pointer(r), 0, sizeof(value_type)*n);
+   boost::container::iterator_advance(r, n);
+   return r;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_default_init_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename F> // F models ForwardIterator
+inline F uninitialized_default_init_alloc_n(Allocator &a, typename allocator_traits<Allocator>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), default_init);
+         ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_fill_alloc
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; f != l; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, *f);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename F, // F models ForwardIterator
+    typename T>
+inline void uninitialized_fill_alloc(Allocator &a, F f, F l, const T &t)
+{
+   F back = f;
+   BOOST_TRY{
+      while (f != l) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(f), t);
+         ++f;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != l; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_fill_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; n--; ++r, ++f)
+//!      allocator_traits::construct(a, &*r, v);
+//!   \endcode
+//!
+//! <b>Returns</b>: r
+template
+   <typename Allocator,
+    typename T,
+    typename F> // F models ForwardIterator
+inline F uninitialized_fill_alloc_n(Allocator &a, const T &v, typename allocator_traits<Allocator>::difference_type n, F r)
+{
+   F back = r;
+   BOOST_TRY{
+      while (n--) {
+         allocator_traits<Allocator>::construct(a, container_detail::iterator_to_raw_pointer(r), v);
+         ++r;
+      }
+   }
+   BOOST_CATCH(...){
+      for (; back != r; ++back){
+         allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(back));
+      }
+      BOOST_RETHROW;
+   }
+   BOOST_CATCH_END
+   return r;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               copy
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>    // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, F>::type
+   copy(I f, I l, F r)
+{
+   while (f != l) {
+      *r = *f;
+      ++f; ++r;
+   }
+   return r;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>    // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, F>::type
+   copy(I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove(f, l, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               copy_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, F>::type
+   copy_n(I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   while (n--) {
+      *r = *f;
+      ++f; ++r;
+   }
+   return r;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, F>::type
+   copy_n(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            copy_n_source
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, I>::type
+   copy_n_source(I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   while (n--) {
+      *r = *f;
+      ++f; ++r;
+   }
+   return f;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, I>::type
+   copy_n_source(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            copy_n_source_dest
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, I>::type
+   copy_n_source_dest(I f, typename boost::container::iterator_traits<I>::difference_type n, F &r)
+{
+   while (n--) {
+      *r = *f;
+      ++f; ++r;
+   }
+   return f;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, I>::type
+   copy_n_source_dest(I f, typename boost::container::iterator_traits<I>::difference_type n, F &r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source_dest(f, n, r);  }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, F>::type
+   move(I f, I l, F r)
+{
+   while (f != l) {
+      *r = ::boost::move(*f);
+      ++f; ++r;
+   }
+   return r;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, F>::type
+   move(I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove(f, l, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, F>::type
+   move_n(I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   while (n--) {
+      *r = ::boost::move(*f);
+      ++f; ++r;
+   }
+   return r;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, F>::type
+   move_n(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n(f, n, r); }
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move_backward
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I,   // I models BidirectionalIterator
+typename F>    // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, F>::type
+   move_backward(I f, I l, F r)
+{
+   while (f != l) {
+      --l; --r;
+      *r = ::boost::move(*l);
+   }
+   return r;
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, F>::type
+   move_backward(I f, I l, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{
+   typedef typename boost::container::iterator_traits<I>::value_type value_type;
+   const typename boost::container::iterator_traits<I>::difference_type n = boost::container::iterator_distance(f, l);
+   r -= n;
+   std::memmove((container_detail::iterator_to_raw_pointer)(r), (container_detail::iterator_to_raw_pointer)(f), sizeof(value_type)*n);
+   return r;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move_n_source_dest
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I    // I models InputIterator
+,typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, I>::type
+   move_n_source_dest(I f, typename boost::container::iterator_traits<I>::difference_type n, F &r)
+{
+   while (n--) {
+      *r = ::boost::move(*f);
+      ++f; ++r;
+   }
+   return f;
+}
+
+template
+<typename I    // I models InputIterator
+,typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, I>::type
+   move_n_source_dest(I f, typename boost::container::iterator_traits<I>::difference_type n, F &r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source_dest(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move_n_source
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+<typename I    // I models InputIterator
+,typename F>   // F models ForwardIterator
+inline typename container_detail::disable_if_memtransfer_copy_assignable<I, F, I>::type
+   move_n_source(I f, typename boost::container::iterator_traits<I>::difference_type n, F r)
+{
+   while (n--) {
+      *r = ::boost::move(*f);
+      ++f; ++r;
+   }
+   return f;
+}
+
+template
+<typename I    // I models InputIterator
+,typename F>   // F models ForwardIterator
+inline typename container_detail::enable_if_memtransfer_copy_assignable<I, F, I>::type
+   move_n_source(I f, typename boost::container::iterator_traits<I>::difference_type n, F r) BOOST_NOEXCEPT_OR_NOTHROW
+{  return container_detail::memmove_n_source(f, n, r); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               destroy_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+   <typename Allocator
+   ,typename I   // I models InputIterator
+   ,typename U>  // U models unsigned integral constant
+inline typename container_detail::disable_if_trivially_destructible<I, void>::type
+   destroy_alloc_n(Allocator &a, I f, U n)
+{
+   while(n--){
+      allocator_traits<Allocator>::destroy(a, container_detail::iterator_to_raw_pointer(f));
+      ++f;
+   }
+}
+
+template
+   <typename Allocator
+   ,typename I   // I models InputIterator
+   ,typename U>  // U models unsigned integral constant
+inline typename container_detail::enable_if_trivially_destructible<I, void>::type
+   destroy_alloc_n(Allocator &, I, U)
+{}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         deep_swap_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+   <std::size_t MaxTmpBytes
+   ,typename Allocator
+   ,typename F // F models ForwardIterator
+   ,typename G // G models ForwardIterator
+   >
+inline typename container_detail::disable_if_memtransfer_copy_assignable<F, G, void>::type
+   deep_swap_alloc_n( Allocator &a, F short_range_f, typename allocator_traits<Allocator>::size_type n_i
+                    , G large_range_f, typename allocator_traits<Allocator>::size_type n_j)
+{
+   typename allocator_traits<Allocator>::size_type n = 0;
+   for (; n != n_i ; ++short_range_f, ++large_range_f, ++n){
+      boost::adl_move_swap(*short_range_f, *large_range_f);
+   }
+   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
+   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
+}
+
+static const std::size_t DeepSwapAllocNMaxStorage = std::size_t(1) << std::size_t(11); //2K bytes
+
+template
+   <std::size_t MaxTmpBytes
+   ,typename Allocator
+   ,typename F // F models ForwardIterator
+   ,typename G // G models ForwardIterator
+   >
+inline typename container_detail::enable_if_c
+   < container_detail::is_memtransfer_copy_assignable<F, G>::value && (MaxTmpBytes <= DeepSwapAllocNMaxStorage) && false
+   , void>::type
+   deep_swap_alloc_n( Allocator &a, F short_range_f, typename allocator_traits<Allocator>::size_type n_i
+                    , G large_range_f, typename allocator_traits<Allocator>::size_type n_j)
+{
+   typedef typename allocator_traits<Allocator>::value_type value_type;
+   typedef typename container_detail::aligned_storage
+      <MaxTmpBytes, container_detail::alignment_of<value_type>::value>::type storage_type;
+   storage_type storage;
+
+   const std::size_t n_i_bytes = sizeof(value_type)*n_i;
+   void *const large_ptr = static_cast<void*>(container_detail::iterator_to_raw_pointer(large_range_f));
+   void *const short_ptr = static_cast<void*>(container_detail::iterator_to_raw_pointer(short_range_f));
+   void *const stora_ptr = static_cast<void*>(container_detail::iterator_to_raw_pointer(storage));
+   std::memcpy(stora_ptr, large_ptr, n_i_bytes);
+   std::memcpy(large_ptr, short_ptr, n_i_bytes);
+   std::memcpy(short_ptr, stora_ptr, n_i_bytes);
+   boost::container::iterator_advance(large_range_f, n_i);
+   boost::container::iterator_advance(short_range_f, n_i);
+   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
+   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
+}
+
+template
+   <std::size_t MaxTmpBytes
+   ,typename Allocator
+   ,typename F // F models ForwardIterator
+   ,typename G // G models ForwardIterator
+   >
+inline typename container_detail::enable_if_c
+   < container_detail::is_memtransfer_copy_assignable<F, G>::value && true//(MaxTmpBytes > DeepSwapAllocNMaxStorage)
+   , void>::type
+   deep_swap_alloc_n( Allocator &a, F short_range_f, typename allocator_traits<Allocator>::size_type n_i
+                    , G large_range_f, typename allocator_traits<Allocator>::size_type n_j)
+{
+   typedef typename allocator_traits<Allocator>::value_type value_type;
+   typedef typename container_detail::aligned_storage
+      <DeepSwapAllocNMaxStorage, container_detail::alignment_of<value_type>::value>::type storage_type;
+   storage_type storage;
+   const std::size_t sizeof_storage = sizeof(storage);
+
+   std::size_t n_i_bytes = sizeof(value_type)*n_i;
+   char *large_ptr = static_cast<char*>(static_cast<void*>(container_detail::iterator_to_raw_pointer(large_range_f)));
+   char *short_ptr = static_cast<char*>(static_cast<void*>(container_detail::iterator_to_raw_pointer(short_range_f)));
+   char *stora_ptr = static_cast<char*>(static_cast<void*>(&storage));
+
+   std::size_t szt_times = n_i_bytes/sizeof_storage;
+   const std::size_t szt_rem = n_i_bytes%sizeof_storage;
+
+   //Loop unrolling using Duff's device, as it seems it helps on some architectures
+   const std::size_t Unroll = 4;
+   std::size_t n = (szt_times + (Unroll-1))/Unroll;
+   const std::size_t branch_number = (!szt_times)*Unroll + (szt_times % Unroll);
+   switch(branch_number){
+      case 4:
+         break;
+      case 0: do{
+         std::memcpy(stora_ptr, large_ptr, sizeof_storage);
+         std::memcpy(large_ptr, short_ptr, sizeof_storage);
+         std::memcpy(short_ptr, stora_ptr, sizeof_storage);
+         large_ptr += sizeof_storage;
+         short_ptr += sizeof_storage;
+         BOOST_CONTAINER_FALLTHOUGH
+      case 3:
+         std::memcpy(stora_ptr, large_ptr, sizeof_storage);
+         std::memcpy(large_ptr, short_ptr, sizeof_storage);
+         std::memcpy(short_ptr, stora_ptr, sizeof_storage);
+         large_ptr += sizeof_storage;
+         short_ptr += sizeof_storage;
+         BOOST_CONTAINER_FALLTHOUGH
+      case 2:
+         std::memcpy(stora_ptr, large_ptr, sizeof_storage);
+         std::memcpy(large_ptr, short_ptr, sizeof_storage);
+         std::memcpy(short_ptr, stora_ptr, sizeof_storage);
+         large_ptr += sizeof_storage;
+         short_ptr += sizeof_storage;
+         BOOST_CONTAINER_FALLTHOUGH
+      case 1:
+         std::memcpy(stora_ptr, large_ptr, sizeof_storage);
+         std::memcpy(large_ptr, short_ptr, sizeof_storage);
+         std::memcpy(short_ptr, stora_ptr, sizeof_storage);
+         large_ptr += sizeof_storage;
+         short_ptr += sizeof_storage;
+         } while(--n);
+   }
+   std::memcpy(stora_ptr, large_ptr, szt_rem);
+   std::memcpy(large_ptr, short_ptr, szt_rem);
+   std::memcpy(short_ptr, stora_ptr, szt_rem);
+   boost::container::iterator_advance(large_range_f, n_i);
+   boost::container::iterator_advance(short_range_f, n_i);
+   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
+   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         copy_assign_range_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+   <typename Allocator
+   ,typename I // F models InputIterator
+   ,typename O // G models OutputIterator
+   >
+void copy_assign_range_alloc_n( Allocator &a, I inp_start, typename allocator_traits<Allocator>::size_type n_i
+                              , O out_start, typename allocator_traits<Allocator>::size_type n_o )
+{
+   if (n_o < n_i){
+      inp_start = boost::container::copy_n_source_dest(inp_start, n_o, out_start);     // may throw
+      boost::container::uninitialized_copy_alloc_n(a, inp_start, n_i - n_o, out_start);// may throw
+   }
+   else{
+      out_start = boost::container::copy_n(inp_start, n_i, out_start);  // may throw
+      boost::container::destroy_alloc_n(a, out_start, n_o - n_i);
+   }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         move_assign_range_alloc_n
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template
+   <typename Allocator
+   ,typename I // F models InputIterator
+   ,typename O // G models OutputIterator
+   >
+void move_assign_range_alloc_n( Allocator &a, I inp_start, typename allocator_traits<Allocator>::size_type n_i
+                              , O out_start, typename allocator_traits<Allocator>::size_type n_o )
+{
+   if (n_o < n_i){
+      inp_start = boost::container::move_n_source_dest(inp_start, n_o, out_start);  // may throw
+      boost::container::uninitialized_move_alloc_n(a, inp_start, n_i - n_o, out_start);  // may throw
+   }
+   else{
+      out_start = boost::container::move_n(inp_start, n_i, out_start);  // may throw
+      boost::container::destroy_alloc_n(a, out_start, n_o - n_i);
+   }
+}
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_UTILITIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/hash_table.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,383 @@
+/*
+template <class Value, unsigned int Options = 0, class Hash = hash<Value>, class Pred = equal_to<Value>,
+          class Allocator = allocator<Value> >
+class hash_set
+{
+public:
+    // types
+    typedef Value                                                      key_type;
+    typedef key_type                                                   value_type;
+    typedef Hash                                                       hasher;
+    typedef Pred                                                       key_equal;
+    typedef Allocator                                                      allocator_type;
+    typedef value_type&                                                reference;
+    typedef const value_type&                                          const_reference;
+    typedef typename allocator_traits<allocator_type>::pointer         pointer;
+    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
+    typedef typename allocator_traits<allocator_type>::size_type       size_type;
+    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
+
+    typedef /unspecified/ iterator;
+    typedef /unspecified/ const_iterator;
+    typedef /unspecified/ local_iterator;
+    typedef /unspecified/ const_local_iterator;
+
+    hash_set()
+        noexcept(
+            is_nothrow_default_constructible<hasher>::value &&
+            is_nothrow_default_constructible<key_equal>::value &&
+            is_nothrow_default_constructible<allocator_type>::value);
+    explicit hash_set(size_type n, const hasher& hf = hasher(),
+                           const key_equal& eql = key_equal(),
+                           const allocator_type& a = allocator_type());
+    template <class InputIterator>
+        hash_set(InputIterator f, InputIterator l,
+                      size_type n = 0, const hasher& hf = hasher(),
+                      const key_equal& eql = key_equal(),
+                      const allocator_type& a = allocator_type());
+    explicit hash_set(const allocator_type&);
+    hash_set(const hash_set&);
+    hash_set(const hash_set&, const Allocator&);
+    hash_set(hash_set&&)
+        noexcept(
+            is_nothrow_move_constructible<hasher>::value &&
+            is_nothrow_move_constructible<key_equal>::value &&
+            is_nothrow_move_constructible<allocator_type>::value);
+    hash_set(hash_set&&, const Allocator&);
+    hash_set(initializer_list<value_type>, size_type n = 0,
+                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
+                  const allocator_type& a = allocator_type());
+    ~hash_set();
+    hash_set& operator=(const hash_set&);
+    hash_set& operator=(hash_set&&)
+        noexcept(
+            allocator_type::propagate_on_container_move_assignment::value &&
+            is_nothrow_move_assignable<allocator_type>::value &&
+            is_nothrow_move_assignable<hasher>::value &&
+            is_nothrow_move_assignable<key_equal>::value);
+    hash_set& operator=(initializer_list<value_type>);
+
+    allocator_type get_allocator() const noexcept;
+
+    bool      empty() const noexcept;
+    size_type size() const noexcept;
+    size_type max_size() const noexcept;
+
+    iterator       begin() noexcept;
+    iterator       end() noexcept;
+    const_iterator begin()  const noexcept;
+    const_iterator end()    const noexcept;
+    const_iterator cbegin() const noexcept;
+    const_iterator cend()   const noexcept;
+
+    template <class... Args>
+        pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
+    template <class... Args>
+        iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
+    pair<iterator, bool> insert(const value_type& obj);
+    pair<iterator, bool> insert(value_type&& obj);
+    iterator insert(const_iterator hint, const value_type& obj);
+    iterator insert(const_iterator hint, value_type&& obj);
+    template <class InputIterator>
+        void insert(InputIterator first, InputIterator last);
+    void insert(initializer_list<value_type>);
+
+    iterator erase(const_iterator position);
+    size_type erase(const key_type& k);
+    iterator erase(const_iterator first, const_iterator last);
+    void clear() noexcept;
+
+    void swap(hash_set&)
+        noexcept(
+            (!allocator_type::propagate_on_container_swap::value ||
+             __is_nothrow_swappable<allocator_type>::value) &&
+            __is_nothrow_swappable<hasher>::value &&
+            __is_nothrow_swappable<key_equal>::value);
+
+    hasher hash_function() const;
+    key_equal key_eq() const;
+
+    iterator       find(const key_type& k);
+    const_iterator find(const key_type& k) const;
+    size_type count(const key_type& k) const;
+    pair<iterator, iterator>             equal_range(const key_type& k);
+    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
+
+    size_type bucket_count() const noexcept;
+    size_type max_bucket_count() const noexcept;
+
+    size_type bucket_size(size_type n) const;
+    size_type bucket(const key_type& k) const;
+
+    local_iterator       begin(size_type n);
+    local_iterator       end(size_type n);
+    const_local_iterator begin(size_type n) const;
+    const_local_iterator end(size_type n) const;
+    const_local_iterator cbegin(size_type n) const;
+    const_local_iterator cend(size_type n) const;
+
+    float load_factor() const noexcept;
+    float max_load_factor() const noexcept;
+    void max_load_factor(float z);
+    void rehash(size_type n);
+    void reserve(size_type n);
+};
+
+template <class Key, class T, unsigned int Options = 0, class Hash = hash<Key>, class Pred = equal_to<Key>,
+          class Allocator = allocator<pair<const Key, T> > >
+class hash_map
+{
+public:
+    // types
+    typedef Key                                                        key_type;
+    typedef T                                                          mapped_type;
+    typedef Hash                                                       hasher;
+    typedef Pred                                                       key_equal;
+    typedef Allocator                                                      allocator_type;
+    typedef pair<const key_type, mapped_type>                          value_type;
+    typedef value_type&                                                reference;
+    typedef const value_type&                                          const_reference;
+    typedef typename allocator_traits<allocator_type>::pointer         pointer;
+    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
+    typedef typename allocator_traits<allocator_type>::size_type       size_type;
+    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
+
+    typedef /unspecified/ iterator;
+    typedef /unspecified/ const_iterator;
+    typedef /unspecified/ local_iterator;
+    typedef /unspecified/ const_local_iterator;
+
+    hash_map()
+        noexcept(
+            is_nothrow_default_constructible<hasher>::value &&
+            is_nothrow_default_constructible<key_equal>::value &&
+            is_nothrow_default_constructible<allocator_type>::value);
+    explicit hash_map(size_type n, const hasher& hf = hasher(),
+                           const key_equal& eql = key_equal(),
+                           const allocator_type& a = allocator_type());
+    template <class InputIterator>
+        hash_map(InputIterator f, InputIterator l,
+                      size_type n = 0, const hasher& hf = hasher(),
+                      const key_equal& eql = key_equal(),
+                      const allocator_type& a = allocator_type());
+    explicit hash_map(const allocator_type&);
+    hash_map(const hash_map&);
+    hash_map(const hash_map&, const Allocator&);
+    hash_map(hash_map&&)
+        noexcept(
+            is_nothrow_move_constructible<hasher>::value &&
+            is_nothrow_move_constructible<key_equal>::value &&
+            is_nothrow_move_constructible<allocator_type>::value);
+    hash_map(hash_map&&, const Allocator&);
+    hash_map(initializer_list<value_type>, size_type n = 0,
+                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
+                  const allocator_type& a = allocator_type());
+    ~hash_map();
+    hash_map& operator=(const hash_map&);
+    hash_map& operator=(hash_map&&)
+        noexcept(
+            allocator_type::propagate_on_container_move_assignment::value &&
+            is_nothrow_move_assignable<allocator_type>::value &&
+            is_nothrow_move_assignable<hasher>::value &&
+            is_nothrow_move_assignable<key_equal>::value);
+    hash_map& operator=(initializer_list<value_type>);
+
+    allocator_type get_allocator() const noexcept;
+
+    bool      empty() const noexcept;
+    size_type size() const noexcept;
+    size_type max_size() const noexcept;
+
+    iterator       begin() noexcept;
+    iterator       end() noexcept;
+    const_iterator begin()  const noexcept;
+    const_iterator end()    const noexcept;
+    const_iterator cbegin() const noexcept;
+    const_iterator cend()   const noexcept;
+
+    template <class... Args>
+        pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
+    template <class... Args>
+        iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
+    pair<iterator, bool> insert(const value_type& obj);
+    template <class P>
+        pair<iterator, bool> insert(P&& obj);
+    iterator insert(const_iterator hint, const value_type& obj);
+    template <class P>
+        iterator insert(const_iterator hint, P&& obj);
+    template <class InputIterator>
+        void insert(InputIterator first, InputIterator last);
+    void insert(initializer_list<value_type>);
+
+    iterator erase(const_iterator position);
+    size_type erase(const key_type& k);
+    iterator erase(const_iterator first, const_iterator last);
+    void clear() noexcept;
+
+    void swap(hash_map&)
+        noexcept(
+            (!allocator_type::propagate_on_container_swap::value ||
+             __is_nothrow_swappable<allocator_type>::value) &&
+            __is_nothrow_swappable<hasher>::value &&
+            __is_nothrow_swappable<key_equal>::value);
+
+    hasher hash_function() const;
+    key_equal key_eq() const;
+
+    iterator       find(const key_type& k);
+    const_iterator find(const key_type& k) const;
+    size_type count(const key_type& k) const;
+    pair<iterator, iterator>             equal_range(const key_type& k);
+    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
+
+    mapped_type& operator[](const key_type& k);
+    mapped_type& operator[](key_type&& k);
+
+    mapped_type&       at(const key_type& k);
+    const mapped_type& at(const key_type& k) const;
+
+    size_type bucket_count() const noexcept;
+    size_type max_bucket_count() const noexcept;
+
+    size_type bucket_size(size_type n) const;
+    size_type bucket(const key_type& k) const;
+
+    local_iterator       begin(size_type n);
+    local_iterator       end(size_type n);
+    const_local_iterator begin(size_type n) const;
+    const_local_iterator end(size_type n) const;
+    const_local_iterator cbegin(size_type n) const;
+    const_local_iterator cend(size_type n) const;
+
+    float load_factor() const noexcept;
+    float max_load_factor() const noexcept;
+    void max_load_factor(float z);
+    void rehash(size_type n);
+    void reserve(size_type n);
+};
+
+*/
+
+template <class Key, class Value, class KeyOfValue, unsigned int Options = 0, class Hash = hash<Key>, class Pred = equal_to<Key>,
+          class Allocator = allocator<Value> >
+class hash_table
+{
+public:
+    // types
+    typedef Value                                                      key_type;
+    typedef key_type                                                   value_type;
+    typedef Hash                                                       hasher;
+    typedef Pred                                                       key_equal;
+    typedef Allocator                                                      allocator_type;
+    typedef value_type&                                                reference;
+    typedef const value_type&                                          const_reference;
+    typedef typename allocator_traits<allocator_type>::pointer         pointer;
+    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
+    typedef typename allocator_traits<allocator_type>::size_type       size_type;
+    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
+
+    typedef /unspecified/ iterator;
+    typedef /unspecified/ const_iterator;
+    typedef /unspecified/ local_iterator;
+    typedef /unspecified/ const_local_iterator;
+
+    hash_set()
+        noexcept(
+            is_nothrow_default_constructible<hasher>::value &&
+            is_nothrow_default_constructible<key_equal>::value &&
+            is_nothrow_default_constructible<allocator_type>::value);
+    explicit hash_set(size_type n, const hasher& hf = hasher(),
+                           const key_equal& eql = key_equal(),
+                           const allocator_type& a = allocator_type());
+    template <class InputIterator>
+        hash_set(InputIterator f, InputIterator l,
+                      size_type n = 0, const hasher& hf = hasher(),
+                      const key_equal& eql = key_equal(),
+                      const allocator_type& a = allocator_type());
+    explicit hash_set(const allocator_type&);
+    hash_set(const hash_set&);
+    hash_set(const hash_set&, const Allocator&);
+    hash_set(hash_set&&)
+        noexcept(
+            is_nothrow_move_constructible<hasher>::value &&
+            is_nothrow_move_constructible<key_equal>::value &&
+            is_nothrow_move_constructible<allocator_type>::value);
+    hash_set(hash_set&&, const Allocator&);
+    hash_set(initializer_list<value_type>, size_type n = 0,
+                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
+                  const allocator_type& a = allocator_type());
+    ~hash_set();
+    hash_set& operator=(const hash_set&);
+    hash_set& operator=(hash_set&&)
+        noexcept(
+            allocator_type::propagate_on_container_move_assignment::value &&
+            is_nothrow_move_assignable<allocator_type>::value &&
+            is_nothrow_move_assignable<hasher>::value &&
+            is_nothrow_move_assignable<key_equal>::value);
+    hash_set& operator=(initializer_list<value_type>);
+
+    allocator_type get_allocator() const noexcept;
+
+    bool      empty() const noexcept;
+    size_type size() const noexcept;
+    size_type max_size() const noexcept;
+
+    iterator       begin() noexcept;
+    iterator       end() noexcept;
+    const_iterator begin()  const noexcept;
+    const_iterator end()    const noexcept;
+    const_iterator cbegin() const noexcept;
+    const_iterator cend()   const noexcept;
+
+    template <class... Args>
+        pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
+    template <class... Args>
+        iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
+    pair<iterator, bool> insert(const value_type& obj);
+    pair<iterator, bool> insert(value_type&& obj);
+    iterator insert(const_iterator hint, const value_type& obj);
+    iterator insert(const_iterator hint, value_type&& obj);
+    template <class InputIterator>
+        void insert(InputIterator first, InputIterator last);
+    void insert(initializer_list<value_type>);
+
+    iterator erase(const_iterator position);
+    size_type erase(const key_type& k);
+    iterator erase(const_iterator first, const_iterator last);
+    void clear() noexcept;
+
+    void swap(hash_set&)
+        noexcept(
+            (!allocator_type::propagate_on_container_swap::value ||
+             __is_nothrow_swappable<allocator_type>::value) &&
+            __is_nothrow_swappable<hasher>::value &&
+            __is_nothrow_swappable<key_equal>::value);
+
+    hasher hash_function() const;
+    key_equal key_eq() const;
+
+    iterator       find(const key_type& k);
+    const_iterator find(const key_type& k) const;
+    size_type count(const key_type& k) const;
+    pair<iterator, iterator>             equal_range(const key_type& k);
+    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
+
+    size_type bucket_count() const noexcept;
+    size_type max_bucket_count() const noexcept;
+
+    size_type bucket_size(size_type n) const;
+    size_type bucket(const key_type& k) const;
+
+    local_iterator       begin(size_type n);
+    local_iterator       end(size_type n);
+    const_local_iterator begin(size_type n) const;
+    const_local_iterator end(size_type n) const;
+    const_local_iterator cbegin(size_type n) const;
+    const_local_iterator cend(size_type n) const;
+
+    float load_factor() const noexcept;
+    float max_load_factor() const noexcept;
+    void max_load_factor(float z);
+    void rehash(size_type n);
+    void reserve(size_type n);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,39 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_ITERATOR_HPP
+#define BOOST_CONTAINER_DETAIL_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/iterator.hpp>
+
+namespace boost {
+namespace container {
+
+using ::boost::intrusive::iterator_traits;
+using ::boost::intrusive::iterator_distance;
+using ::boost::intrusive::iterator_advance;
+using ::boost::intrusive::iterator;
+using ::boost::intrusive::iterator_enable_if_tag;
+using ::boost::intrusive::iterator_disable_if_tag;
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/iterator_to_raw_pointer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,58 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP
+#define BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/iterator.hpp>
+#include <boost/container/detail/to_raw_pointer.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template <class T>
+inline T* iterator_to_pointer(T* i)
+{  return i; }
+
+template <class Iterator>
+inline typename boost::container::iterator_traits<Iterator>::pointer
+   iterator_to_pointer(const Iterator &i)
+{  return i.operator->();  }
+
+template <class Iterator>
+struct iterator_to_element_ptr
+{
+   typedef typename boost::container::iterator_traits<Iterator>::pointer      pointer;
+   typedef typename boost::intrusive::pointer_traits<pointer>::element_type   element_type;
+   typedef element_type* type;
+};
+
+template <class Iterator>
+inline typename iterator_to_element_ptr<Iterator>::type
+   iterator_to_raw_pointer(const Iterator &i)
+{
+   return ::boost::intrusive::detail::to_raw_pointer
+      (  ::boost::container::container_detail::iterator_to_pointer(i)   );
+}
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP
--- a/DEPENDENCIES/generic/include/boost/container/detail/memory_util.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/container for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP
-#define BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP
-
-#if defined(_MSC_VER)
-#  pragma once
-#endif
-
-#include <boost/container/detail/config_begin.hpp>
-#include <boost/container/detail/workaround.hpp>
-#include <boost/container/detail/preprocessor.hpp>
-#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
-
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME allocate
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 2, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME destroy
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 3, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME max_size
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 0, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME select_on_container_copy_construction
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 0, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME construct
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS+1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME swap
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-namespace boost {
-namespace container {
-namespace container_detail {
-
-
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(pointer)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_pointer)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(reference)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_reference)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(void_pointer)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_void_pointer)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(size_type)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_swap)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type)
-
-}  //namespace container_detail {
-}  //namespace container {
-}  //namespace boost {
-
-#include <boost/container/detail/config_end.hpp>
-
-#endif // ! defined(BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/min_max.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,37 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_MIN_MAX_HPP
+#define BOOST_CONTAINER_DETAIL_MIN_MAX_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template<class T>
+const T &max_value(const T &a, const T &b)
+{  return a > b ? a : b;   }
+
+template<class T>
+const T &min_value(const T &a, const T &b)
+{  return a < b ? a : b;   }
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_MIN_MAX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/minimal_char_traits_header.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2015
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_MINIMAL_CHAR_TRAITS_HEADER_HPP
+#define BOOST_CONTAINER_DETAIL_MINIMAL_CHAR_TRAITS_HEADER_HPP
+#
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+#
+#//Try to avoid including <string>, as it's quite big
+#if defined(_MSC_VER) && defined(BOOST_DINKUMWARE_STDLIB)
+   #include <iosfwd>   //Dinkum libraries for MSVC define std::char_traits there
+#elif defined(BOOST_GNU_STDLIB)
+   #include <bits/char_traits.h>
+#else
+   #include <string>  //Fallback
+#endif
+
+#endif //BOOST_CONTAINER_DETAIL_MINIMAL_CHAR_TRAITS_HEADER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/mutex.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,288 @@
+// Copyright (C) 2000 Stephen Cleary
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org for updates, documentation, and revision history.
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_MUTEX_HPP
+#define BOOST_CONTAINER_MUTEX_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//#define BOOST_CONTAINER_NO_MT
+//#define BOOST_CONTAINER_NO_SPINLOCKS
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+// Extremely Light-Weight wrapper classes for OS thread synchronization
+
+#define BOOST_MUTEX_HELPER_NONE         0
+#define BOOST_MUTEX_HELPER_WIN32        1
+#define BOOST_MUTEX_HELPER_PTHREAD      2
+#define BOOST_MUTEX_HELPER_SPINLOCKS    3
+
+#if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT)
+# define BOOST_NO_MT
+#endif
+
+#if defined(BOOST_NO_MT) || defined(BOOST_CONTAINER_NO_MT)
+  // No multithreading -> make locks into no-ops
+  #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE
+#else
+   //Taken from dlmalloc
+   #if !defined(BOOST_CONTAINER_NO_SPINLOCKS) &&                           \
+         ((defined(__GNUC__) &&                                            \
+         ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) ||      \
+         defined(__i386__) || defined(__x86_64__))) ||                     \
+      (defined(_MSC_VER) && _MSC_VER>=1310))
+      #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_SPINLOCKS
+   #endif
+
+   #if defined(BOOST_WINDOWS)
+      #include <windows.h>
+      #ifndef BOOST_MUTEX_HELPER
+         #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32
+      #endif
+   #elif defined(BOOST_HAS_UNISTD_H)
+      #include <unistd.h>
+      #if !defined(BOOST_MUTEX_HELPER) && (defined(_POSIX_THREADS) || defined(BOOST_HAS_PTHREADS))
+         #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD
+      #endif
+   #endif
+#endif
+
+#ifndef BOOST_MUTEX_HELPER
+  #error Unable to determine platform mutex type; #define BOOST_NO_MT to assume single-threaded
+#endif
+
+#if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE
+   //...
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_SPINLOCKS
+   #if defined(_MSC_VER)
+      #ifndef _M_AMD64
+         /* These are already defined on AMD64 builds */
+         #ifdef __cplusplus
+            extern "C" {
+         #endif /* __cplusplus */
+            long __cdecl _InterlockedCompareExchange(long volatile *Dest, long Exchange, long Comp);
+            long __cdecl _InterlockedExchange(long volatile *Target, long Value);
+         #ifdef __cplusplus
+            }
+         #endif /* __cplusplus */
+      #endif /* _M_AMD64 */
+      #pragma intrinsic (_InterlockedCompareExchange)
+      #pragma intrinsic (_InterlockedExchange)
+      #define interlockedcompareexchange _InterlockedCompareExchange
+      #define interlockedexchange        _InterlockedExchange
+   #elif defined(WIN32) && defined(__GNUC__)
+      #define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b)
+      #define interlockedexchange                 __sync_lock_test_and_set
+   #endif /* Win32 */
+
+   /* First, define CAS_LOCK and CLEAR_LOCK on ints */
+   /* Note CAS_LOCK defined to return 0 on success */
+
+   #if defined(__GNUC__)&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
+      #define BOOST_CONTAINER_CAS_LOCK(sl)     __sync_lock_test_and_set(sl, 1)
+      #define BOOST_CONTAINER_CLEAR_LOCK(sl)   __sync_lock_release(sl)
+
+   #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
+      /* Custom spin locks for older gcc on x86 */
+      static FORCEINLINE int boost_container_x86_cas_lock(int *sl) {
+         int ret;
+         int val = 1;
+         int cmp = 0;
+         __asm__ __volatile__  ("lock; cmpxchgl %1, %2"
+                                 : "=a" (ret)
+                                 : "r" (val), "m" (*(sl)), "0"(cmp)
+                                 : "memory", "cc");
+         return ret;
+      }
+
+      static FORCEINLINE void boost_container_x86_clear_lock(int* sl) {
+         assert(*sl != 0);
+         int prev = 0;
+         int ret;
+         __asm__ __volatile__ ("lock; xchgl %0, %1"
+                                 : "=r" (ret)
+                                 : "m" (*(sl)), "0"(prev)
+                                 : "memory");
+      }
+
+      #define BOOST_CONTAINER_CAS_LOCK(sl)     boost_container_x86_cas_lock(sl)
+      #define BOOST_CONTAINER_CLEAR_LOCK(sl)   boost_container_x86_clear_lock(sl)
+
+   #else /* Win32 MSC */
+      #define BOOST_CONTAINER_CAS_LOCK(sl)     interlockedexchange((long volatile*)sl, (long)1)
+      #define BOOST_CONTAINER_CLEAR_LOCK(sl)   interlockedexchange((long volatile*)sl, (long)0)
+   #endif
+
+   /* How to yield for a spin lock */
+   #define SPINS_PER_YIELD       63
+   #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+      #define SLEEP_EX_DURATION     50 /* delay for yield/sleep */
+      #define SPIN_LOCK_YIELD  SleepEx(SLEEP_EX_DURATION, FALSE)
+   #elif defined (__SVR4) && defined (__sun) /* solaris */
+      #include <thread.h>
+      #define SPIN_LOCK_YIELD   thr_yield();
+   #elif !defined(LACKS_SCHED_H)
+      #include <sched.h>
+      #define SPIN_LOCK_YIELD   sched_yield();
+   #else
+      #define SPIN_LOCK_YIELD
+   #endif /* ... yield ... */
+
+   #define BOOST_CONTAINER_SPINS_PER_YIELD       63
+   inline int boost_interprocess_spin_acquire_lock(int *sl) {
+      int spins = 0;
+      while (*(volatile int *)sl != 0 ||
+         BOOST_CONTAINER_CAS_LOCK(sl)) {
+         if ((++spins & BOOST_CONTAINER_SPINS_PER_YIELD) == 0) {
+            SPIN_LOCK_YIELD;
+         }
+      }
+      return 0;
+   }
+   #define BOOST_CONTAINER_MLOCK_T               int
+   #define BOOST_CONTAINER_TRY_LOCK(sl)          !BOOST_CONTAINER_CAS_LOCK(sl)
+   #define BOOST_CONTAINER_RELEASE_LOCK(sl)      BOOST_CONTAINER_CLEAR_LOCK(sl)
+   #define BOOST_CONTAINER_ACQUIRE_LOCK(sl)      (BOOST_CONTAINER_CAS_LOCK(sl)? boost_interprocess_spin_acquire_lock(sl) : 0)
+   #define BOOST_MOVE_INITIAL_LOCK(sl)      (*sl = 0)
+   #define BOOST_CONTAINER_DESTROY_LOCK(sl)      (0)
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32
+   //
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD
+   #include <pthread.h>
+#endif
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+#if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE
+   class null_mutex
+   {
+   private:
+      null_mutex(const null_mutex &);
+      void operator=(const null_mutex &);
+
+   public:
+      null_mutex() { }
+
+      static void lock() { }
+      static void unlock() { }
+   };
+
+  typedef null_mutex default_mutex;
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_SPINLOCKS
+
+   class spin_mutex
+   {
+   private:
+      BOOST_CONTAINER_MLOCK_T sl;
+      spin_mutex(const spin_mutex &);
+      void operator=(const spin_mutex &);
+
+   public:
+      spin_mutex() { BOOST_MOVE_INITIAL_LOCK(&sl); }
+
+      void lock() { BOOST_CONTAINER_ACQUIRE_LOCK(&sl); }
+      void unlock() { BOOST_CONTAINER_RELEASE_LOCK(&sl); }
+   };
+  typedef spin_mutex default_mutex;
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32
+   class mutex
+   {
+   private:
+      CRITICAL_SECTION mtx;
+
+      mutex(const mutex &);
+      void operator=(const mutex &);
+
+   public:
+      mutex()
+      { InitializeCriticalSection(&mtx); }
+
+      ~mutex()
+      { DeleteCriticalSection(&mtx); }
+
+      void lock()
+      { EnterCriticalSection(&mtx); }
+
+      void unlock()
+      { LeaveCriticalSection(&mtx); }
+   };
+
+  typedef mutex default_mutex;
+#elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD
+   class mutex
+   {
+   private:
+      pthread_mutex_t mtx;
+
+      mutex(const mutex &);
+      void operator=(const mutex &);
+
+   public:
+      mutex()
+      { pthread_mutex_init(&mtx, 0); }
+
+      ~mutex()
+      { pthread_mutex_destroy(&mtx); }
+
+      void lock()
+      { pthread_mutex_lock(&mtx); }
+
+      void unlock()
+      { pthread_mutex_unlock(&mtx); }
+   };
+
+  typedef mutex default_mutex;
+#endif
+
+template<class Mutex>
+class scoped_lock
+{
+   public:
+   scoped_lock(Mutex &m)
+      :  m_(m)
+   { m_.lock(); }
+   ~scoped_lock()
+   { m_.unlock(); }
+
+   private:
+   Mutex &m_;
+};
+
+} // namespace container_detail
+} // namespace container
+} // namespace boost
+
+#undef BOOST_MUTEX_HELPER_WIN32
+#undef BOOST_MUTEX_HELPER_PTHREAD
+#undef BOOST_MUTEX_HELPER_NONE
+#undef BOOST_MUTEX_HELPER
+#undef BOOST_MUTEX_HELPER_SPINLOCKS
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/next_capacity.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP
+#define BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+// container
+#include <boost/container/throw_exception.hpp>
+// container/detail
+#include <boost/container/detail/min_max.hpp>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+enum NextCapacityOption { NextCapacityDouble, NextCapacity60Percent };
+
+template<class SizeType, NextCapacityOption Option>
+struct next_capacity_calculator;
+
+template<class SizeType>
+struct next_capacity_calculator<SizeType, NextCapacityDouble>
+{
+   static SizeType get(const SizeType max_size
+                      ,const SizeType capacity
+                      ,const SizeType n)
+   {
+      const SizeType remaining = max_size - capacity;
+      if ( remaining < n )
+         boost::container::throw_length_error("get_next_capacity, allocator's max_size reached");
+      const SizeType additional = max_value(n, capacity);
+      return ( remaining < additional ) ? max_size : ( capacity + additional );
+   }
+};
+
+template<class SizeType>
+struct next_capacity_calculator<SizeType, NextCapacity60Percent>
+{
+   static SizeType get(const SizeType max_size
+                     ,const SizeType capacity
+                     ,const SizeType n)
+   {
+      const SizeType remaining = max_size - capacity;
+      if ( remaining < n )
+         boost::container::throw_length_error("get_next_capacity, allocator's max_size reached");
+      const SizeType m3 = max_size/3;
+
+      if (capacity < m3)
+         return capacity + max_value(3*(capacity+1)/5, n);
+
+      if (capacity < m3*2)
+         return capacity + max_value((capacity+1)/2, n);
+      return max_size;
+   }
+};
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/node_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,157 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_NODE_POOL_HPP
+#define BOOST_CONTAINER_DETAIL_NODE_POOL_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/detail/mutex.hpp>
+#include <boost/container/detail/pool_common_alloc.hpp>
+#include <boost/container/detail/node_pool_impl.hpp>
+#include <boost/container/detail/mutex.hpp>
+#include <boost/move/utility_core.hpp>
+#include <cstddef>
+#include <cassert>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+//!Pooled memory allocator using single segregated storage. Includes
+//!a reference count but the class does not delete itself, this is
+//!responsibility of user classes. Node size (NodeSize) and the number of
+//!nodes allocated per block (NodesPerBlock) are known at compile time
+template< std::size_t NodeSize, std::size_t NodesPerBlock >
+class private_node_pool
+   //Inherit from the implementation to avoid template bloat
+   :  public boost::container::container_detail::
+         private_node_pool_impl<fake_segment_manager>
+{
+   typedef boost::container::container_detail::
+      private_node_pool_impl<fake_segment_manager>   base_t;
+   //Non-copyable
+   private_node_pool(const private_node_pool &);
+   private_node_pool &operator=(const private_node_pool &);
+
+   public:
+   typedef typename base_t::multiallocation_chain multiallocation_chain;
+   static const std::size_t nodes_per_block = NodesPerBlock;
+
+   //!Constructor from a segment manager. Never throws
+   private_node_pool()
+      :  base_t(0, NodeSize, NodesPerBlock)
+   {}
+
+};
+
+template< std::size_t NodeSize
+        , std::size_t NodesPerBlock
+        >
+class shared_node_pool
+   : public private_node_pool<NodeSize, NodesPerBlock>
+{
+   private:
+   typedef private_node_pool<NodeSize, NodesPerBlock> private_node_allocator_t;
+
+   public:
+   typedef typename private_node_allocator_t::free_nodes_t  free_nodes_t;
+   typedef typename private_node_allocator_t::multiallocation_chain multiallocation_chain;
+
+   //!Constructor from a segment manager. Never throws
+   shared_node_pool()
+   : private_node_allocator_t(){}
+
+   //!Destructor. Deallocates all allocated blocks. Never throws
+   ~shared_node_pool()
+   {}
+
+   //!Allocates array of count elements. Can throw std::bad_alloc
+   void *allocate_node()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      return private_node_allocator_t::allocate_node();
+   }
+
+   //!Deallocates an array pointed by ptr. Never throws
+   void deallocate_node(void *ptr)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_node(ptr);
+   }
+
+   //!Allocates a singly linked list of n nodes ending in null pointer.
+   //!can throw std::bad_alloc
+   void allocate_nodes(const std::size_t n, multiallocation_chain &chain)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      return private_node_allocator_t::allocate_nodes(n, chain);
+   }
+
+   void deallocate_nodes(multiallocation_chain &chain)
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_nodes(chain);
+   }
+
+   //!Deallocates all the free blocks of memory. Never throws
+   void deallocate_free_blocks()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::deallocate_free_blocks();
+   }
+
+   //!Deallocates all blocks. Never throws
+   void purge_blocks()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      private_node_allocator_t::purge_blocks();
+   }
+
+   std::size_t num_free_nodes()
+   {
+      //-----------------------
+      scoped_lock<default_mutex> guard(mutex_);
+      //-----------------------
+      return private_node_allocator_t::num_free_nodes();
+   }
+
+   private:
+   default_mutex mutex_;
+};
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_NODE_POOL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/placement_new.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+#ifndef BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
+#define BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
+///////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+struct boost_container_new_t{};
+
+//avoid including <new>
+inline void *operator new(std::size_t, void *p, boost_container_new_t)
+{  return p;  }
+
+inline void operator delete(void *, void *, boost_container_new_t)
+{}
+
+#endif   //BOOST_CONTAINER_DETAIL_PLACEMENT_NEW_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/pool_common_alloc.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,102 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP
+#define BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/throw_exception.hpp>
+
+#include <boost/intrusive/slist.hpp>
+#include <boost/container/detail/pool_common.hpp>
+#include <boost/container/detail/alloc_lib.h>
+#include <cstddef>
+
+namespace boost{
+namespace container{
+namespace container_detail{
+
+struct node_slist_helper
+   : public boost::container::container_detail::node_slist<void*>
+{};
+
+struct fake_segment_manager
+{
+   typedef void * void_pointer;
+   static const std::size_t PayloadPerAllocation = BOOST_CONTAINER_ALLOCATION_PAYLOAD;
+
+   typedef boost::container::container_detail::
+      basic_multiallocation_chain<void*>              multiallocation_chain;
+   static void deallocate(void_pointer p)
+   { boost_cont_free(p); }
+
+   static void deallocate_many(multiallocation_chain &chain)
+   {
+      std::size_t size = chain.size();
+      std::pair<void*, void*> ptrs = chain.extract_data();
+      boost_cont_memchain dlchain;
+      BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&dlchain, ptrs.first, ptrs.second, size);
+      boost_cont_multidealloc(&dlchain);
+   }
+
+   typedef std::ptrdiff_t  difference_type;
+   typedef std::size_t     size_type;
+
+   static void *allocate_aligned(std::size_t nbytes, std::size_t alignment)
+   {
+      void *ret = boost_cont_memalign(nbytes, alignment);
+      if(!ret)
+         boost::container::throw_bad_alloc();
+      return ret;
+   }
+
+   static void *allocate(std::size_t nbytes)
+   {
+      void *ret = boost_cont_malloc(nbytes);
+      if(!ret)
+         boost::container::throw_bad_alloc();
+      return ret;
+   }
+};
+
+}  //namespace boost{
+}  //namespace container{
+}  //namespace container_detail{
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+template<class T>
+struct is_stateless_segment_manager;
+
+template<>
+struct is_stateless_segment_manager
+   <boost::container::container_detail::fake_segment_manager>
+{
+   static const bool value = true;
+};
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINER_DETAIL_POOL_COMMON_ALLOC_HPP
--- a/DEPENDENCIES/generic/include/boost/container/detail/preprocessor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/container for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP
-#define BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP
-
-#if defined(_MSC_VER)
-#  pragma once
-#endif
-
-#include <boost/container/detail/config_begin.hpp>
-#include <boost/container/detail/workaround.hpp>
-#include <boost/move/utility.hpp>
-
-#ifdef BOOST_CONTAINER_PERFECT_FORWARDING
-//#error "This file is not needed when perfect forwarding is available"
-#endif   //BOOST_CONTAINER_PERFECT_FORWARDING
-
-#include <boost/preprocessor/iteration/local.hpp>
-#include <boost/preprocessor/punctuation/paren_if.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/control/expr_if.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing.hpp>
-#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
-#include <boost/preprocessor/repetition/enum_shifted.hpp>
-#include <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/logical/not.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-#include <boost/move/utility.hpp>
-
-#define BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS 10
-
-//Note:
-//We define template parameters as const references to
-//be able to bind temporaries. After that we will un-const them.
-//This cast is ugly but it is necessary until "perfect forwarding"
-//is achieved in C++0x. Meanwhile, if we want to be able to
-//bind rvalues with non-const references, we have to be ugly
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-   #define BOOST_CONTAINER_PP_PARAM_LIST(z, n, data) \
-   BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \
-   //!
-#else
-   #define BOOST_CONTAINER_PP_PARAM_LIST(z, n, data) \
-   const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \
-   //!
-#endif   //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#define BOOST_CONTAINER_PP_CONST_REF_PARAM_LIST_Q(z, n, Data) \
-const BOOST_PP_CAT(Q, n) & BOOST_PP_CAT(q, n) \
-//!
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-   #define BOOST_CONTAINER_PP_PARAM(U, u) \
-   U && u \
-   //!
-#else
-   #define BOOST_CONTAINER_PP_PARAM(U, u) \
-   const U & u \
-   //!
-#endif   //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #define BOOST_CONTAINER_PP_PARAM_INIT(z, n, data) \
-   BOOST_PP_CAT(m_p, n) (::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ))           \
-   //!
-
-#else //BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #define BOOST_CONTAINER_PP_PARAM_INIT(z, n, data) \
-   BOOST_PP_CAT(m_p, n) (const_cast<BOOST_PP_CAT(P, n) &>(BOOST_PP_CAT(p, n))) \
-   //!
-#endif   //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-      namespace boost {
-      namespace container {
-      namespace container_detail {
-         template<class T>
-         struct ref_holder;
-
-         template<class T>
-         struct ref_holder<T &>
-         {
-            explicit ref_holder(T &t)
-               : t_(t)
-            {}
-            T &t_;
-            T & get() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder<const T>
-         {
-            explicit ref_holder(const T &t)
-               : t_(t)
-            {}
-            const T &t_;
-            const T & get() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder<const T &&>
-         {
-            explicit ref_holder(const T &t)
-               : t_(t)
-            {}
-            const T &t_;
-            const T & get() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder
-         {
-            explicit ref_holder(T &&t)
-               : t_(t)
-            {}
-            T &t_;
-            T && get() {  return ::boost::move(t_);   }
-         };
-
-         template<class T>
-         struct ref_holder<T &&>
-         {
-            explicit ref_holder(T &&t)
-               : t_(t)
-            {}
-            T &t_;
-            T && get()  { return ::boost::move(t_); }
-         };
-
-      }  //namespace container_detail {
-      }  //namespace container {
-      }  //namespace boost {
-
-      #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data)  \
-         ::boost::container::container_detail::ref_holder<BOOST_PP_CAT(P, n)> BOOST_PP_CAT(m_p, n);  \
-      //!
-
-   #else //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
-
-      #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data)  \
-      BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n);            \
-      //!
-
-   #endif //defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-#else //BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data)  \
-   BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n);             \
-   //!
-#endif   //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-   #define BOOST_CONTAINER_PP_MEMBER_FORWARD(z, n, data) BOOST_PP_CAT(this->m_p, n).get() \
-   //!
-
-#else //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-   #define BOOST_CONTAINER_PP_MEMBER_FORWARD(z, n, data) \
-   ::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(this->m_p, n) ) \
-   //!
-
-#endif   //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-#define BOOST_CONTAINER_PP_PARAM_INC(z, n, data)   \
-  BOOST_PP_CAT(++this->m_p, n)                     \
-//!
-
-#define BOOST_CONTAINER_PP_IDENTITY(z, n, data) data
-
-
-#define BOOST_CONTAINER_PP_PARAM_FORWARD(z, n, data) \
-::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \
-//!
-
-#define BOOST_CONTAINER_PP_DECLVAL(z, n, data) \
-::boost::move_detail::declval< BOOST_PP_CAT(P, n) >() \
-//!
-
-#define BOOST_CONTAINER_PP_MEMBER_IT_FORWARD(z, n, data) \
-BOOST_PP_CAT(*this->m_p, n) \
-//!
-
-#define BOOST_CONTAINER_PP_TEMPLATE_PARAM_VOID_DEFAULT(z, n, data)   \
-  BOOST_PP_CAT(class P, n) = void                                    \
-//!
-
-#define BOOST_CONTAINER_PP_TEMPLATE_PARAM_WITH_DEFAULT(z, n, default_type) \
-  BOOST_PP_CAT(class P, n) = default_type                                  \
-//!
-
-#define BOOST_CONTAINER_PP_STATIC_PARAM_REF_DECLARE(z, n, data) \
-   static BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n); \
-//!
-
-#define BOOST_CONTAINER_PP_PARAM_PASS(z, n, data) \
-   BOOST_PP_CAT(p, n) \
-//!
-
-#define BOOST_CONTAINER_PP_FWD_TYPE(z, n, data) \
-   typename ::boost::move_detail::forward_type< BOOST_PP_CAT(P, n) >::type \
-//!
-
-#include <boost/container/detail/config_end.hpp>
-
-//#else
-
-//#ifdef BOOST_CONTAINER_PERFECT_FORWARDING
-//#error "This file is not needed when perfect forwarding is available"
-//#endif   //BOOST_CONTAINER_PERFECT_FORWARDING
-
-#endif //#ifndef BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/singleton.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,121 @@
+// Copyright (C) 2000 Stephen Cleary
+// Copyright (C) 2008 Ion Gaztanaga
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org for updates, documentation, and revision history.
+//
+// This file is a modified file from Boost.Pool
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_SINGLETON_DETAIL_HPP
+#define BOOST_CONTAINER_DETAIL_SINGLETON_DETAIL_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+//
+// The following helper classes are placeholders for a generic "singleton"
+//  class.  The classes below support usage of singletons, including use in
+//  program startup/shutdown code, AS LONG AS there is only one thread
+//  running before main() begins, and only one thread running after main()
+//  exits.
+//
+// This class is also limited in that it can only provide singleton usage for
+//  classes with default constructors.
+//
+
+// The design of this class is somewhat twisted, but can be followed by the
+//  calling inheritance.  Let us assume that there is some user code that
+//  calls "singleton_default<T>::instance()".  The following (convoluted)
+//  sequence ensures that the same function will be called before main():
+//    instance() contains a call to create_object.do_nothing()
+//    Thus, object_creator is implicitly instantiated, and create_object
+//      must exist.
+//    Since create_object is a static member, its constructor must be
+//      called before main().
+//    The constructor contains a call to instance(), thus ensuring that
+//      instance() will be called before main().
+//    The first time instance() is called (i.e., before main()) is the
+//      latest point in program execution where the object of type T
+//      can be created.
+//    Thus, any call to instance() will auto-magically result in a call to
+//      instance() before main(), unless already present.
+//  Furthermore, since the instance() function contains the object, instead
+//  of the singleton_default class containing a static instance of the
+//  object, that object is guaranteed to be constructed (at the latest) in
+//  the first call to instance().  This permits calls to instance() from
+//  static code, even if that code is called before the file-scope objects
+//  in this file have been initialized.
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+// T must be: no-throw default constructible and no-throw destructible
+template <typename T>
+struct singleton_default
+{
+  private:
+    struct object_creator
+    {
+      // This constructor does nothing more than ensure that instance()
+      //  is called before main() begins, thus creating the static
+      //  T object before multithreading race issues can come up.
+      object_creator() { singleton_default<T>::instance(); }
+      inline void do_nothing() const { }
+    };
+    static object_creator create_object;
+
+    singleton_default();
+
+  public:
+    typedef T object_type;
+
+    // If, at any point (in user code), singleton_default<T>::instance()
+    //  is called, then the following function is instantiated.
+    static object_type & instance()
+    {
+      // This is the object that we return a reference to.
+      // It is guaranteed to be created before main() begins because of
+      //  the next line.
+      static object_type obj;
+
+      // The following line does nothing else than force the instantiation
+      //  of singleton_default<T>::create_object, whose constructor is
+      //  called before main() begins.
+      create_object.do_nothing();
+
+      return obj;
+    }
+};
+template <typename T>
+typename singleton_default<T>::object_creator
+singleton_default<T>::create_object;
+
+} // namespace container_detail
+} // namespace container
+} // namespace boost
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINER_DETAIL_SINGLETON_DETAIL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/std_fwd.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
+#define BOOST_CONTAINER_DETAIL_STD_FWD_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//                        Standard predeclarations
+//////////////////////////////////////////////////////////////////////////////
+
+#if defined(__clang__) && defined(_LIBCPP_VERSION)
+   #define BOOST_CONTAINER_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic push
+   #pragma GCC diagnostic ignored "-Wc++11-extensions"
+   #define BOOST_CONTAINER_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+   #define BOOST_CONTAINER_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION)  //GCC >= 4.6
+   #define BOOST_CONTAINER_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
+   #define BOOST_CONTAINER_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION  } // namespace
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE)  //GCC >= 4.2
+   #define BOOST_CONTAINER_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
+   #define BOOST_CONTAINER_STD_NS_END _GLIBCXX_END_NAMESPACE
+#else
+   #define BOOST_CONTAINER_STD_NS_BEG namespace std{
+   #define BOOST_CONTAINER_STD_NS_END }
+#endif
+
+BOOST_CONTAINER_STD_NS_BEG
+
+template<class T>
+class allocator;
+
+template<class T>
+struct less;
+
+template<class T1, class T2>
+struct pair;
+
+template<class T>
+struct char_traits;
+
+struct input_iterator_tag;
+struct forward_iterator_tag;
+struct bidirectional_iterator_tag;
+struct random_access_iterator_tag;
+
+template<class Container>
+class insert_iterator;
+
+struct allocator_arg_t;
+
+BOOST_CONTAINER_STD_NS_END
+
+#ifdef BOOST_CONTAINER_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic pop
+   #undef BOOST_CONTAINER_CLANG_INLINE_STD_NS
+#endif   //BOOST_CONTAINER_CLANG_INLINE_STD_NS
+
+#endif //#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/detail/to_raw_pointer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_TO_RAW_POINTER_HPP
+#define BOOST_CONTAINER_DETAIL_TO_RAW_POINTER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/to_raw_pointer.hpp>
+
+namespace boost {
+namespace container {
+namespace container_detail {
+
+using ::boost::intrusive::detail::to_raw_pointer;
+
+}  //namespace container_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINER_DETAIL_TO_RAW_POINTER_HPP
--- a/DEPENDENCIES/generic/include/boost/container/detail/utilities.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1180 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/container for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_CONTAINER_DETAIL_UTILITIES_HPP
-#define BOOST_CONTAINER_DETAIL_UTILITIES_HPP
-
-#include "config_begin.hpp"
-#include "workaround.hpp"
-#include <cstdio>
-#include <cstring> //for ::memcpy
-#include <boost/type_traits/is_fundamental.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/is_enum.hpp>
-#include <boost/type_traits/is_member_pointer.hpp>
-#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/has_trivial_destructor.hpp>
-#include <boost/move/core.hpp>
-#include <boost/move/utility.hpp>
-#include <boost/move/iterator.hpp>
-#include <boost/container/detail/mpl.hpp>
-#include <boost/container/detail/type_traits.hpp>
-#include <boost/container/allocator_traits.hpp>
-#include <boost/detail/no_exceptions_support.hpp>
-#include <boost/type_traits/has_trivial_copy.hpp>
-#include <boost/type_traits/has_trivial_assign.hpp>
-#include <boost/container/detail/memory_util.hpp>
-#include <boost/aligned_storage.hpp>
-#include <algorithm>
-#include <iterator>
-#include <utility>   //std::distance
-
-namespace boost {
-namespace container {
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                                  swap
-//
-//////////////////////////////////////////////////////////////////////////////
-
-namespace container_swap {
-
-template<class T, bool IsClass = boost::is_class<T>::value >
-struct has_member_swap
-{
-   static const bool value = boost::container::container_detail::
-      has_member_function_callable_with_swap<T, T &>::value;
-};
-
-template<class T>
-struct has_member_swap<T, false>
-{
-   static const bool value = false;
-};
-
-}  //namespace container_swap {
-
-template<class T> inline
-typename container_detail::enable_if_c
-      <container_swap::has_member_swap<T>::value, void>::type
-swap_dispatch(T &left, T &right)   //swap using member swap
-{
-   left.swap(right); // may throw
-}
-
-template<class T> inline
-typename container_detail::enable_if_c
-      <!container_swap::has_member_swap<T>::value && boost::has_move_emulation_enabled<T>::value, void>::type
-   swap_dispatch(T &left, T &right)
-{
-   T temp(boost::move(left)); // may throw
-   left = boost::move(right); // may throw
-   right = boost::move(temp); // may throw
-}
-
-template<class T> inline
-typename container_detail::enable_if_c
-      <!container_swap::has_member_swap<T>::value && !boost::has_move_emulation_enabled<T>::value, void>::type
-   swap_dispatch(T &left, T &right)
-{
-   using std::swap;
-   swap(left, right);   // may throw
-}
-
-namespace container_detail {
-
-template <typename T>
-inline T* addressof(T& obj)
-{
-   return static_cast<T*>(
-	   static_cast<void*>(
-	      const_cast<char*>(
-            &reinterpret_cast<const char&>(obj)
-   )));
-}
-
-template<class T>
-const T &max_value(const T &a, const T &b)
-{  return a > b ? a : b;   }
-
-template<class T>
-const T &min_value(const T &a, const T &b)
-{  return a < b ? a : b;   }
-
-template <class SizeType>
-SizeType
-   get_next_capacity(const SizeType max_size
-                    ,const SizeType capacity
-                    ,const SizeType n)
-{
-//   if (n > max_size - capacity)
-//      throw std::length_error("get_next_capacity");
-
-   const SizeType m3 = max_size/3;
-
-   if (capacity < m3)
-      return capacity + max_value(3*(capacity+1)/5, n);
-
-   if (capacity < m3*2)
-      return capacity + max_value((capacity+1)/2, n);
-
-   return max_size;
-}
-
-template <class T>
-inline T* to_raw_pointer(T* p)
-{  return p; }
-
-template <class Pointer>
-inline typename Pointer::element_type*
-   to_raw_pointer(const Pointer &p)
-{  return boost::container::container_detail::to_raw_pointer(p.operator->());  }
-
-
-template<class AllocatorType>
-inline void swap_alloc(AllocatorType &, AllocatorType &, container_detail::false_type)
-   BOOST_CONTAINER_NOEXCEPT
-{}
-
-template<class AllocatorType>
-inline void swap_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
-{  boost::container::swap_dispatch(l, r);   }
-
-template<class AllocatorType>
-inline void assign_alloc(AllocatorType &, const AllocatorType &, container_detail::false_type)
-   BOOST_CONTAINER_NOEXCEPT
-{}
-
-template<class AllocatorType>
-inline void assign_alloc(AllocatorType &l, const AllocatorType &r, container_detail::true_type)
-{  l = r;   }
-
-template<class AllocatorType>
-inline void move_alloc(AllocatorType &, AllocatorType &, container_detail::false_type)
-   BOOST_CONTAINER_NOEXCEPT
-{}
-
-template<class AllocatorType>
-inline void move_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
-{  l = ::boost::move(r);   }
-
-//Rounds "orig_size" by excess to round_to bytes
-template<class SizeType>
-inline SizeType get_rounded_size(SizeType orig_size, SizeType round_to)
-{
-   return ((orig_size-1)/round_to+1)*round_to;
-}
-
-template <std::size_t OrigSize, std::size_t RoundTo>
-struct ct_rounded_size
-{
-   enum { value = ((OrigSize-1)/RoundTo+1)*RoundTo };
-};
-
-template<class I>
-struct are_elements_contiguous
-{
-   static const bool value = false;
-};
-
-/////////////////////////
-//    raw pointers
-/////////////////////////
-
-template<class T>
-struct are_elements_contiguous<T*>
-{
-   static const bool value = true;
-};
-
-/////////////////////////
-//    predeclarations
-/////////////////////////
-
-#ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
-
-template<class Pointer>
-class vector_iterator;
-
-template<class Pointer>
-class vector_const_iterator;
-
-#endif   //BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
-
-}  //namespace container_detail {
-}  //namespace container {
-
-namespace interprocess {
-
-template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
-class offset_ptr;
-
-}  //namespace interprocess {
-
-namespace container {
-
-namespace container_detail {
-
-/////////////////////////
-//vector_[const_]iterator
-/////////////////////////
-
-#ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
-
-template<class Pointer>
-struct are_elements_contiguous<boost::container::container_detail::vector_iterator<Pointer> >
-{
-   static const bool value = true;
-};
-
-template<class Pointer>
-struct are_elements_contiguous<boost::container::container_detail::vector_const_iterator<Pointer> >
-{
-   static const bool value = true;
-};
-
-#endif   //BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
-
-/////////////////////////
-//    offset_ptr
-/////////////////////////
-
-template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
-struct are_elements_contiguous< ::boost::interprocess::offset_ptr<PointedType, DifferenceType, OffsetType, OffsetAlignment> >
-{
-   static const bool value = true;
-};
-
-template <typename I, typename O>
-struct are_contiguous_and_same
-{
-   static const bool is_same_io =
-      is_same< typename remove_const< typename ::std::iterator_traits<I>::value_type >::type
-             , typename ::std::iterator_traits<O>::value_type
-             >::value;
-   static const bool value = is_same_io &&
-      are_elements_contiguous<I>::value &&
-      are_elements_contiguous<O>::value;
-};
-
-template <typename I, typename O>
-struct is_memcpy_copy_assignable
-{
-   static const bool value = are_contiguous_and_same<I, O>::value &&
-      boost::has_trivial_assign< typename ::std::iterator_traits<I>::value_type >::value;
-};
-
-template <typename I, typename O>
-struct is_memcpy_copy_constructible
-{
-   static const bool value = are_contiguous_and_same<I, O>::value &&
-      boost::has_trivial_copy< typename ::std::iterator_traits<I>::value_type >::value;
-};
-
-template <typename I, typename O, typename R>
-struct enable_if_memcpy_copy_constructible
-   : public enable_if_c<container_detail::is_memcpy_copy_constructible<I, O>::value, R>
-{};
-
-template <typename I, typename O, typename R>
-struct disable_if_memcpy_copy_constructible
-   : public enable_if_c<!container_detail::is_memcpy_copy_constructible<I, O>::value, R>
-{};
-
-template <typename I, typename O, typename R>
-struct enable_if_memcpy_copy_assignable
-   : public enable_if_c<container_detail::is_memcpy_copy_assignable<I, O>::value, R>
-{};
-
-template <typename I, typename O, typename R>
-struct disable_if_memcpy_copy_assignable
-   : public enable_if_c<!container_detail::is_memcpy_copy_assignable<I, O>::value, R>
-{};
-
-template
-   <typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline F memcpy(I f, I l, F r) BOOST_CONTAINER_NOEXCEPT
-{
-   typedef typename std::iterator_traits<I>::value_type value_type;
-   typename std::iterator_traits<I>::difference_type n = std::distance(f, l);
-   ::memcpy(container_detail::addressof(*r), container_detail::addressof(*f), sizeof(value_type)*n);
-   std::advance(r, n);
-   return r;
-}
-
-template
-   <typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-F memcpy_n(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{
-   typedef typename std::iterator_traits<I>::value_type value_type;
-   ::memcpy(container_detail::addressof(*r), container_detail::addressof(*f), sizeof(value_type)*n);
-   std::advance(r, n);
-   return r;
-}
-
-template
-   <typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-I memcpy_n_source(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{
-   typedef typename std::iterator_traits<I>::value_type value_type;
-   ::memcpy(container_detail::addressof(*r), container_detail::addressof(*f), sizeof(value_type)*n);
-   std::advance(f, n);
-   return f;
-}
-
-template
-   <typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-I memcpy_n_source_dest(I f, typename std::iterator_traits<I>::difference_type n, F &r) BOOST_CONTAINER_NOEXCEPT
-{
-   typedef typename std::iterator_traits<I>::value_type value_type;
-   ::memcpy(container_detail::addressof(*r), container_detail::addressof(*f), sizeof(value_type)*n);
-   std::advance(f, n);
-   std::advance(r, n);
-   return f;
-}
-
-
-}  //namespace container_detail {
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_move_alloc
-//
-//////////////////////////////////////////////////////////////////////////////
-
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; f != l; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, boost::move(*f));
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_move_alloc(A &a, I f, I l, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (f != l) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f));
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_move_alloc(A &, I f, I l, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy(f, l, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_move_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, boost::move(*f));
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_move_alloc_n(A &a, I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f));
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_move_alloc_n(A &, I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_move_alloc_n_source
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, boost::move(*f));
-//!   \endcode
-//!
-//! <b>Returns</b>: f (after incremented)
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, I>::type
-   uninitialized_move_alloc_n_source(A &a, I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f));
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return f;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, I>::type
-   uninitialized_move_alloc_n_source(A &, I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_copy_alloc
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; f != l; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, *f);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_copy_alloc(A &a, I f, I l, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (f != l) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), *f);
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_copy_alloc(A &, I f, I l, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy(f, l, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_copy_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, *f);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_copy_alloc_n(A &a, I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), *f);
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, F>::type
-   uninitialized_copy_alloc_n(A &, I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_copy_alloc_n_source
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, *f);
-//!   \endcode
-//!
-//! <b>Returns</b>: f (after incremented)
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_constructible<I, F, I>::type
-   uninitialized_copy_alloc_n_source(A &a, I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), *f);
-         ++f; ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return f;
-}
-
-template
-   <typename A,
-    typename I, // I models InputIterator
-    typename F> // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_constructible<I, F, I>::type
-   uninitialized_copy_alloc_n_source(A &, I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_value_init_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename F> // F models ForwardIterator
-inline F uninitialized_value_init_alloc_n(A &a, typename allocator_traits<A>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r));
-         ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_default_init_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename F> // F models ForwardIterator
-inline F uninitialized_default_init_alloc_n(A &a, typename allocator_traits<A>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), default_init);
-         ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_fill_alloc
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; f != l; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, *f);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename F, // F models ForwardIterator
-    typename T>
-inline void uninitialized_fill_alloc(A &a, F f, F l, const T &t)
-{
-   F back = f;
-   BOOST_TRY{
-      while (f != l) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*f), t);
-         ++f;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != l; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               uninitialized_fill_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//! <b>Effects</b>:
-//!   \code
-//!   for (; n--; ++r, ++f)
-//!      allocator_traits::construct(a, &*r, v);
-//!   \endcode
-//!
-//! <b>Returns</b>: r
-template
-   <typename A,
-    typename T,
-    typename F> // F models ForwardIterator
-inline F uninitialized_fill_alloc_n(A &a, const T &v, typename allocator_traits<A>::difference_type n, F r)
-{
-   F back = r;
-   BOOST_TRY{
-      while (n--) {
-         allocator_traits<A>::construct(a, container_detail::to_raw_pointer(&*r), v);
-         ++r;
-      }
-   }
-   BOOST_CATCH(...){
-	   for (; back != r; ++back){
-         allocator_traits<A>::destroy(a, container_detail::to_raw_pointer(&*back));
-      }
-	   BOOST_RETHROW;
-   }
-   BOOST_CATCH_END
-   return r;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               copy
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>    // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, F>::type
-   copy(I f, I l, F r)
-{
-   while (f != l) {
-      *r = *f;
-      ++f; ++r;
-   }
-   return r;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>    // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, F>::type
-   copy(I f, I l, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy(f, l, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               copy_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, F>::type
-   copy_n(I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   while (n--) {
-      *r = *f;
-      ++f; ++r;
-   }
-   return r;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, F>::type
-   copy_n(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                            copy_n_source
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, I>::type
-   copy_n_source(I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   while (n--) {
-      *r = *f;
-      ++f; ++r;
-   }
-   return f;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, I>::type
-   copy_n_source(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                            copy_n_source_dest
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, I>::type
-   copy_n_source_dest(I f, typename std::iterator_traits<I>::difference_type n, F &r)
-{
-   while (n--) {
-      *r = *f;
-      ++f; ++r;
-   }
-   return f;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, I>::type
-   copy_n_source_dest(I f, typename std::iterator_traits<I>::difference_type n, F &r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source_dest(f, n, r);  }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         move
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, F>::type
-   move(I f, I l, F r)
-{
-   while (f != l) {
-      *r = ::boost::move(*f);
-      ++f; ++r;
-   }
-   return r;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, F>::type
-   move(I f, I l, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy(f, l, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         move_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, F>::type
-   move_n(I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   while (n--) {
-      *r = ::boost::move(*f);
-      ++f; ++r;
-   }
-   return r;
-}
-
-template
-<typename I,   // I models InputIterator
-typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, F>::type
-   move_n(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         move_n_source
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I    // I models InputIterator
-,typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, I>::type
-   move_n_source(I f, typename std::iterator_traits<I>::difference_type n, F r)
-{
-   while (n--) {
-      *r = ::boost::move(*f);
-      ++f; ++r;
-   }
-   return f;
-}
-
-template
-<typename I    // I models InputIterator
-,typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, I>::type
-   move_n_source(I f, typename std::iterator_traits<I>::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         move_n_source_dest
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-<typename I    // I models InputIterator
-,typename F>   // F models ForwardIterator
-inline typename container_detail::disable_if_memcpy_copy_assignable<I, F, I>::type
-   move_n_source_dest(I f, typename std::iterator_traits<I>::difference_type n, F &r)
-{
-   while (n--) {
-      *r = ::boost::move(*f);
-      ++f; ++r;
-   }
-   return f;
-}
-
-template
-<typename I    // I models InputIterator
-,typename F>   // F models ForwardIterator
-inline typename container_detail::enable_if_memcpy_copy_assignable<I, F, I>::type
-   move_n_source_dest(I f, typename std::iterator_traits<I>::difference_type n, F &r) BOOST_CONTAINER_NOEXCEPT
-{  return container_detail::memcpy_n_source_dest(f, n, r); }
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                               destroy_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-   <typename A
-   ,typename I>  // I models InputIterator
-inline void destroy_alloc_n(A &a, I f, typename std::iterator_traits<I>::difference_type n
-   ,typename boost::container::container_detail::enable_if_c
-      < !boost::has_trivial_destructor<typename std::iterator_traits<I>::value_type>::value >::type* = 0)
-{
-   while(n--){
-      allocator_traits<A>::destroy(a, container_detail::addressof(*f++));
-   }
-}
-
-template
-   <typename A
-   ,typename I>  // I models InputIterator
-inline void destroy_alloc_n(A &, I, typename std::iterator_traits<I>::difference_type
-   ,typename boost::container::container_detail::enable_if_c
-      < boost::has_trivial_destructor<typename std::iterator_traits<I>::value_type>::value >::type* = 0)
-{}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         deep_swap_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-   <std::size_t MaxTmpBytes
-   ,typename A
-   ,typename F // F models ForwardIterator
-   ,typename G // G models ForwardIterator
-   >
-inline typename container_detail::disable_if_memcpy_copy_assignable<F, G, void>::type
-   deep_swap_alloc_n( A &a, F short_range_f, typename allocator_traits<A>::size_type n_i
-                    , G large_range_f, typename allocator_traits<A>::size_type n_j)
-{
-   typename allocator_traits<A>::size_type n = 0;
-   for (; n != n_i ; ++short_range_f, ++large_range_f, ++n){
-      boost::container::swap_dispatch(*short_range_f, *large_range_f);
-   }
-   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
-   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
-}
-
-static const std::size_t DeepSwapAllocNMaxStorage = std::size_t(1) << std::size_t(11); //2K bytes
-
-template
-   <std::size_t MaxTmpBytes
-   ,typename A
-   ,typename F // F models ForwardIterator
-   ,typename G // G models ForwardIterator
-   >
-inline typename container_detail::enable_if_c
-   < container_detail::is_memcpy_copy_assignable<F, G>::value && (MaxTmpBytes <= DeepSwapAllocNMaxStorage) && false
-   , void>::type
-   deep_swap_alloc_n( A &a, F short_range_f, typename allocator_traits<A>::size_type n_i
-                    , G large_range_f, typename allocator_traits<A>::size_type n_j)
-{
-   typedef typename allocator_traits<A>::value_type value_type;
-   typedef typename boost::aligned_storage
-      <MaxTmpBytes, container_detail::alignment_of<value_type>::value>::type storage_type;
-   storage_type storage;
-
-   const std::size_t n_i_bytes = sizeof(value_type)*n_i;
-   unsigned char *const large_ptr = static_cast<unsigned char*>(static_cast<void*>(container_detail::addressof(*large_range_f)));
-   unsigned char *const short_ptr = static_cast<unsigned char*>(static_cast<void*>(container_detail::addressof(*short_range_f)));
-   unsigned char *const stora_ptr = static_cast<unsigned char*>(static_cast<void*>(container_detail::addressof(storage)));
-   ::memcpy(stora_ptr, large_ptr, n_i_bytes);
-   ::memcpy(large_ptr, short_ptr, n_i_bytes);
-   ::memcpy(short_ptr, stora_ptr, n_i_bytes);
-   std::advance(large_range_f, n_i);
-   std::advance(short_range_f, n_i);
-   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
-   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
-}
-
-template
-   <std::size_t MaxTmpBytes
-   ,typename A
-   ,typename F // F models ForwardIterator
-   ,typename G // G models ForwardIterator
-   >
-inline typename container_detail::enable_if_c
-   < container_detail::is_memcpy_copy_assignable<F, G>::value && true//(MaxTmpBytes > DeepSwapAllocNMaxStorage)
-   , void>::type
-   deep_swap_alloc_n( A &a, F short_range_f, typename allocator_traits<A>::size_type n_i
-                    , G large_range_f, typename allocator_traits<A>::size_type n_j)
-{
-   typedef typename allocator_traits<A>::value_type value_type;
-   typedef typename boost::aligned_storage
-      <DeepSwapAllocNMaxStorage, container_detail::alignment_of<value_type>::value>::type storage_type;
-   storage_type storage;
-   const std::size_t sizeof_storage = sizeof(storage);
-
-   std::size_t n_i_bytes = sizeof(value_type)*n_i;
-   char *large_ptr = static_cast<char*>(static_cast<void*>(container_detail::addressof(*large_range_f)));
-   char *short_ptr = static_cast<char*>(static_cast<void*>(container_detail::addressof(*short_range_f)));
-   char *stora_ptr = static_cast<char*>(static_cast<void*>(container_detail::addressof(storage)));
-
-   std::size_t szt_times = n_i_bytes/sizeof_storage;
-   const std::size_t szt_rem = n_i_bytes%sizeof_storage;
-
-   //Loop unrolling using Duff's device, as it seems it helps on some architectures
-   const std::size_t Unroll = 4;
-   std::size_t n = (szt_times + (Unroll-1))/Unroll;
-   const std::size_t branch_number = ((!szt_times)*Unroll) +  (szt_times % Unroll);
-   switch(branch_number){
-      case 4:
-         break;
-      case 0: do{
-         ::memcpy(stora_ptr, large_ptr, sizeof_storage);
-         ::memcpy(large_ptr, short_ptr, sizeof_storage);
-         ::memcpy(short_ptr, stora_ptr, sizeof_storage);
-         large_ptr += sizeof_storage;
-         short_ptr += sizeof_storage;
-         BOOST_CONTAINER_FALLTHOUGH
-      case 3:
-         ::memcpy(stora_ptr, large_ptr, sizeof_storage);
-         ::memcpy(large_ptr, short_ptr, sizeof_storage);
-         ::memcpy(short_ptr, stora_ptr, sizeof_storage);
-         large_ptr += sizeof_storage;
-         short_ptr += sizeof_storage;
-         BOOST_CONTAINER_FALLTHOUGH
-      case 2:
-         ::memcpy(stora_ptr, large_ptr, sizeof_storage);
-         ::memcpy(large_ptr, short_ptr, sizeof_storage);
-         ::memcpy(short_ptr, stora_ptr, sizeof_storage);
-         large_ptr += sizeof_storage;
-         short_ptr += sizeof_storage;
-         BOOST_CONTAINER_FALLTHOUGH
-      case 1:
-         ::memcpy(stora_ptr, large_ptr, sizeof_storage);
-         ::memcpy(large_ptr, short_ptr, sizeof_storage);
-         ::memcpy(short_ptr, stora_ptr, sizeof_storage);
-         large_ptr += sizeof_storage;
-         short_ptr += sizeof_storage;
-         } while(--n);
-   }
-   ::memcpy(stora_ptr, large_ptr, szt_rem);
-   ::memcpy(large_ptr, short_ptr, szt_rem);
-   ::memcpy(short_ptr, stora_ptr, szt_rem);
-   std::advance(large_range_f, n_i);
-   std::advance(short_range_f, n_i);
-   boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f);  // may throw
-   boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         copy_assign_range_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-   <typename A
-   ,typename I // F models InputIterator
-   ,typename O // G models OutputIterator
-   >  
-void copy_assign_range_alloc_n( A &a, I inp_start, typename allocator_traits<A>::size_type n_i
-                              , O out_start, typename allocator_traits<A>::size_type n_o )
-{
-   if (n_o < n_i){
-      inp_start = boost::container::copy_n_source_dest(inp_start, n_o, out_start);     // may throw
-      boost::container::uninitialized_copy_alloc_n(a, inp_start, n_i - n_o, out_start);// may throw
-   }
-   else{
-      out_start = boost::container::copy_n(inp_start, n_i, out_start);  // may throw
-      boost::container::destroy_alloc_n(a, out_start, n_o - n_i);
-   }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//                         move_assign_range_alloc_n
-//
-//////////////////////////////////////////////////////////////////////////////
-
-template
-   <typename A
-   ,typename I // F models InputIterator
-   ,typename O // G models OutputIterator
-   >  
-void move_assign_range_alloc_n( A &a, I inp_start, typename allocator_traits<A>::size_type n_i
-                              , O out_start, typename allocator_traits<A>::size_type n_o )
-{
-   if (n_o < n_i){
-      inp_start = boost::container::move_n_source_dest(inp_start, n_o, out_start);  // may throw
-      boost::container::uninitialized_move_alloc_n(a, inp_start, n_i - n_o, out_start);  // may throw
-   }
-   else{
-      out_start = boost::container::move_n(inp_start, n_i, out_start);  // may throw
-      boost::container::destroy_alloc_n(a, out_start, n_o - n_i);
-   }
-}
-
-}  //namespace container {
-}  //namespace boost {
-
-#include <boost/container/detail/config_end.hpp>
-
-#endif   //#ifndef BOOST_CONTAINER_DETAIL_UTILITIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/new_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,175 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_NEW_ALLOCATOR_HPP
+#define BOOST_CONTAINER_NEW_ALLOCATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/throw_exception.hpp>
+#include <cstddef>
+
+//!\file
+
+namespace boost {
+namespace container {
+
+template<bool Value>
+struct new_allocator_bool
+{  static const bool value = Value;  };
+
+template<class T>
+class new_allocator;
+
+//! Specialization of new_allocator for void types
+template<>
+class new_allocator<void>
+{
+   public:
+   typedef void                                 value_type;
+   typedef void *                               pointer;
+   typedef const void*                          const_pointer;
+   //!A integral constant of type bool with value true
+   typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment;
+   //!A integral constant of type bool with value true
+   typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal;
+   // reference-to-void members are impossible
+
+   //!Obtains an new_allocator that allocates
+   //!objects of type T2
+   template<class T2>
+   struct rebind
+   {
+      typedef new_allocator< T2> other;
+   };
+
+   //!Default constructor
+   //!Never throws
+   new_allocator() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from other new_allocator.
+   //!Never throws
+   new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from related new_allocator.
+   //!Never throws
+   template<class T2>
+   new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Swaps two allocators, does nothing
+   //!because this new_allocator is stateless
+   friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!An new_allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return true;   }
+
+   //!An new_allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return false;   }
+};
+
+
+//! This class is a reduced STL-compatible allocator that allocates memory using operator new
+template<class T>
+class new_allocator
+{
+   public:
+   typedef T                                    value_type;
+   typedef T *                                  pointer;
+   typedef const T *                            const_pointer;
+   typedef T &                                  reference;
+   typedef const T &                            const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+   //!A integral constant of type bool with value true
+   typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment;
+   //!A integral constant of type bool with value true
+   typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal;
+
+   //!Obtains an new_allocator that allocates
+   //!objects of type T2
+   template<class T2>
+   struct rebind
+   {
+      typedef new_allocator<T2> other;
+   };
+
+   //!Default constructor
+   //!Never throws
+   new_allocator() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from other new_allocator.
+   //!Never throws
+   new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Constructor from related new_allocator.
+   //!Never throws
+   template<class T2>
+   new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Allocates memory for an array of count elements.
+   //!Throws std::bad_alloc if there is no enough memory
+   pointer allocate(size_type count)
+   {
+	   if(BOOST_UNLIKELY(count > this->max_size()))
+	      throw_bad_alloc();
+	   return static_cast<T*>(::operator new(count*sizeof(T)));
+   }
+
+   //!Deallocates previously allocated memory.
+   //!Never throws
+   void deallocate(pointer ptr, size_type) BOOST_NOEXCEPT_OR_NOTHROW
+     { ::operator delete((void*)ptr); }
+
+   //!Returns the maximum number of elements that could be allocated.
+   //!Never throws
+   size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return size_type(-1)/sizeof(T);   }
+
+   //!Swaps two allocators, does nothing
+   //!because this new_allocator is stateless
+   friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!An new_allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return true;   }
+
+   //!An new_allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return false;   }
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINER_ALLOCATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/node_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,344 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_POOLED_NODE_ALLOCATOR_HPP
+#define BOOST_CONTAINER_POOLED_NODE_ALLOCATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/throw_exception.hpp>
+#include <boost/container/detail/node_pool.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/singleton.hpp>
+
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <cstddef>
+
+namespace boost {
+namespace container {
+
+//!An STL node allocator that uses a modified DlMalloc as memory
+//!source.
+//!
+//!This node allocator shares a segregated storage between all instances
+//!of node_allocator with equal sizeof(T).
+//!
+//!NodesPerBlock is the number of nodes allocated at once when the allocator
+//!runs out of nodes
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+template
+   < class T
+   , std::size_t NodesPerBlock = NodeAlloc_nodes_per_block>
+#else
+template
+   < class T
+   , std::size_t NodesPerBlock
+   , std::size_t Version>
+#endif
+class node_allocator
+{
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   //! If Version is 1, the allocator is a STL conforming allocator. If Version is 2,
+   //! the allocator offers advanced expand in place and burst allocation capabilities.
+   public:
+   typedef unsigned int allocation_type;
+   typedef node_allocator<T, NodesPerBlock, Version>   self_t;
+
+   static const std::size_t nodes_per_block = NodesPerBlock;
+
+   BOOST_STATIC_ASSERT((Version <=2));
+   #endif
+
+   public:
+   //-------
+   typedef T                                    value_type;
+   typedef T *                                  pointer;
+   typedef const T *                            const_pointer;
+   typedef typename ::boost::container::
+      container_detail::unvoid<T>::type &       reference;
+   typedef const typename ::boost::container::
+      container_detail::unvoid<T>::type &       const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+
+   typedef boost::container::container_detail::
+      version_type<self_t, Version>             version;
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef boost::container::container_detail::
+      basic_multiallocation_chain<void*>              multiallocation_chain_void;
+   typedef boost::container::container_detail::
+      transform_multiallocation_chain
+         <multiallocation_chain_void, T>              multiallocation_chain;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   //!Obtains node_allocator from
+   //!node_allocator
+   template<class T2>
+   struct rebind
+   {
+      typedef node_allocator< T2, NodesPerBlock
+                            #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+                            , Version
+                            #endif
+                            > other;
+   };
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   private:
+   //!Not assignable from related node_allocator
+   template<class T2, std::size_t N2>
+   node_allocator& operator=
+      (const node_allocator<T2, N2>&);
+
+   //!Not assignable from other node_allocator
+   node_allocator& operator=(const node_allocator&);
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+
+   //!Default constructor
+   node_allocator() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Copy constructor from other node_allocator.
+   node_allocator(const node_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Copy constructor from related node_allocator.
+   template<class T2>
+   node_allocator
+      (const node_allocator<T2, NodesPerBlock
+            #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+            , Version
+            #endif
+            > &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Destructor
+   ~node_allocator() BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!Returns the number of elements that could be allocated.
+   //!Never throws
+   size_type max_size() const
+   {  return size_type(-1)/sizeof(T);   }
+
+   //!Allocate memory for an array of count elements.
+   //!Throws std::bad_alloc if there is no enough memory
+   pointer allocate(size_type count, const void * = 0)
+   {
+      if(BOOST_UNLIKELY(count > this->max_size()))
+         boost::container::throw_bad_alloc();
+
+      if(Version == 1 && count == 1){
+         typedef container_detail::shared_node_pool
+            <sizeof(T), NodesPerBlock> shared_pool_t;
+         typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+         return pointer(static_cast<T*>(singleton_t::instance().allocate_node()));
+      }
+      else{
+         void *ret = boost_cont_malloc(count*sizeof(T));
+         if(BOOST_UNLIKELY(!ret))
+            boost::container::throw_bad_alloc();
+         return static_cast<pointer>(ret);
+      }
+   }
+
+   //!Deallocate allocated memory.
+   //!Never throws
+   void deallocate(const pointer &ptr, size_type count) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      (void)count;
+      if(Version == 1 && count == 1){
+         typedef container_detail::shared_node_pool
+            <sizeof(T), NodesPerBlock> shared_pool_t;
+         typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+         singleton_t::instance().deallocate_node(ptr);
+      }
+      else{
+         boost_cont_free(ptr);
+      }
+   }
+
+   //!Deallocates all free blocks of the pool
+   static void deallocate_free_blocks() BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      typedef container_detail::shared_node_pool
+         <sizeof(T), NodesPerBlock> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      singleton_t::instance().deallocate_free_blocks();
+   }
+
+   pointer allocation_command
+      (allocation_type command, size_type limit_size, size_type &prefer_in_recvd_out_size, pointer &reuse)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      pointer ret = this->priv_allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse);
+      if(BOOST_UNLIKELY(!ret && !(command & BOOST_CONTAINER_NOTHROW_ALLOCATION)))
+         boost::container::throw_bad_alloc();
+      return ret;
+   }
+
+   //!Returns maximum the number of objects the previously allocated memory
+   //!pointed by p can hold.
+   size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      return boost_cont_size(p);
+   }
+
+   //!Allocates just one object. Memory allocated with this function
+   //!must be deallocated only with deallocate_one().
+   //!Throws bad_alloc if there is no enough memory
+   pointer allocate_one()
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      typedef container_detail::shared_node_pool
+         <sizeof(T), NodesPerBlock> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      return (pointer)singleton_t::instance().allocate_node();
+   }
+
+   //!Allocates many elements of size == 1.
+   //!Elements must be individually deallocated with deallocate_one()
+   void allocate_individual(std::size_t num_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      typedef container_detail::shared_node_pool
+         <sizeof(T), NodesPerBlock> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      typename shared_pool_t::multiallocation_chain ch;
+      singleton_t::instance().allocate_nodes(num_elements, ch);
+      chain.incorporate_after(chain.before_begin(), (T*)&*ch.begin(), (T*)&*ch.last(), ch.size());
+   }
+
+   //!Deallocates memory previously allocated with allocate_one().
+   //!You should never use deallocate_one to deallocate memory allocated
+   //!with other functions different from allocate_one(). Never throws
+   void deallocate_one(pointer p) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      typedef container_detail::shared_node_pool
+         <sizeof(T), NodesPerBlock> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      singleton_t::instance().deallocate_node(p);
+   }
+
+   void deallocate_individual(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      typedef container_detail::shared_node_pool
+         <sizeof(T), NodesPerBlock> shared_pool_t;
+      typedef container_detail::singleton_default<shared_pool_t> singleton_t;
+      typename shared_pool_t::multiallocation_chain ch(&*chain.begin(), &*chain.last(), chain.size());
+      singleton_t::instance().deallocate_nodes(ch);
+   }
+
+   //!Allocates many elements of size elem_size.
+   //!Elements must be individually deallocated with deallocate()
+   void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
+      if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after( chain.before_begin()
+                             , (T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             , (T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             , BOOST_CONTAINER_MEMCHAIN_SIZE(&ch));
+   }
+
+   //!Allocates n_elements elements, each one of size elem_sizes[i]
+   //!Elements must be individually deallocated with deallocate()
+   void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      boost_cont_memchain ch;
+      boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch);
+      if(BOOST_UNLIKELY(BOOST_CONTAINER_MEMCHAIN_EMPTY(&ch))){
+         boost::container::throw_bad_alloc();
+      }
+      chain.incorporate_after( chain.before_begin()
+                             , (T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             , (T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
+                             , BOOST_CONTAINER_MEMCHAIN_SIZE(&ch));
+   }
+
+   void deallocate_many(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      BOOST_STATIC_ASSERT(( Version > 1 ));
+      void *first = &*chain.begin();
+      void *last  = &*chain.last();
+      size_t num  = chain.size();
+      boost_cont_memchain ch;
+      BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, first, last, num);
+      boost_cont_multidealloc(&ch);
+   }
+
+   //!Swaps allocators. Does not throw. If each allocator is placed in a
+   //!different memory segment, the result is undefined.
+   friend void swap(self_t &, self_t &) BOOST_NOEXCEPT_OR_NOTHROW
+   {}
+
+   //!An allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator==(const node_allocator &, const node_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return true;   }
+
+   //!An allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const node_allocator &, const node_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return false;   }
+
+   private:
+   pointer priv_allocation_command
+      (allocation_type command,   std::size_t limit_size
+      ,size_type &prefer_in_recvd_out_size
+      ,pointer &reuse)
+   {
+      std::size_t const preferred_size = prefer_in_recvd_out_size;
+      boost_cont_command_ret_t ret = {0 , 0};
+      if((limit_size > this->max_size()) | (preferred_size > this->max_size())){
+         return pointer();
+      }
+      std::size_t l_size = limit_size*sizeof(T);
+      std::size_t p_size = preferred_size*sizeof(T);
+      std::size_t r_size;
+      {
+         void* reuse_ptr_void = reuse;
+         ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+         reuse = static_cast<T*>(reuse_ptr_void);
+      }
+      prefer_in_recvd_out_size = r_size/sizeof(T);
+      return (pointer)ret.first;
+   }
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINER_POOLED_NODE_ALLOCATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/options.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,80 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2013-2013
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_OPTIONS_HPP
+#define BOOST_CONTAINER_OPTIONS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/intrusive/pack_options.hpp>
+
+namespace boost {
+namespace container {
+
+#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+template<tree_type_enum TreeType, bool OptimizeSize>
+struct tree_opt
+{
+   static const boost::container::tree_type_enum tree_type = TreeType;
+   static const bool optimize_size = OptimizeSize;
+};
+
+#endif   //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+//!This option setter specifies the underlying tree type
+//!(red-black, AVL, Scapegoat or Splay) for ordered associative containers
+BOOST_INTRUSIVE_OPTION_CONSTANT(tree_type, tree_type_enum, TreeType, tree_type)
+
+//!This option setter specifies if node size is optimized
+//!storing rebalancing data masked into pointers for ordered associative containers
+BOOST_INTRUSIVE_OPTION_CONSTANT(optimize_size, bool, Enabled, optimize_size)
+
+//! Helper metafunction to combine options into a single type to be used
+//! by \c boost::container::set, \c boost::container::multiset
+//! \c boost::container::map and \c boost::container::multimap.
+//! Supported options are: \c boost::container::optimize_size and \c boost::container::tree_type
+#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
+template<class ...Options>
+#else
+template<class O1 = void, class O2 = void, class O3 = void, class O4 = void>
+#endif
+struct tree_assoc_options
+{
+   /// @cond
+   typedef typename ::boost::intrusive::pack_options
+      < tree_assoc_defaults,
+      #if !defined(BOOST_CONTAINER_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type packed_options;
+   typedef tree_opt<packed_options::tree_type, packed_options::optimize_size> implementation_defined;
+   /// @endcond
+   typedef implementation_defined type;
+};
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINER_OPTIONS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/container/small_vector.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,565 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_CONTAINER_SMALL_VECTOR_HPP
+#define BOOST_CONTAINER_CONTAINER_SMALL_VECTOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+// container
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/vector.hpp>
+#include <boost/container/allocator_traits.hpp>
+#include <boost/container/new_allocator.hpp> //new_allocator
+// container/detail
+#include <boost/container/detail/type_traits.hpp>
+#include <boost/container/detail/version_type.hpp>
+
+//move
+#include <boost/move/adl_move_swap.hpp>
+#include <boost/move/iterator.hpp>
+
+//move/detail
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#include <boost/move/detail/fwd_macros.hpp>
+#endif
+
+//std
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+#include <initializer_list>   //for std::initializer_list
+#endif
+
+namespace boost {
+namespace container {
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+template <class T, class Allocator = new_allocator<T> >
+class small_vector_base;
+
+#endif
+
+//! A non-standard allocator used to implement `small_vector`.
+//! Users should never use it directly. It is described here
+//! for documentation purposes.
+//! 
+//! This allocator inherits from a standard-conforming allocator
+//! and forwards member functiond to the standard allocator except
+//! when internal storage is being used as memory source.
+//!
+//! This allocator is a "partially_propagable" allocator and
+//! defines `is_partially_propagable` as true_type.
+//! 
+//! A partially propagable allocator means that not all storage
+//! allocatod by an instance of `small_vector_allocator` can be
+//! deallocated by another instance of this type, even is both
+//! instances compare equal or an instance is propagated to another
+//! one using the copy/move constructor or assignment. The storage that
+//! can never be propagated is identified by `storage_is_unpropagable(p)`.
+//!
+//! `boost::container::vector` supports partially propagable allocators
+//! fallbacking to deep copy/swap/move operations when internal storage
+//! is being used to store vector elements.
+//!
+//! `small_vector_allocator` assumes that will be instantiated as
+//! `boost::container::vector< T, small_vector_allocator<Allocator> >`
+//! and internal storage can be obtained downcasting that vector
+//! to `small_vector_base<T>`.
+template<class Allocator>
+class small_vector_allocator
+   : public Allocator
+{
+   typedef unsigned int allocation_type;
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   private:
+
+   BOOST_COPYABLE_AND_MOVABLE(small_vector_allocator)
+
+   const Allocator &as_base() const
+   {  return static_cast<const Allocator&>(*this);  }
+
+   Allocator &as_base() 
+   {  return static_cast<Allocator&>(*this);  }
+
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef allocator_traits<Allocator> allocator_traits_type;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   typedef typename allocator_traits<Allocator>::value_type          value_type;
+   typedef typename allocator_traits<Allocator>::pointer             pointer;
+   typedef typename allocator_traits<Allocator>::const_pointer       const_pointer;
+   typedef typename allocator_traits<Allocator>::reference           reference;
+   typedef typename allocator_traits<Allocator>::const_reference     const_reference;
+   typedef typename allocator_traits<Allocator>::size_type           size_type;
+   typedef typename allocator_traits<Allocator>::difference_type     difference_type;
+   typedef typename allocator_traits<Allocator>::void_pointer        void_pointer;
+   typedef typename allocator_traits<Allocator>::const_void_pointer  const_void_pointer;
+
+   typedef typename allocator_traits<Allocator>::propagate_on_container_copy_assignment   propagate_on_container_copy_assignment;
+   typedef typename allocator_traits<Allocator>::propagate_on_container_move_assignment   propagate_on_container_move_assignment;
+   typedef typename allocator_traits<Allocator>::propagate_on_container_swap              propagate_on_container_swap;
+   //! An integral constant with member `::value == false`
+   typedef BOOST_CONTAINER_IMPDEF(container_detail::bool_<false>)                         is_always_equal;
+   //! An integral constant with member `::value == true`
+   typedef BOOST_CONTAINER_IMPDEF(container_detail::bool_<true>)                          is_partially_propagable;
+
+   BOOST_CONTAINER_DOCIGN(typedef container_detail::version_type<small_vector_allocator BOOST_CONTAINER_I 1>  version;)
+
+   //!Obtains an small_vector_allocator that allocates
+   //!objects of type T2
+   template<class T2>
+   struct rebind
+   {
+      typedef typename allocator_traits<Allocator>::template rebind_alloc<T2>::type other;
+   };
+
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      //!Constructor from arbitrary arguments
+      template<class ...Args>
+      explicit small_vector_allocator(BOOST_FWD_REF(Args) ...args)
+         : Allocator(::boost::forward<Args>(args)...)
+      {}
+   #else
+      #define BOOST_CONTAINER_SMALL_VECTOR_ALLOCATOR_CTOR_CODE(N) \
+      BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
+      explicit small_vector_allocator(BOOST_MOVE_UREF##N)\
+         : Allocator(BOOST_MOVE_FWD##N)\
+      {}\
+      //
+      BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_SMALL_VECTOR_ALLOCATOR_CTOR_CODE)
+      #undef BOOST_CONTAINER_SMALL_VECTOR_ALLOCATOR_CTOR_CODE
+   #endif
+
+   //!Constructor from other small_vector_allocator.
+   //!Never throws
+   small_vector_allocator(const small_vector_allocator &other) BOOST_NOEXCEPT_OR_NOTHROW
+      : Allocator(other.as_base())
+   {}
+
+   //!Move constructor from small_vector_allocator.
+   //!Never throws
+   small_vector_allocator(BOOST_RV_REF(small_vector_allocator) other) BOOST_NOEXCEPT_OR_NOTHROW
+      : Allocator(::boost::move(other.as_base()))
+   {}
+
+   //!Constructor from related small_vector_allocator.
+   //!Never throws
+   template<class OtherAllocator>
+   small_vector_allocator(const small_vector_allocator<OtherAllocator> &other) BOOST_NOEXCEPT_OR_NOTHROW
+      : Allocator(other.as_base())
+   {}
+
+   //!Move constructor from related small_vector_allocator.
+   //!Never throws
+   template<class OtherAllocator>
+   small_vector_allocator(BOOST_RV_REF(small_vector_allocator<OtherAllocator>) other) BOOST_NOEXCEPT_OR_NOTHROW
+      : Allocator(::boost::move(other.as_base()))
+   {}
+
+   //!Assignment from other small_vector_allocator.
+   //!Never throws
+   small_vector_allocator & operator=(BOOST_COPY_ASSIGN_REF(small_vector_allocator) other) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return static_cast<small_vector_allocator&>(this->Allocator::operator=(other.as_base()));  }
+
+   //!Move constructor from other small_vector_allocator.
+   //!Never throws
+   small_vector_allocator & operator=(BOOST_RV_REF(small_vector_allocator) other) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return static_cast<small_vector_allocator&>(this->Allocator::operator=(::boost::move(other.as_base())));  }
+
+   //!Assignment from related small_vector_allocator.
+   //!Never throws
+   template<class OtherAllocator>
+   small_vector_allocator & operator=(BOOST_COPY_ASSIGN_REF(small_vector_allocator<OtherAllocator>) other) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return static_cast<small_vector_allocator&>(this->Allocator::operator=(other.as_base()));  }
+
+   //!Move assignment from related small_vector_allocator.
+   //!Never throws
+   template<class OtherAllocator>
+   small_vector_allocator & operator=(BOOST_RV_REF(small_vector_allocator<OtherAllocator>) other) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return static_cast<small_vector_allocator&>(this->Allocator::operator=(::boost::move(other.as_base())));  }
+
+   //!Allocates storage from the standard-conforming allocator
+   pointer allocate(size_type count, const_void_pointer hint = const_void_pointer())
+   {  return allocator_traits_type::allocate(this->as_base(), count, hint);  }
+
+   //!Deallocates previously allocated memory.
+   //!Never throws
+   void deallocate(pointer ptr, size_type n) BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      if(!this->is_internal_storage(ptr))
+         allocator_traits_type::deallocate(this->as_base(), ptr, n);
+   }
+
+   //!Returns the maximum number of elements that could be allocated.
+   //!Never throws
+   size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return allocator_traits_type::max_size(this->as_base());   }
+
+   small_vector_allocator select_on_container_copy_construction() const
+   {  return small_vector_allocator(allocator_traits_type::select_on_container_copy_construction(this->as_base())); }
+
+   bool storage_is_unpropagable(pointer p) const
+   {  return this->is_internal_storage(p) || allocator_traits_type::storage_is_unpropagable(this->as_base(), p);  }
+
+   //!Swaps two allocators, does nothing
+   //!because this small_vector_allocator is stateless
+   friend void swap(small_vector_allocator &l, small_vector_allocator &r) BOOST_NOEXCEPT_OR_NOTHROW
+   {  boost::adl_move_swap(l.as_base(), r.as_base());  }
+
+   //!An small_vector_allocator always compares to true, as memory allocated with one
+   //!instance can be deallocated by another instance (except for unpropagable storage)
+   friend bool operator==(const small_vector_allocator &l, const small_vector_allocator &r) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return allocator_traits_type::equal(l.as_base(), r.as_base());  }
+
+   //!An small_vector_allocator always compares to false, as memory allocated with one
+   //!instance can be deallocated by another instance
+   friend bool operator!=(const small_vector_allocator &l, const small_vector_allocator &r) BOOST_NOEXCEPT_OR_NOTHROW
+   {  return !(l == r);   }
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   /*
+   //!An advanced function that offers in-place expansion shrink to fit and new allocation
+   //!capabilities. Memory allocated with this function can only be deallocated with deallocate()
+   //!or deallocate_many().
+   //!This function is available only with Version == 2
+   pointer allocation_command(allocation_type command,
+                         size_type limit_size,
+                         size_type &prefer_in_recvd_out_size,
+                         pointer &reuse)
+   {  return allocator_traits_type::allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse);  }
+
+   //!Returns maximum the number of objects the previously allocated memory
+   //!pointed by p can hold.
+   //!Memory must not have been allocated with
+   //!allocate_one or allocate_individual.
+   //!This function is available only with Version == 2
+   size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
+   {  return allocator_traits_type::size(p);  }
+   */
+   private:
+   /*
+   //!Allocates just one object. Memory allocated with this function
+   //!must be deallocated only with deallocate_one().
+   //!Throws bad_alloc if there is no enough memory
+   //!This function is available only with Version == 2
+   using Allocator::allocate_one;
+   using Allocator::allocate_individual;
+   using Allocator::deallocate_one;
+   using Allocator::deallocate_individual;
+   using Allocator::allocate_many;
+   using Allocator::deallocate_many;*/
+
+   bool is_internal_storage(pointer p) const
+   {  return this->internal_storage() == p;  }
+
+   pointer internal_storage() const
+   {
+      typedef typename Allocator::value_type                                              value_type;
+      typedef container_detail::vector_alloc_holder< small_vector_allocator<Allocator> >  vector_alloc_holder_t;
+      typedef vector<value_type, small_vector_allocator<Allocator> >                      vector_base;
+      typedef small_vector_base<value_type, Allocator>                                    derived_type;
+      //
+      const vector_alloc_holder_t &v_holder = static_cast<const vector_alloc_holder_t &>(*this);
+      const vector_base &v_base = reinterpret_cast<const vector_base &>(v_holder);
+      const derived_type &d_base = static_cast<const derived_type &>(v_base);
+      return d_base.internal_storage();
+   }
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+};
+
+//! This class consists of common code from all small_vector<T, N> types that don't depend on the
+//! "N" template parameter. This class is non-copyable and non-destructible, so this class tipically
+//! used as reference argument to functions that read or write small vectors. Since `small_vector<T, N>`
+//! derives from `small_vector_base<T>`, the conversion to `small_vector_base` is implicit:
+//! <code>
+//!
+//! //Clients can pass any small_vector<Foo, N>.
+//! void read_any_small_vector_of_foo(const small_vector_base<Foo> &in_parameter);
+//! void modify_any_small_vector_of_foo(small_vector_base<Foo> &out_parameter);
+//! 
+//! void some_function()
+//! {
+//!    small_vector<Foo, 8> myvector;
+//!    read_any_small_vector_of_foo(myvector);   // Reads myvector
+//!    modify_any_small_vector_of_foo(myvector); // Modifies myvector
+//! }
+//! </code>
+//!
+//! All `boost::container:vector` member functions are inherited. See `vector` documentation for details.
+//!
+template <class T, class SecondaryAllocator>
+class small_vector_base
+   : public vector<T, small_vector_allocator<SecondaryAllocator> >
+{
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef typename allocator_traits<SecondaryAllocator>::pointer pointer;
+
+   BOOST_COPYABLE_AND_MOVABLE(small_vector_base)
+
+   friend class small_vector_allocator<SecondaryAllocator>;
+
+   pointer internal_storage() const BOOST_NOEXCEPT_OR_NOTHROW
+   {
+      return boost::intrusive::pointer_traits<pointer>::pointer_to
+         (*const_cast<T*>(static_cast<const T*>(static_cast<const void*>(&m_storage_start))));
+   }
+
+   typedef vector<T, small_vector_allocator<SecondaryAllocator> > base_type;
+         base_type &as_base()       { return static_cast<base_type&>(*this); }
+   const base_type &as_base() const { return static_cast<const base_type&>(*this); }
+
+   public:
+   typedef typename container_detail::aligned_storage
+      <sizeof(T), container_detail::alignment_of<T>::value>::type storage_type;
+   typedef small_vector_allocator<SecondaryAllocator>             allocator_type;
+
+   protected:
+   typedef typename base_type::initial_capacity_t initial_capacity_t;
+
+   explicit small_vector_base(initial_capacity_t, std::size_t initial_capacity)
+      : base_type(initial_capacity_t(), this->internal_storage(), initial_capacity)
+   {}
+
+   template<class AllocFwd>
+   explicit small_vector_base(initial_capacity_t, std::size_t capacity, BOOST_FWD_REF(AllocFwd) a)
+      : base_type(initial_capacity_t(), this->internal_storage(), capacity, ::boost::forward<AllocFwd>(a))
+   {}
+
+   ~small_vector_base(){}
+
+   using base_type::is_propagable_from;
+   using base_type::steal_resources;
+
+   private:
+   //The only member
+   storage_type m_storage_start;
+
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+   small_vector_base& operator=(BOOST_COPY_ASSIGN_REF(small_vector_base) other)
+   {  return static_cast<small_vector_base&>(this->base_type::operator=(static_cast<base_type const&>(other)));  }
+
+   small_vector_base& operator=(BOOST_RV_REF(small_vector_base) other)
+   {  return static_cast<small_vector_base&>(this->base_type::operator=(BOOST_MOVE_BASE(base_type, other))); }
+
+   void swap(small_vector_base &other)
+   {  return this->base_type::swap(other);  }
+};
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+/////////////////////////////////////////////////////
+//
+//          small_vector_storage_calculator
+//
+/////////////////////////////////////////////////////
+template<std::size_t Needed, std::size_t Hdr, std::size_t SSize, bool NeedsZero = (0u == Needed || Needed <= Hdr)>
+struct small_vector_storage_calculator_helper
+{
+   static const std::size_t value = (Needed - Hdr - 1u)/SSize + 1u;
+};
+
+template<std::size_t Needed, std::size_t Hdr, std::size_t SSize>
+struct small_vector_storage_calculator_helper<Needed, Hdr, SSize, true>
+{
+   static const std::size_t value = 0u;
+};
+
+template<class Storage, class Allocator, class T, std::size_t N>
+struct small_vector_storage_calculator
+{
+   typedef small_vector_base<T, Allocator> svh_type;
+   typedef vector<T, small_vector_allocator<Allocator> > svhb_type;
+   static const std::size_t s_align = container_detail::alignment_of<Storage>::value;
+   static const std::size_t s_size = sizeof(Storage);
+   static const std::size_t svh_sizeof = sizeof(svh_type);
+   static const std::size_t svhb_sizeof = sizeof(svhb_type);
+   static const std::size_t s_start = ((svhb_sizeof-1)/s_align+1)*s_align;
+   static const std::size_t header_bytes = svh_sizeof-s_start;
+   static const std::size_t needed_bytes = sizeof(T)*N;
+   static const std::size_t needed_extra_storages =
+      small_vector_storage_calculator_helper<needed_bytes, header_bytes, s_size>::value;
+};
+
+/////////////////////////////////////////////////////
+//
+//          small_vector_storage_definer
+//
+/////////////////////////////////////////////////////
+template<class Storage, std::size_t N>
+struct small_vector_storage
+{
+   Storage m_rest_of_storage[N];
+};
+
+template<class Storage>
+struct small_vector_storage<Storage, 0>
+{};
+
+template<class Allocator, std::size_t N>
+struct small_vector_storage_definer
+{
+   typedef typename Allocator::value_type                                  value_type;
+   typedef typename small_vector_base<value_type, Allocator>::storage_type storage_type;
+   static const std::size_t needed_extra_storages =
+      small_vector_storage_calculator<storage_type, Allocator, value_type, N>::needed_extra_storages;
+   typedef small_vector_storage<storage_type, needed_extra_storages> type;
+};
+
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+//! small_vector a vector-like container optimized for the case when it contains few elements.
+//! It contains some preallocated elements in-place, which allows it to avoid the use of dynamic storage allocation
+//! when the actual number of elements is below that preallocated threshold.
+//!
+//! `small_vector<T, N, Allocator>` is convertible to `small_vector_base<T, Allocator>` that is independent
+//! from the preallocated element capacity, so client code does not need to be templated on that N argument.
+//!
+//! All `boost::container::vector` member functions are inherited. See `vector` documentation for details.
+//!
+//! \tparam T The type of object that is stored in the small_vector
+//! \tparam N The number of preallocated elements stored inside small_vector. It shall be less than Allocator::max_size();
+//! \tparam Allocator The allocator used for memory management when the number of elements exceeds N.
+template <class T, std::size_t N, class Allocator BOOST_CONTAINER_DOCONLY(= new_allocator<T>) >
+class small_vector : public small_vector_base<T, Allocator>
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   , private small_vector_storage_definer<Allocator, N>::type
+   #endif
+{
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef small_vector_base<T, Allocator> base_type;
+   typedef typename small_vector_storage_definer<Allocator, N>::type remaining_storage_holder;
+
+   BOOST_COPYABLE_AND_MOVABLE(small_vector)
+
+   typedef typename base_type::initial_capacity_t initial_capacity_t;
+   typedef allocator_traits<typename base_type::allocator_type> allocator_traits_type;
+
+   public:
+   typedef small_vector_storage_calculator< typename small_vector_base<T, Allocator>
+      ::storage_type, Allocator, T, N> storage_test;
+
+   static const std::size_t needed_extra_storages =  storage_test::needed_extra_storages;
+   static const std::size_t needed_bytes =  storage_test::needed_bytes;
+   static const std::size_t header_bytes =  storage_test::header_bytes;
+   static const std::size_t s_start =  storage_test::s_start;
+
+   typedef typename base_type::allocator_type   allocator_type;
+   typedef typename base_type::size_type        size_type;
+   typedef typename base_type::value_type       value_type;
+
+   static std::size_t internal_capacity()
+   {  return (sizeof(small_vector) - storage_test::s_start)/sizeof(T);  }
+
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   public:
+   small_vector()
+      : base_type(initial_capacity_t(), internal_capacity())
+   {}
+
+   explicit small_vector(size_type n)
+      : base_type(initial_capacity_t(), internal_capacity())
+   {  this->resize(n); }
+
+   explicit small_vector(const allocator_type &a)
+      : base_type(initial_capacity_t(), internal_capacity(), a)
+   {}
+
+   small_vector(size_type n, const allocator_type &a)
+      : base_type(initial_capacity_t(), internal_capacity(), a)
+   {  this->resize(n); }
+
+   small_vector(const small_vector &other)
+      : base_type( initial_capacity_t(), internal_capacity()
+                 , allocator_traits_type::select_on_container_copy_construction(other.get_stored_allocator()))
+   {  this->assign(other.cbegin(), other.cend());  }
+
+   small_vector(const small_vector &other, const allocator_type &a)
+      : base_type(initial_capacity_t(), internal_capacity(), a)
+   {  this->assign(other.cbegin(), other.cend());  }
+
+   small_vector(BOOST_RV_REF(small_vector) other)
+      : base_type(initial_capacity_t(), internal_capacity(), ::boost::move(other.get_stored_allocator()))
+   {  this->move_construct_impl(other, other.get_stored_allocator());   }
+
+   small_vector(BOOST_RV_REF(small_vector) other, const allocator_type &a)
+      : base_type(initial_capacity_t(), internal_capacity(), a)
+   {  this->move_construct_impl(other, a);   }
+
+   #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+   small_vector(std::initializer_list<value_type> il, const allocator_type& a = allocator_type())
+      : base_type(initial_capacity_t(), internal_capacity(), a)
+   {
+      this->assign(il.begin(), il.end());
+   }
+   #endif
+
+   small_vector& operator=(BOOST_COPY_ASSIGN_REF(small_vector) other)
+   {  return static_cast<small_vector&>(this->base_type::operator=(static_cast<base_type const&>(other)));  }
+
+   small_vector& operator=(BOOST_RV_REF(small_vector) other)
+   {  return static_cast<small_vector&>(this->base_type::operator=(BOOST_MOVE_BASE(base_type, other))); }
+
+   void swap(small_vector &other)
+   {  return this->base_type::swap(other);  }
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   private:
+   void move_construct_impl(small_vector &x, const allocator_type &a)
+   {
+      if(base_type::is_propagable_from(x.get_stored_allocator(), x.data(), a, true)){
+         this->steal_resources(x);
+      }
+      else{
+         this->assign( boost::make_move_iterator(container_detail::iterator_to_raw_pointer(x.begin()))
+                     , boost::make_move_iterator(container_detail::iterator_to_raw_pointer(x.end  ()))
+                     );
+      }
+   }
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+};
+
+}}
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+/*
+namespace boost {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class Allocator>
+struct has_trivial_destructor_after_move<boost::container::vector<T, Allocator> >
+{
+   typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;
+   static const bool value = ::boost::has_trivial_destructor_after_move<Allocator>::value &&
+                             ::boost::has_trivial_destructor_after_move<pointer>::value;
+};
+
+}
+*/
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //   #ifndef  BOOST_CONTAINER_CONTAINER_SMALL_VECTOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/detail/fcontext_arm_mac.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_MAC_H
+#define BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_MAC_H
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+#include <boost/context/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+extern "C" {
+
+#define BOOST_CONTEXT_CALLDECL
+
+struct stack_t
+{
+    void    *   sp;
+    std::size_t size;
+
+    stack_t() :
+        sp( 0), size( 0)
+    {}
+};
+
+struct fp_t
+{
+    boost::uint32_t     fc_freg[16];
+
+    fp_t() :
+        fc_freg()
+    {}
+};
+
+struct fcontext_t
+{
+    boost::uint32_t     fc_greg[11];
+    stack_t             fc_stack;
+    fp_t                fc_fp;
+    void            *   fc_unwind_sjlj;
+
+    fcontext_t() :
+        fc_greg(),
+        fc_stack(),
+        fc_fp(),
+        fc_unwind_sjlj( 0)
+    {}
+};
+
+}
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_MAC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/detail/fcontext_arm_win.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,71 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_WIN_H
+#define BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_WIN_H
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+#include <boost/context/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+extern "C" {
+
+#define BOOST_CONTEXT_CALLDECL
+
+struct stack_t
+{
+    void    *   sp;
+    std::size_t size;
+    void    *   limit;
+
+    stack_t() :
+        sp( 0), size( 0), limit( 0)
+    {}
+};
+
+struct fp_t
+{
+    boost::uint32_t     fc_freg[16];
+
+    fp_t() :
+        fc_freg()
+    {}
+};
+
+struct fcontext_t
+{
+    boost::uint32_t     fc_greg[11];
+    stack_t             fc_stack;
+    fp_t                fc_fp;
+    boost::uint32_t     fc_dealloc;
+
+    fcontext_t() :
+        fc_greg(),
+        fc_stack(),
+        fc_fp(),
+        fc_dealloc( 0)
+    {}
+};
+
+}
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_DETAIL_FCONTEXT_ARM_WIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/execution_context.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,307 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_EXECUTION_CONTEXT_H
+#define BOOST_CONTEXT_EXECUTION_CONTEXT_H
+
+#include <boost/context/detail/config.hpp>
+
+#if ! defined(BOOST_CONTEXT_NO_EXECUTION_CONTEXT)
+
+# include <cstddef>
+# include <cstdint>
+# include <cstdlib>
+# include <exception>
+# include <memory>
+# include <tuple>
+# include <utility>
+
+# include <boost/assert.hpp>
+# include <boost/config.hpp>
+# include <boost/context/fcontext.hpp>
+# include <boost/intrusive_ptr.hpp>
+
+# include <boost/context/stack_context.hpp>
+# include <boost/context/segmented_stack.hpp>
+
+# ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+# endif
+
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+extern "C" {
+
+void __splitstack_getcontext( void * [BOOST_CONTEXT_SEGMENTS]);
+
+void __splitstack_setcontext( void * [BOOST_CONTEXT_SEGMENTS]);
+
+}
+# endif
+
+namespace boost {
+namespace context {
+
+struct preallocated {
+    void        *   sp;
+    std::size_t     size;
+    stack_context   sctx;
+
+    preallocated( void * sp_, std::size_t size_, stack_context sctx_) noexcept :
+        sp( sp_), size( size_), sctx( sctx_) {
+    }
+};
+
+class BOOST_CONTEXT_DECL execution_context {
+private:
+    struct fcontext {
+        std::size_t     use_count;
+        fcontext_t      fctx;
+        stack_context   sctx;
+
+        // main-context
+        fcontext() noexcept :
+            use_count( 1),
+            fctx( nullptr),
+            sctx() {
+        } 
+
+        // worker-context
+        fcontext( fcontext_t fctx_, stack_context const& sctx_) noexcept :
+            use_count( 0),
+            fctx( fctx_),
+            sctx( sctx_) {
+        } 
+
+        virtual ~fcontext() noexcept {
+        }
+
+        virtual void deallocate() {
+        }
+
+        virtual void run() noexcept {
+        }
+
+        friend void intrusive_ptr_add_ref( fcontext * ctx) {
+            ++ctx->use_count;
+        }
+
+        friend void intrusive_ptr_release( fcontext * ctx) {
+            BOOST_ASSERT( nullptr != ctx);
+
+            if ( 0 == --ctx->use_count) {
+                ctx->~fcontext();
+            }
+        }
+    };
+
+    template< typename Fn, typename StackAlloc >
+    class worker_fcontext : public fcontext {
+    private:
+        StackAlloc      salloc_;
+        Fn              fn_;
+
+        static void destroy( worker_fcontext * p) {
+            StackAlloc salloc( p->salloc_);
+            stack_context sctx( p->sctx);
+            p->~worker_fcontext();
+            salloc.deallocate( sctx);
+        }
+
+    public:
+        explicit worker_fcontext( stack_context sctx, StackAlloc const& salloc, fcontext_t fctx, Fn && fn) noexcept :
+            fcontext( fctx, sctx),
+            salloc_( salloc),
+            fn_( std::forward< Fn >( fn) ) {
+        }
+
+        void deallocate() override final {
+            destroy( this);
+        }
+
+        void run() noexcept override final {
+            fn_();
+        }
+    };
+
+    static void entry_func( intptr_t p) noexcept {
+        BOOST_ASSERT( 0 != p);
+
+        fcontext * bp( reinterpret_cast< fcontext * >( p) );
+        BOOST_ASSERT( nullptr != bp);
+
+        bp->run();
+    }
+
+    typedef boost::intrusive_ptr< fcontext >    ptr_t;
+
+    thread_local static fcontext                main_ctx_;
+    thread_local static ptr_t                   current_ctx_;
+
+    boost::intrusive_ptr< fcontext >            ptr_;
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+    bool                                        use_segmented_stack_ = false;
+# endif
+
+    template< typename StackAlloc, typename Fn >
+    static fcontext * create_context( StackAlloc salloc, Fn && fn) {
+        typedef worker_fcontext< Fn, StackAlloc >  func_t;
+
+        stack_context sctx( salloc.allocate() );
+        // reserve space for control structure
+        std::size_t size = sctx.size - sizeof( func_t);
+        void * sp = static_cast< char * >( sctx.sp) - sizeof( func_t);
+#if 0
+        constexpr std::size_t func_alignment = 64; // alignof( func_t);
+        constexpr std::size_t func_size = sizeof( func_t);
+        // reserve space on stack
+        void * sp = static_cast< char * >( sctx.sp) - func_size - func_alignment;
+        // align sp pointer
+        sp = std::align( func_alignment, func_size, sp, func_size + func_alignment);
+        BOOST_ASSERT( nullptr != sp);
+        // calculate remaining size
+        std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
+#endif
+        // create fast-context
+        fcontext_t fctx = make_fcontext( sp, size, & execution_context::entry_func);
+        BOOST_ASSERT( nullptr != fctx);
+        // placment new for control structure on fast-context stack
+        return new ( sp) func_t( sctx, salloc, fctx, std::forward< Fn >( fn) );
+    }
+
+    template< typename StackAlloc, typename Fn >
+    static fcontext * create_context( preallocated palloc, StackAlloc salloc, Fn && fn) {
+        typedef worker_fcontext< Fn, StackAlloc >  func_t;
+
+        // reserve space for control structure
+        std::size_t size = palloc.size - sizeof( func_t);
+        void * sp = static_cast< char * >( palloc.sp) - sizeof( func_t);
+#if 0
+        constexpr std::size_t func_alignment = 64; // alignof( func_t);
+        constexpr std::size_t func_size = sizeof( func_t);
+        // reserve space on stack
+        void * sp = static_cast< char * >( palloc.sp) - func_size - func_alignment;
+        // align sp pointer
+        sp = std::align( func_alignment, func_size, sp, func_size + func_alignment);
+        BOOST_ASSERT( nullptr != sp);
+        // calculate remaining size
+        std::size_t size = palloc.size - ( static_cast< char * >( palloc.sp) - static_cast< char * >( sp) );
+#endif
+        // create fast-context
+        fcontext_t fctx = make_fcontext( sp, size, & execution_context::entry_func);
+        BOOST_ASSERT( nullptr != fctx);
+        // placment new for control structure on fast-context stack
+        return new ( sp) func_t( palloc.sctx, salloc, fctx, std::forward< Fn >( fn) );
+    }
+
+    template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
+    static fcontext * create_worker_fcontext( StackAlloc salloc,
+                                              Fn && fn_, Tpl && tpl_,
+                                              std::index_sequence< I ... >) {
+        return create_context( salloc,
+                               [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable {
+                                   try {
+                                       fn(
+                                           // std::tuple_element<> does not perfect forwarding
+                                           std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
+                                                std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
+                                   } catch (...) {
+                                       std::terminate();
+                                   }
+                               });
+    }
+
+    template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
+    static fcontext * create_worker_fcontext( preallocated palloc, StackAlloc salloc,
+                                              Fn && fn_, Tpl && tpl_,
+                                              std::index_sequence< I ... >) {
+        return create_context( palloc, salloc,
+                               [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable {
+                                   try {
+                                       fn(
+                                           // std::tuple_element<> does not perfect forwarding
+                                           std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
+                                                std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
+                                   } catch (...) {
+                                       std::terminate();
+                                   }
+                               });
+    }
+
+    execution_context() :
+        ptr_( current_ctx_) {
+    }
+
+public:
+    static execution_context current() noexcept {
+        return execution_context();
+    }
+
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+    template< typename Fn, typename ... Args >
+    explicit execution_context( segmented_stack salloc, Fn && fn, Args && ... args) :
+        ptr_( create_worker_fcontext( salloc,
+                                      std::forward< Fn >( fn),
+                                      std::make_tuple( std::forward< Args >( args) ... ),
+                                      std::index_sequence_for< Args ... >() ) ),
+        use_segmented_stack_( true) {
+    }
+
+    template< typename Fn, typename ... Args >
+    explicit execution_context( preallocated palloc, segmented_stack salloc, Fn && fn, Args && ... args) :
+        ptr_( create_worker_fcontext( palloc, salloc,
+                                      std::forward< Fn >( fn),
+                                      std::make_tuple( std::forward< Args >( args) ... ),
+                                      std::index_sequence_for< Args ... >() ) ),
+        use_segmented_stack_( true) {
+    }
+# endif
+
+    template< typename StackAlloc, typename Fn, typename ... Args >
+    explicit execution_context( StackAlloc salloc, Fn && fn, Args && ... args) :
+        ptr_( create_worker_fcontext( salloc,
+                                      std::forward< Fn >( fn),
+                                      std::make_tuple( std::forward< Args >( args) ... ),
+                                      std::index_sequence_for< Args ... >() ) ) {
+    }
+
+    template< typename StackAlloc, typename Fn, typename ... Args >
+    explicit execution_context( preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args) :
+        ptr_( create_worker_fcontext( palloc, salloc,
+                                      std::forward< Fn >( fn),
+                                      std::make_tuple( std::forward< Args >( args) ... ),
+                                      std::index_sequence_for< Args ... >() ) ) {
+    }
+
+    void resume( bool preserve_fpu = false) noexcept {
+        fcontext * old_ctx( current_ctx_.get() );
+        fcontext * new_ctx( ptr_.get() );
+        current_ctx_ = ptr_;
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+        if ( use_segmented_stack_) {
+            __splitstack_getcontext( old_ctx->sctx.segments_ctx);
+            __splitstack_setcontext( new_ctx->sctx.segments_ctx);
+
+            jump_fcontext( & old_ctx->fctx, new_ctx->fctx, reinterpret_cast< intptr_t >( new_ctx), preserve_fpu);
+
+            __splitstack_setcontext( old_ctx->sctx.segments_ctx);
+        } else {
+            jump_fcontext( & old_ctx->fctx, new_ctx->fctx, reinterpret_cast< intptr_t >( new_ctx), preserve_fpu);
+        }
+# else
+        jump_fcontext( & old_ctx->fctx, new_ctx->fctx, reinterpret_cast< intptr_t >( new_ctx), preserve_fpu);
+# endif
+    }
+};
+
+}}
+
+# ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+# endif
+
+#endif
+
+#endif // BOOST_CONTEXT_EXECUTION_CONTEXT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/fixedsize_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,81 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_FIXEDSIZE_H
+#define BOOST_CONTEXT_FIXEDSIZE_H
+
+#include <cstddef>
+#include <cstdlib>
+#include <new>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+#include <boost/context/stack_context.hpp>
+#include <boost/context/stack_traits.hpp>
+
+#if defined(BOOST_USE_VALGRIND)
+#include <valgrind/valgrind.h>
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+template< typename traitsT >
+class basic_fixedsize_stack {
+private:
+    std::size_t     size_;
+
+public:
+    typedef traitsT traits_type;
+
+    basic_fixedsize_stack( std::size_t size = traits_type::default_size() ) :
+        size_( size) {
+        BOOST_ASSERT( traits_type::minimum_size() <= size_);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) );
+    }
+
+    stack_context allocate() {
+        void * vp = std::malloc( size_);
+        if ( ! vp) throw std::bad_alloc();
+
+        stack_context sctx;
+        sctx.size = size_;
+        sctx.sp = static_cast< char * >( vp) + sctx.size;
+#if defined(BOOST_USE_VALGRIND)
+        sctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( sctx.sp, vp);
+#endif
+        return sctx;
+    }
+
+    void deallocate( stack_context & sctx) {
+        BOOST_ASSERT( sctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= sctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) );
+
+#if defined(BOOST_USE_VALGRIND)
+        VALGRIND_STACK_DEREGISTER( sctx.valgrind_stack_id);
+#endif
+
+        void * vp = static_cast< char * >( sctx.sp) - sctx.size;
+        std::free( vp);
+    }
+};
+
+typedef basic_fixedsize_stack< stack_traits >  fixedsize_stack;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_FIXEDSIZE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/posix/protected_fixedsize_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,112 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
+#define BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
+
+extern "C" {
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <unistd.h>
+}
+
+#include <cmath>
+#include <cstddef>
+#include <new>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+#include <boost/context/stack_context.hpp>
+#include <boost/context/stack_traits.hpp>
+
+#if defined(BOOST_USE_VALGRIND)
+#include <valgrind/valgrind.h>
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+template< typename traitsT >
+class basic_protected_fixedsize_stack {
+private:
+    std::size_t     size_;
+
+public:
+    typedef traitsT traits_type;
+
+    basic_protected_fixedsize_stack( std::size_t size = traits_type::default_size() ) :
+        size_( size) {
+        BOOST_ASSERT( traits_type::minimum_size() <= size_);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) );
+    }
+
+    stack_context allocate() {
+        // page at bottom will be used as guard-page
+        const std::size_t pages(
+            static_cast< std::size_t >( 
+                std::floor(
+                    static_cast< float >( size_) / traits_type::page_size() ) ) );
+        BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
+        const std::size_t size__( pages * traits_type::page_size() );
+        BOOST_ASSERT( 0 < size_ && 0 < size__);
+        BOOST_ASSERT( size__ <= size_);
+
+        // conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
+#if defined(MAP_ANON)
+        void * vp = ::mmap( 0, size__, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+#else
+        void * vp = ::mmap( 0, size__, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+#endif
+        if ( MAP_FAILED == vp) throw std::bad_alloc();
+
+        // conforming to POSIX.1-2001
+#if defined(BOOST_DISABLE_ASSERTS)
+        ::mprotect( vp, traits_type::page_size(), PROT_NONE);
+#else
+        const int result( ::mprotect( vp, traits_type::page_size(), PROT_NONE) );
+        BOOST_ASSERT( 0 == result);
+#endif
+
+        stack_context sctx;
+        sctx.size = size__;
+        sctx.sp = static_cast< char * >( vp) + sctx.size;
+#if defined(BOOST_USE_VALGRIND)
+        sctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( sctx.sp, vp);
+#endif
+        return sctx;
+    }
+
+    void deallocate( stack_context & sctx) {
+        BOOST_ASSERT( sctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= sctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) );
+
+#if defined(BOOST_USE_VALGRIND)
+        VALGRIND_STACK_DEREGISTER( sctx.valgrind_stack_id);
+#endif
+
+        void * vp = static_cast< char * >( sctx.sp) - sctx.size;
+        // conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
+        ::munmap( vp, sctx.size);
+    }
+};
+
+typedef basic_protected_fixedsize_stack< stack_traits > protected_fixedsize_stack;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/posix/segmented_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,81 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_SEGMENTED_H
+#define BOOST_CONTEXT_SEGMENTED_H
+
+#include <cstddef>
+#include <new>
+
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+#include <boost/context/stack_context.hpp>
+#include <boost/context/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+// forward declaration for splitstack-functions defined in libgcc
+extern "C" {
+void *__splitstack_makecontext( std::size_t,
+                                void * [BOOST_CONTEXT_SEGMENTS],
+                                std::size_t *);
+
+void __splitstack_releasecontext( void * [BOOST_CONTEXT_SEGMENTS]);
+
+void __splitstack_resetcontext( void * [BOOST_CONTEXT_SEGMENTS]);
+
+void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS],
+                                         int * new_value, int * old_value);
+}
+
+namespace boost {
+namespace context {
+
+template< typename traitsT >
+class basic_segmented_stack {
+private:
+    std::size_t     size_;
+
+public:
+    typedef traitsT traits_type;
+
+    basic_segmented_stack( std::size_t size = traits_type::default_size() ) :
+        size_( size) {
+        BOOST_ASSERT( traits_type::minimum_size() <= size_);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) );
+    }
+
+    stack_context allocate() {
+        stack_context sctx;
+        void * vp = __splitstack_makecontext( size_, sctx.segments_ctx, & sctx.size);
+        if ( ! vp) throw std::bad_alloc();
+
+        // sctx.size is already filled by __splitstack_makecontext
+        sctx.sp = static_cast< char * >( vp) + sctx.size;
+
+        int off = 0;
+        __splitstack_block_signals_context( sctx.segments_ctx, & off, 0);
+
+        return sctx;
+    }
+
+    void deallocate( stack_context & sctx) {
+        __splitstack_releasecontext( sctx.segments_ctx);
+    }
+};
+
+typedef basic_segmented_stack< stack_traits > segmented_stack;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_SEGMENTED_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/protected_fixedsize_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,13 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_WINDOWS)
+# include <boost/context/windows/protected_fixedsize_stack.hpp>
+#else
+# include <boost/context/posix/protected_fixedsize_stack.hpp>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/segmented_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,13 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_USE_SEGMENTED_STACKS)
+# if ! defined(BOOST_WINDOWS)
+#  include <boost/context/posix/segmented_stack.hpp>
+# endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/stack_context.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_STACK_CONTEXT_H
+#define BOOST_CONTEXT_STACK_CONTEXT_H
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+#if defined(BOOST_USE_SEGMENTED_STACKS)
+struct stack_context {
+    typedef void *  segments_context[BOOST_CONTEXT_SEGMENTS];
+
+    std::size_t             size;
+    void                *   sp;
+    segments_context        segments_ctx;
+#if defined(BOOST_USE_VALGRIND)
+    unsigned                valgrind_stack_id;
+#endif
+
+    stack_context() :
+        size( 0),
+        sp( 0),
+        segments_ctx()
+#if defined(BOOST_USE_VALGRIND)
+        , valgrind_stack_id( 0)
+#endif
+        {}
+};
+#else
+struct stack_context {
+    std::size_t             size;
+    void                *   sp;
+#if defined(BOOST_USE_VALGRIND)
+    unsigned                valgrind_stack_id;
+#endif
+
+    stack_context() :
+        size( 0),
+        sp( 0)
+#if defined(BOOST_USE_VALGRIND)
+        , valgrind_stack_id( 0)
+#endif
+    {}
+};
+#endif
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_STACK_CONTEXT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/stack_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_STACK_TRAITS_H
+#define BOOST_CONTEXT_STACK_TRAITS_H
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+struct BOOST_CONTEXT_DECL stack_traits
+{
+    static bool is_unbounded() BOOST_NOEXCEPT;
+
+    static std::size_t page_size() BOOST_NOEXCEPT;
+
+    static std::size_t default_size() BOOST_NOEXCEPT;
+
+    static std::size_t minimum_size() BOOST_NOEXCEPT;
+
+    static std::size_t maximum_size() BOOST_NOEXCEPT;
+};
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_STACK_TRAITS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/context/windows/protected_fixedsize_stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,93 @@
+
+//          Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
+#define BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
+
+extern "C" {
+#include <windows.h>
+}
+
+#include <cmath>
+#include <cstddef>
+#include <new>
+
+#include <boost/config.hpp>
+
+#include <boost/context/detail/config.hpp>
+#include <boost/context/stack_context.hpp>
+#include <boost/context/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+template< typename traitsT >
+class basic_protected_fixedsize_stack {
+private:
+    std::size_t     size_;
+
+public:
+    typedef traitsT traits_type;
+
+    basic_protected_fixedsize_stack( std::size_t size = traits_type::default_size() ) :
+        size_( size) {
+        BOOST_ASSERT( traits_type::minimum_size() <= size_);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) );
+    }
+
+    stack_context allocate() {
+        // page at bottom will be used as guard-page
+        const std::size_t pages(
+            static_cast< std::size_t >( 
+                std::floor(
+                    static_cast< float >( size_) / traits_type::page_size() ) ) );
+        BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
+        const std::size_t size__( pages * traits_type::page_size() );
+        BOOST_ASSERT( 0 < size_ && 0 < size__);
+        BOOST_ASSERT( size__ <= size_);
+
+        void * vp = ::VirtualAlloc( 0, size__, MEM_COMMIT, PAGE_READWRITE);
+        if ( ! vp) throw std::bad_alloc();
+
+        DWORD old_options;
+#if defined(BOOST_DISABLE_ASSERTS)
+        ::VirtualProtect(
+            vp, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
+#else
+        const BOOL result = ::VirtualProtect(
+            vp, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
+        BOOST_ASSERT( FALSE != result);
+#endif
+
+        stack_context sctx;
+        sctx.size = size__;
+        sctx.sp = static_cast< char * >( vp) + sctx.size;
+        return sctx;
+    }
+
+    void deallocate( stack_context & sctx) {
+        BOOST_ASSERT( sctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= sctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) );
+
+        void * vp = static_cast< char * >( sctx.sp) - sctx.size;
+        ::VirtualFree( vp, 0, MEM_RELEASE);
+    }
+};
+
+typedef basic_protected_fixedsize_stack< stack_traits > protected_fixedsize_stack;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_CONTEXT_PROTECTED_FIXEDSIZE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/addressof.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,162 @@
+// Copyright (C) 2002 Brad King (brad.king@kitware.com)
+//                    Douglas Gregor (gregod@cs.rpi.edu)
+//
+// Copyright (C) 2002, 2008, 2013 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// For more information, see http://www.boost.org
+
+#ifndef BOOST_CORE_ADDRESSOF_HPP
+#define BOOST_CORE_ADDRESSOF_HPP
+
+# include <boost/config.hpp>
+# include <boost/detail/workaround.hpp>
+# include <cstddef>
+
+namespace boost
+{
+
+namespace detail
+{
+
+template<class T> struct addr_impl_ref
+{
+    T & v_;
+
+    BOOST_FORCEINLINE addr_impl_ref( T & v ): v_( v ) {}
+    BOOST_FORCEINLINE operator T& () const { return v_; }
+
+private:
+    addr_impl_ref & operator=(const addr_impl_ref &);
+};
+
+template<class T> struct addressof_impl
+{
+    static BOOST_FORCEINLINE T * f( T & v, long )
+    {
+        return reinterpret_cast<T*>(
+            &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
+    }
+
+    static BOOST_FORCEINLINE T * f( T * v, int )
+    {
+        return v;
+    }
+};
+
+#if !defined( BOOST_NO_CXX11_NULLPTR )
+
+#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
+
+    typedef decltype(nullptr) addr_nullptr_t;
+
+#else
+
+    typedef std::nullptr_t addr_nullptr_t;
+
+#endif
+
+template<> struct addressof_impl< addr_nullptr_t >
+{
+    typedef addr_nullptr_t T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t const >
+{
+    typedef addr_nullptr_t const T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t volatile >
+{
+    typedef addr_nullptr_t volatile T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+template<> struct addressof_impl< addr_nullptr_t const volatile >
+{
+    typedef addr_nullptr_t const volatile T;
+
+    static BOOST_FORCEINLINE T * f( T & v, int )
+    {
+        return &v;
+    }
+};
+
+#endif
+
+} // namespace detail
+
+template<class T>
+BOOST_FORCEINLINE
+T * addressof( T & v )
+{
+#if (defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) ) ) || (defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5120))
+
+    return boost::detail::addressof_impl<T>::f( v, 0 );
+
+#else
+
+    return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
+
+#endif
+}
+
+#if defined( __SUNPRO_CC ) && BOOST_WORKAROUND( __SUNPRO_CC, BOOST_TESTED_AT( 0x590 ) )
+
+namespace detail
+{
+
+template<class T> struct addressof_addp
+{
+    typedef T * type;
+};
+
+} // namespace detail
+
+template< class T, std::size_t N >
+BOOST_FORCEINLINE
+typename detail::addressof_addp< T[N] >::type addressof( T (&t)[N] )
+{
+    return &t;
+}
+
+#endif
+
+// Borland doesn't like casting an array reference to a char reference
+// but these overloads work around the problem.
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template<typename T,std::size_t N>
+BOOST_FORCEINLINE
+T (*addressof(T (&t)[N]))[N]
+{
+   return reinterpret_cast<T(*)[N]>(&t);
+}
+
+template<typename T,std::size_t N>
+BOOST_FORCEINLINE
+const T (*addressof(const T (&t)[N]))[N]
+{
+   return reinterpret_cast<const T(*)[N]>(&t);
+}
+#endif
+
+} // namespace boost
+
+#endif // BOOST_CORE_ADDRESSOF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/checked_delete.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,69 @@
+#ifndef BOOST_CORE_CHECKED_DELETE_HPP
+#define BOOST_CORE_CHECKED_DELETE_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/checked_delete.hpp
+//
+//  Copyright (c) 2002, 2003 Peter Dimov
+//  Copyright (c) 2003 Daniel Frey
+//  Copyright (c) 2003 Howard Hinnant
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/core/doc/html/core/checked_delete.html for documentation.
+//
+
+namespace boost
+{
+
+// verify that types are complete for increased safety
+
+template<class T> inline void checked_delete(T * x)
+{
+    // intentionally complex - simplification causes regressions
+    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+    (void) sizeof(type_must_be_complete);
+    delete x;
+}
+
+template<class T> inline void checked_array_delete(T * x)
+{
+    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
+    (void) sizeof(type_must_be_complete);
+    delete [] x;
+}
+
+template<class T> struct checked_deleter
+{
+    typedef void result_type;
+    typedef T * argument_type;
+
+    void operator()(T * x) const
+    {
+        // boost:: disables ADL
+        boost::checked_delete(x);
+    }
+};
+
+template<class T> struct checked_array_deleter
+{
+    typedef void result_type;
+    typedef T * argument_type;
+
+    void operator()(T * x) const
+    {
+        boost::checked_array_delete(x);
+    }
+};
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_CORE_CHECKED_DELETE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/demangle.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,121 @@
+#ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
+#define BOOST_CORE_DEMANGLE_HPP_INCLUDED
+
+// core::demangle
+//
+// Copyright 2014 Peter Dimov
+// Copyright 2014 Andrey Semashev
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/config.hpp>
+#include <string>
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+#if defined( __clang__ ) && defined( __has_include )
+# if __has_include(<cxxabi.h>)
+#  define BOOST_CORE_HAS_CXXABI_H
+# endif
+#elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
+# define BOOST_CORE_HAS_CXXABI_H
+#endif
+
+#if defined( BOOST_CORE_HAS_CXXABI_H )
+# include <cxxabi.h>
+# include <cstdlib>
+# include <cstddef>
+#endif
+
+namespace boost
+{
+
+namespace core
+{
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT;
+inline void demangle_free( char const * name ) BOOST_NOEXCEPT;
+
+class scoped_demangled_name
+{
+private:
+    char const * m_p;
+
+public:
+    explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT :
+        m_p( demangle_alloc( name ) )
+    {
+    }
+
+    ~scoped_demangled_name() BOOST_NOEXCEPT
+    {
+        demangle_free( m_p );
+    }
+
+    char const * get() const BOOST_NOEXCEPT
+    {
+        return m_p;
+    }
+
+    BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& ))
+    BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& ))
+};
+
+
+#if defined( BOOST_CORE_HAS_CXXABI_H )
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
+{
+    int status = 0;
+    std::size_t size = 0;
+    return abi::__cxa_demangle( name, NULL, &size, &status );
+}
+
+inline void demangle_free( char const * name ) BOOST_NOEXCEPT
+{
+    std::free( const_cast< char* >( name ) );
+}
+
+inline std::string demangle( char const * name )
+{
+    scoped_demangled_name demangled_name( name );
+    char const * const p = demangled_name.get();
+    if( p )
+    {
+        return p;
+    }
+    else
+    {
+        return name;
+    }
+}
+
+#else
+
+inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
+{
+    return name;
+}
+
+inline void demangle_free( char const * ) BOOST_NOEXCEPT
+{
+}
+
+inline std::string demangle( char const * name )
+{
+    return name;
+}
+
+#endif
+
+} // namespace core
+
+} // namespace boost
+
+#undef BOOST_CORE_HAS_CXXABI_H
+
+#endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/enable_if.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,119 @@
+// Boost enable_if library
+
+// Copyright 2003 (c) The Trustees of Indiana University.
+
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
+//             Jeremiah Willcock (jewillco at osl.iu.edu)
+//             Andrew Lumsdaine (lums at osl.iu.edu)
+
+
+#ifndef BOOST_CORE_ENABLE_IF_HPP
+#define BOOST_CORE_ENABLE_IF_HPP
+
+#include "boost/config.hpp"
+
+// Even the definition of enable_if causes problems on some compilers,
+// so it's macroed out for all compilers that do not support SFINAE
+
+#ifndef BOOST_NO_SFINAE
+
+namespace boost
+{
+ 
+  template <bool B, class T = void>
+  struct enable_if_c {
+    typedef T type;
+  };
+
+  template <class T>
+  struct enable_if_c<false, T> {};
+
+  template <class Cond, class T = void> 
+  struct enable_if : public enable_if_c<Cond::value, T> {};
+
+  template <bool B, class T>
+  struct lazy_enable_if_c {
+    typedef typename T::type type;
+  };
+
+  template <class T>
+  struct lazy_enable_if_c<false, T> {};
+
+  template <class Cond, class T> 
+  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
+
+
+  template <bool B, class T = void>
+  struct disable_if_c {
+    typedef T type;
+  };
+
+  template <class T>
+  struct disable_if_c<true, T> {};
+
+  template <class Cond, class T = void> 
+  struct disable_if : public disable_if_c<Cond::value, T> {};
+
+  template <bool B, class T>
+  struct lazy_disable_if_c {
+    typedef typename T::type type;
+  };
+
+  template <class T>
+  struct lazy_disable_if_c<true, T> {};
+
+  template <class Cond, class T> 
+  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
+
+} // namespace boost
+
+#else
+
+namespace boost {
+
+  namespace detail { typedef void enable_if_default_T; }
+
+  template <typename T>
+  struct enable_if_does_not_work_on_this_compiler;
+
+  template <bool B, class T = detail::enable_if_default_T>
+  struct enable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct disable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct lazy_enable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <bool B, class T = detail::enable_if_default_T> 
+  struct lazy_disable_if_c : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct enable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct disable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct lazy_enable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+  template <class Cond, class T = detail::enable_if_default_T> 
+  struct lazy_disable_if : enable_if_does_not_work_on_this_compiler<T>
+  { };
+
+} // namespace boost
+
+#endif // BOOST_NO_SFINAE
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/explicit_operator_bool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,154 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2013.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+/*!
+ * \file   explicit_operator_bool.hpp
+ * \author Andrey Semashev
+ * \date   08.03.2009
+ *
+ * This header defines a compatibility macro that implements an unspecified
+ * \c bool operator idiom, which is superseded with explicit conversion operators in
+ * C++11.
+ */
+
+#ifndef BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
+#define BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+/*!
+ * \brief The macro defines an explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE explicit operator bool () const\
+    {\
+        return !this->operator! ();\
+    }
+
+/*!
+ * \brief The macro defines a noexcept explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE explicit operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+/*!
+ * \brief The macro defines a constexpr explicit operator of conversion to \c bool
+ *
+ * The macro should be used inside the definition of a class that has to
+ * support the conversion. The class should also implement <tt>operator!</tt>,
+ * in terms of which the conversion operator will be implemented.
+ */
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR explicit operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#else // !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+#if (defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) && !defined(BOOST_NO_COMPILER_CONFIG)
+// Sun C++ 5.3 can't handle the safe_bool idiom, so don't use it
+#define BOOST_NO_UNSPECIFIED_BOOL
+#endif // (defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) && !defined(BOOST_NO_COMPILER_CONFIG)
+
+#if !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+namespace boost {
+
+namespace detail {
+
+#if !defined(_MSC_VER) && !defined(__IBMCPP__)
+
+    struct unspecified_bool
+    {
+        // NOTE TO THE USER: If you see this in error messages then you tried
+        // to apply an unsupported operator on the object that supports
+        // explicit conversion to bool.
+        struct OPERATORS_NOT_ALLOWED;
+        static void true_value(OPERATORS_NOT_ALLOWED*) {}
+    };
+    typedef void (*unspecified_bool_type)(unspecified_bool::OPERATORS_NOT_ALLOWED*);
+
+#else
+
+    // MSVC and VACPP are too eager to convert pointer to function to void* even though they shouldn't
+    struct unspecified_bool
+    {
+        // NOTE TO THE USER: If you see this in error messages then you tried
+        // to apply an unsupported operator on the object that supports
+        // explicit conversion to bool.
+        struct OPERATORS_NOT_ALLOWED;
+        void true_value(OPERATORS_NOT_ALLOWED*) {}
+    };
+    typedef void (unspecified_bool::*unspecified_bool_type)(unspecified_bool::OPERATORS_NOT_ALLOWED*);
+
+#endif
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE operator boost::detail::unspecified_bool_type () const\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE operator boost::detail::unspecified_bool_type () const BOOST_NOEXCEPT\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR operator boost::detail::unspecified_bool_type () const BOOST_NOEXCEPT\
+    {\
+        return (!this->operator! () ? &boost::detail::unspecified_bool::true_value : (boost::detail::unspecified_bool_type)0);\
+    }
+
+#else // !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE operator bool () const\
+    {\
+        return !this->operator! ();\
+    }
+
+#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()\
+    BOOST_FORCEINLINE operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()\
+    BOOST_FORCEINLINE BOOST_CONSTEXPR operator bool () const BOOST_NOEXCEPT\
+    {\
+        return !this->operator! ();\
+    }
+
+#endif // !defined(BOOST_NO_UNSPECIFIED_BOOL)
+
+#endif // !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+
+#endif // BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/ignore_unused.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_CORE_IGNORE_UNUSED_HPP
+#define BOOST_CORE_IGNORE_UNUSED_HPP
+
+#include <boost/config.hpp>
+
+namespace boost {
+
+#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+
+template <typename... Ts>
+inline void ignore_unused(Ts const& ...)
+{}
+
+template <typename... Ts>
+inline void ignore_unused()
+{}
+
+#else
+
+template <typename T1>
+inline void ignore_unused(T1 const&)
+{}
+
+template <typename T1, typename T2>
+inline void ignore_unused(T1 const&, T2 const&)
+{}
+
+template <typename T1, typename T2, typename T3>
+inline void ignore_unused(T1 const&, T2 const&, T3 const&)
+{}
+
+template <typename T1, typename T2, typename T3, typename T4>
+inline void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&)
+{}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+inline void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&, T5 const&)
+{}
+
+template <typename T1>
+inline void ignore_unused()
+{}
+
+template <typename T1, typename T2>
+inline void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3>
+inline void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3, typename T4>
+inline void ignore_unused()
+{}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+inline void ignore_unused()
+{}
+
+#endif
+
+} // namespace boost
+
+#endif // BOOST_CORE_IGNORE_UNUSED_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/is_same.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+#ifndef BOOST_CORE_IS_SAME_HPP_INCLUDED
+#define BOOST_CORE_IS_SAME_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// is_same<T1,T2>::value is true when T1 == T2
+//
+// Copyright 2014 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/config.hpp>
+
+namespace boost
+{
+
+namespace core
+{
+
+template< class T1, class T2 > struct is_same
+{
+    BOOST_STATIC_CONSTANT( bool, value = false );
+};
+
+template< class T > struct is_same< T, T >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+} // namespace core
+
+} // namespace boost
+
+#endif // #ifndef BOOST_CORE_IS_SAME_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/lightweight_test.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,171 @@
+#ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
+#define BOOST_CORE_LIGHTWEIGHT_TEST_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+//
+//  boost/core/lightweight_test.hpp - lightweight test library
+//
+//  Copyright (c) 2002, 2009, 2014 Peter Dimov
+//  Copyright (2) Beman Dawes 2010, 2011
+//  Copyright (3) Ion Gaztanaga 2013
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/assert.hpp>
+#include <boost/current_function.hpp>
+#include <boost/core/no_exceptions_support.hpp>
+#include <iostream>
+
+//  IDE's like Visual Studio perform better if output goes to std::cout or
+//  some other stream, so allow user to configure output stream:
+#ifndef BOOST_LIGHTWEIGHT_TEST_OSTREAM
+# define BOOST_LIGHTWEIGHT_TEST_OSTREAM std::cerr
+#endif
+
+namespace boost
+{
+
+namespace detail
+{
+
+struct report_errors_reminder
+{
+    bool called_report_errors_function;
+
+    report_errors_reminder() : called_report_errors_function(false) {}
+
+    ~report_errors_reminder()
+    {
+        BOOST_ASSERT(called_report_errors_function);  // verify report_errors() was called  
+    }
+};
+
+inline report_errors_reminder& report_errors_remind()
+{
+    static report_errors_reminder r;
+    return r;
+}
+
+inline int & test_errors()
+{
+    static int x = 0;
+    report_errors_remind();
+    return x;
+}
+
+inline void test_failed_impl(char const * expr, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): test '" << expr << "' failed in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void error_impl(char const * msg, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): " << msg << " in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void throw_failed_impl(char const * excep, char const * file, int line, char const * function)
+{
+   BOOST_LIGHTWEIGHT_TEST_OSTREAM
+    << file << "(" << line << "): Exception '" << excep << "' not thrown in function '"
+    << function << "'" << std::endl;
+   ++test_errors();
+}
+
+template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t == u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " == " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' != '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+template<class T, class U> inline void test_ne_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t != u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " != " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' == '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+} // namespace detail
+
+inline int report_errors()
+{
+    boost::detail::report_errors_remind().called_report_errors_function = true;
+
+    int errors = boost::detail::test_errors();
+
+    if( errors == 0 )
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << "No errors detected." << std::endl;
+        return 0;
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl;
+        return 1;
+    }
+}
+
+} // namespace boost
+
+#define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
+
+#define BOOST_ERROR(msg) ( ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+
+#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+#define BOOST_TEST_NE(expr1,expr2) ( ::boost::detail::test_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+
+#ifndef BOOST_NO_EXCEPTIONS
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )                    \
+      try {                                                    \
+         EXPR;                                                 \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+      catch(EXCEP const&) {                                    \
+      }                                                        \
+      catch(...) {                                             \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+   //
+#else
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )
+#endif
+
+#endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/lightweight_test_trait.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+#ifndef BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
+#define BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+// boost/core/lightweight_test_trait.hpp
+//
+// BOOST_TEST_TRAIT_TRUE, BOOST_TEST_TRAIT_FALSE
+//
+// Copyright 2014 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+template< class T > inline void test_trait_impl( char const * trait, void (*)( T ),
+  bool expected, char const * file, int line, char const * function )
+{
+    if( T::value == expected )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): predicate '" << trait << "' ["
+            << boost::core::demangled_name( BOOST_CORE_TYPEID(T) ) << "]"
+            << " test failed in function '" << function
+            << "' (should have been " << ( expected? "true": "false" ) << ")"
+            << std::endl;
+
+        ++test_errors();
+    }
+}
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_TEST_TRAIT_TRUE(type) ( ::boost::detail::test_trait_impl(#type, (void(*)type)0, true, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+#define BOOST_TEST_TRAIT_FALSE(type) ( ::boost::detail::test_trait_impl(#type, (void(*)type)0, false, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+
+#endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_TRAIT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/no_exceptions_support.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+#ifndef BOOST_CORE_NO_EXCEPTIONS_SUPPORT_HPP
+#define BOOST_CORE_NO_EXCEPTIONS_SUPPORT_HPP
+
+#if defined(_MSC_VER)
+#  pragma once
+#endif
+
+//----------------------------------------------------------------------
+// (C) Copyright 2004 Pavel Vozenilek.
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//
+// This file contains helper macros used when exception support may be
+// disabled (as indicated by macro BOOST_NO_EXCEPTIONS).
+//
+// Before picking up these macros you may consider using RAII techniques
+// to deal with exceptions - their syntax can be always the same with 
+// or without exception support enabled.
+//----------------------------------------------------------------------
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !(defined BOOST_NO_EXCEPTIONS)
+#    define BOOST_TRY { try
+#    define BOOST_CATCH(x) catch(x)
+#    define BOOST_RETHROW throw;
+#    define BOOST_CATCH_END }
+#else
+#    if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+#        define BOOST_TRY { if ("")
+#        define BOOST_CATCH(x) else if (!"")
+#    else
+#        define BOOST_TRY { if (true)
+#        define BOOST_CATCH(x) else if (false)
+#    endif
+#    define BOOST_RETHROW
+#    define BOOST_CATCH_END }
+#endif
+
+
+#endif 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/noncopyable.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+//  Boost noncopyable.hpp header file  --------------------------------------//
+
+//  (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/utility for documentation.
+
+#ifndef BOOST_CORE_NONCOPYABLE_HPP
+#define BOOST_CORE_NONCOPYABLE_HPP
+
+#include <boost/config.hpp>
+
+namespace boost {
+
+//  Private copy constructor and copy assignment ensure classes derived from
+//  class noncopyable cannot be copied.
+
+//  Contributed by Dave Abrahams
+
+namespace noncopyable_  // protection from unintended ADL
+{
+  class noncopyable
+  {
+  protected:
+#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
+      BOOST_CONSTEXPR noncopyable() = default;
+      ~noncopyable() = default;
+#else
+      noncopyable() {}
+      ~noncopyable() {}
+#endif
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+      noncopyable( const noncopyable& ) = delete;
+      noncopyable& operator=( const noncopyable& ) = delete;
+#else
+  private:  // emphasize the following members are private
+      noncopyable( const noncopyable& );
+      noncopyable& operator=( const noncopyable& );
+#endif
+  };
+}
+
+typedef noncopyable_::noncopyable noncopyable;
+
+} // namespace boost
+
+#endif  // BOOST_CORE_NONCOPYABLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/null_deleter.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2014.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   null_deleter.hpp
+ * \author Andrey Semashev
+ * \date   22.04.2007
+ *
+ * This header contains a \c null_deleter implementation. This is an empty
+ * function object that receives a pointer and does nothing with it.
+ * Such empty deletion strategy may be convenient, for example, when
+ * constructing <tt>shared_ptr</tt>s that point to some object that should not be
+ * deleted (i.e. a variable on the stack or some global singleton, like <tt>std::cout</tt>).
+ */
+
+#ifndef BOOST_CORE_NULL_DELETER_HPP
+#define BOOST_CORE_NULL_DELETER_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+//! A function object that does nothing and can be used as an empty deleter for \c shared_ptr
+struct null_deleter
+{
+    //! Function object result type
+    typedef void result_type;
+    /*!
+     * Does nothing
+     */
+    template< typename T >
+    void operator() (T*) const BOOST_NOEXCEPT {}
+};
+
+} // namespace boost
+
+#endif // BOOST_CORE_NULL_DELETER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/ref.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,301 @@
+#ifndef BOOST_CORE_REF_HPP
+#define BOOST_CORE_REF_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/utility/addressof.hpp>
+#include <boost/detail/workaround.hpp>
+
+//
+//  ref.hpp - ref/cref, useful helper functions
+//
+//  Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
+//  Copyright (C) 2001, 2002 Peter Dimov
+//  Copyright (C) 2002 David Abrahams
+//
+//  Copyright (C) 2014 Glen Joseph Fernandes
+//  glenfe at live dot com
+//  Copyright (C) 2014 Agustin Berge
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/core/doc/html/core/ref.html for documentation.
+//
+
+/**
+ @file
+*/
+
+/**
+ Boost namespace.
+*/
+namespace boost
+{
+
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    struct ref_workaround_tag {};
+
+#endif
+
+// reference_wrapper
+
+/**
+ @brief Contains a reference to an object of type `T`.
+
+ `reference_wrapper` is primarily used to "feed" references to
+ function templates (algorithms) that take their parameter by
+ value. It provides an implicit conversion to `T&`, which
+ usually allows the function templates to work on references
+ unmodified.
+*/
+template<class T> class reference_wrapper
+{
+public:
+    /**
+     Type `T`.
+    */
+    typedef T type;
+
+    /**
+     Constructs a `reference_wrapper` object that stores a
+     reference to `t`.
+
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
+
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    BOOST_FORCEINLINE explicit reference_wrapper( T & t, ref_workaround_tag ): t_( boost::addressof( t ) ) {}
+
+#endif
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    /**
+     @remark Construction from a temporary object is disabled.
+    */
+    BOOST_DELETED_FUNCTION(reference_wrapper(T&& t))
+public:
+#endif
+
+    /**
+     @return The stored reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE operator T& () const { return *t_; }
+
+    /**
+     @return The stored reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE T& get() const { return *t_; }
+
+    /**
+     @return A pointer to the object referenced by the stored
+       reference.
+     @remark Does not throw.
+    */
+    BOOST_FORCEINLINE T* get_pointer() const { return t_; }
+
+private:
+
+    T* t_;
+};
+
+// ref
+
+/**
+ @cond
+*/
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
+#  define BOOST_REF_CONST
+#else
+#  define BOOST_REF_CONST const
+#endif
+/**
+ @endcond
+*/
+
+/**
+ @return `reference_wrapper<T>(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE reference_wrapper<T> BOOST_REF_CONST ref( T & t )
+{
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1600 )
+
+    return reference_wrapper<T>( t, ref_workaround_tag() );
+
+#else
+
+    return reference_wrapper<T>( t );
+
+#endif
+}
+
+// cref
+
+/**
+ @return `reference_wrapper<T const>(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE reference_wrapper<T const> BOOST_REF_CONST cref( T const & t )
+{
+    return reference_wrapper<T const>(t);
+}
+
+#undef BOOST_REF_CONST
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+/**
+ @cond
+*/
+#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+#  define BOOST_REF_DELETE
+#else
+#  define BOOST_REF_DELETE = delete
+#endif
+/**
+ @endcond
+*/
+
+/**
+ @remark Construction from a temporary object is disabled.
+*/
+template<class T> void ref(T const&&) BOOST_REF_DELETE;
+
+/**
+ @remark Construction from a temporary object is disabled.
+*/
+template<class T> void cref(T const&&) BOOST_REF_DELETE;
+
+#undef BOOST_REF_DELETE
+
+#endif
+
+// is_reference_wrapper
+
+/**
+ @brief Determine if a type `T` is an instantiation of
+ `reference_wrapper`.
+
+ The value static constant will be true if the type `T` is a
+ specialization of `reference_wrapper`.
+*/
+template<typename T> struct is_reference_wrapper
+{
+    BOOST_STATIC_CONSTANT( bool, value = false );
+};
+
+/**
+ @cond
+*/
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> const >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> volatile >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+template<typename T> struct is_reference_wrapper< reference_wrapper<T> const volatile >
+{
+    BOOST_STATIC_CONSTANT( bool, value = true );
+};
+
+#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+/**
+ @endcond
+*/
+
+
+// unwrap_reference
+
+/**
+ @brief Find the type in a `reference_wrapper`.
+
+ The `typedef` type is `T::type` if `T` is a
+ `reference_wrapper`, `T` otherwise.
+*/
+template<typename T> struct unwrap_reference
+{
+    typedef T type;
+};
+
+/**
+ @cond
+*/
+template<typename T> struct unwrap_reference< reference_wrapper<T> >
+{
+    typedef T type;
+};
+
+#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> const >
+{
+    typedef T type;
+};
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> volatile >
+{
+    typedef T type;
+};
+
+template<typename T> struct unwrap_reference< reference_wrapper<T> const volatile >
+{
+    typedef T type;
+};
+
+#endif // !defined(BOOST_NO_CV_SPECIALIZATIONS)
+
+/**
+ @endcond
+*/
+
+// unwrap_ref
+
+/**
+ @return `unwrap_reference<T>::type&(t)`
+ @remark Does not throw.
+*/
+template<class T> BOOST_FORCEINLINE typename unwrap_reference<T>::type& unwrap_ref( T & t )
+{
+    return t;
+}
+
+// get_pointer
+
+/**
+ @cond
+*/
+template<class T> BOOST_FORCEINLINE T* get_pointer( reference_wrapper<T> const & r )
+{
+    return r.get_pointer();
+}
+/**
+ @endcond
+*/
+
+} // namespace boost
+
+#endif // #ifndef BOOST_CORE_REF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/scoped_enum.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,192 @@
+//  scoped_enum.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes, 2009
+//  Copyright (C) 2011-2012 Vicente J. Botet Escriba
+//  Copyright (C) 2012 Anthony Williams
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_CORE_SCOPED_ENUM_HPP
+#define BOOST_CORE_SCOPED_ENUM_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+
+#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
+
+  /**
+   * Meta-function to get the native enum type associated to an enum class or its emulation.
+   */
+  template <typename EnumType>
+  struct native_type
+  {
+    /**
+     * The member typedef type names the native enum type associated to the scoped enum,
+     * which is it self if the compiler supports scoped enums or EnumType::enum_type if it is an emulated scoped enum.
+     */
+    typedef typename EnumType::enum_type type;
+  };
+
+  /**
+   * Casts a scoped enum to its underlying type.
+   *
+   * This function is useful when working with scoped enum classes, which doens't implicitly convert to the underlying type.
+   * @param v A scoped enum.
+   * @returns The underlying type.
+   * @throws No-throws.
+   */
+  template <typename UnderlyingType, typename EnumType>
+  UnderlyingType underlying_cast(EnumType v)
+  {
+    return v.get_underlying_value_();
+  }
+
+  /**
+   * Casts a scoped enum to its native enum type.
+   *
+   * This function is useful to make programs portable when the scoped enum emulation can not be use where native enums can.
+   *
+   * EnumType the scoped enum type
+   *
+   * @param v A scoped enum.
+   * @returns The native enum value.
+   * @throws No-throws.
+   */
+  template <typename EnumType>
+  inline
+  typename EnumType::enum_type native_value(EnumType e)
+  {
+    return e.get_native_value_();
+  }
+
+#else  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+  template <typename EnumType>
+  struct native_type
+  {
+    typedef EnumType type;
+  };
+
+  template <typename UnderlyingType, typename EnumType>
+  UnderlyingType underlying_cast(EnumType v)
+  {
+    return static_cast<UnderlyingType>(v);
+  }
+
+  template <typename EnumType>
+  inline
+  EnumType native_value(EnumType e)
+  {
+    return e;
+  }
+
+#endif // BOOST_NO_CXX11_SCOPED_ENUMS
+}
+
+
+#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
+
+#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR \
+     explicit operator underlying_type() const BOOST_NOEXCEPT { return get_underlying_value_(); }
+
+#else
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR
+
+#endif
+
+/**
+ * Start a declaration of a scoped enum.
+ *
+ * @param EnumType The new scoped enum.
+ * @param UnderlyingType The underlying type.
+ */
+#define BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType, UnderlyingType)    \
+    struct EnumType {                                                   \
+        typedef void is_boost_scoped_enum_tag;                          \
+        typedef UnderlyingType underlying_type;                         \
+        EnumType() BOOST_NOEXCEPT {}                                    \
+        explicit EnumType(underlying_type v) BOOST_NOEXCEPT : v_(v) {}                 \
+        underlying_type get_underlying_value_() const BOOST_NOEXCEPT { return v_; }    \
+        BOOST_SCOPED_ENUM_UT_DECLARE_CONVERSION_OPERATOR                \
+    private:                                                            \
+        underlying_type v_;                                             \
+        typedef EnumType self_type;                                     \
+    public:                                                             \
+        enum enum_type
+
+#define BOOST_SCOPED_ENUM_DECLARE_END2() \
+        enum_type get_native_value_() const BOOST_NOEXCEPT { return enum_type(v_); } \
+        friend bool operator ==(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)==enum_type(rhs.v_); } \
+        friend bool operator ==(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)==rhs; } \
+        friend bool operator ==(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs==enum_type(rhs.v_); } \
+        friend bool operator !=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)!=enum_type(rhs.v_); } \
+        friend bool operator !=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)!=rhs; } \
+        friend bool operator !=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs!=enum_type(rhs.v_); } \
+        friend bool operator <(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<enum_type(rhs.v_); } \
+        friend bool operator <(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<rhs; } \
+        friend bool operator <(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs<enum_type(rhs.v_); } \
+        friend bool operator <=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<=enum_type(rhs.v_); } \
+        friend bool operator <=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)<=rhs; } \
+        friend bool operator <=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs<=enum_type(rhs.v_); } \
+        friend bool operator >(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>enum_type(rhs.v_); } \
+        friend bool operator >(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>rhs; } \
+        friend bool operator >(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs>enum_type(rhs.v_); } \
+        friend bool operator >=(self_type lhs, self_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>=enum_type(rhs.v_); } \
+        friend bool operator >=(self_type lhs, enum_type rhs) BOOST_NOEXCEPT { return enum_type(lhs.v_)>=rhs; } \
+        friend bool operator >=(enum_type lhs, self_type rhs) BOOST_NOEXCEPT { return lhs>=enum_type(rhs.v_); } \
+    };
+
+#define BOOST_SCOPED_ENUM_DECLARE_END(EnumType) \
+    ; \
+    EnumType(enum_type v) BOOST_NOEXCEPT : v_(v) {}                 \
+    BOOST_SCOPED_ENUM_DECLARE_END2()
+
+/**
+ * Starts a declaration of a scoped enum with the default int underlying type.
+ *
+ * @param EnumType The new scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_DECLARE_BEGIN(EnumType) \
+  BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType,int)
+
+/**
+ * Name of the native enum type.
+ *
+ * @param EnumType The new scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_NATIVE(EnumType) EnumType::enum_type
+/**
+ * Forward declares an scoped enum.
+ *
+ * @param EnumType The scoped enum.
+ */
+#define BOOST_SCOPED_ENUM_FORWARD_DECLARE(EnumType) struct EnumType
+
+#else  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+#define BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(EnumType,UnderlyingType) enum class EnumType : UnderlyingType
+#define BOOST_SCOPED_ENUM_DECLARE_BEGIN(EnumType) enum class EnumType
+#define BOOST_SCOPED_ENUM_DECLARE_END2()
+#define BOOST_SCOPED_ENUM_DECLARE_END(EnumType) ;
+
+#define BOOST_SCOPED_ENUM_NATIVE(EnumType) EnumType
+#define BOOST_SCOPED_ENUM_FORWARD_DECLARE(EnumType) enum class EnumType
+
+#endif  // BOOST_NO_CXX11_SCOPED_ENUMS
+
+// Deprecated macros
+#define BOOST_SCOPED_ENUM_START(name) BOOST_SCOPED_ENUM_DECLARE_BEGIN(name)
+#define BOOST_SCOPED_ENUM_END BOOST_SCOPED_ENUM_DECLARE_END2()
+#define BOOST_SCOPED_ENUM(name) BOOST_SCOPED_ENUM_NATIVE(name)
+
+#endif  // BOOST_CORE_SCOPED_ENUM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/swap.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,60 @@
+// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// For more information, see http://www.boost.org
+
+
+#ifndef BOOST_CORE_SWAP_HPP
+#define BOOST_CORE_SWAP_HPP
+
+// Note: the implementation of this utility contains various workarounds:
+// - swap_impl is put outside the boost namespace, to avoid infinite
+// recursion (causing stack overflow) when swapping objects of a primitive
+// type.
+// - swap_impl has a using-directive, rather than a using-declaration,
+// because some compilers (including MSVC 7.1, Borland 5.9.3, and
+// Intel 8.1) don't do argument-dependent lookup when it has a
+// using-declaration instead.
+// - boost::swap has two template arguments, instead of one, to
+// avoid ambiguity when swapping objects of a Boost type that does
+// not have its own boost::swap overload.
+
+#include <utility> //for std::swap (C++11)
+#include <algorithm> //for std::swap (C++98)
+#include <cstddef> //for std::size_t
+#include <boost/config.hpp>
+
+namespace boost_swap_impl
+{
+  template<class T>
+  BOOST_GPU_ENABLED
+  void swap_impl(T& left, T& right)
+  {
+    using namespace std;//use std::swap if argument dependent lookup fails
+    swap(left,right);
+  }
+
+  template<class T, std::size_t N>
+  BOOST_GPU_ENABLED
+  void swap_impl(T (& left)[N], T (& right)[N])
+  {
+    for (std::size_t i = 0; i < N; ++i)
+    {
+      ::boost_swap_impl::swap_impl(left[i], right[i]);
+    }
+  }
+}
+
+namespace boost
+{
+  template<class T1, class T2>
+  BOOST_GPU_ENABLED
+  void swap(T1& left, T2& right)
+  {
+    ::boost_swap_impl::swap_impl(left, right);
+  }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/typeinfo.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,151 @@
+#ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
+#define BOOST_CORE_TYPEINFO_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  core::typeinfo, BOOST_CORE_TYPEID
+//
+//  Copyright 2007, 2014 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined( BOOST_NO_TYPEID )
+
+#include <boost/current_function.hpp>
+#include <functional>
+
+namespace boost
+{
+
+namespace core
+{
+
+class typeinfo
+{
+private:
+
+    typeinfo( typeinfo const& );
+    typeinfo& operator=( typeinfo const& );
+
+    char const * name_;
+
+public:
+
+    explicit typeinfo( char const * name ): name_( name )
+    {
+    }
+
+    bool operator==( typeinfo const& rhs ) const
+    {
+        return this == &rhs;
+    }
+
+    bool operator!=( typeinfo const& rhs ) const
+    {
+        return this != &rhs;
+    }
+
+    bool before( typeinfo const& rhs ) const
+    {
+        return std::less< typeinfo const* >()( this, &rhs );
+    }
+
+    char const* name() const
+    {
+        return name_;
+    }
+};
+
+inline char const * demangled_name( core::typeinfo const & ti )
+{
+    return ti.name();
+}
+
+} // namespace core
+
+namespace detail
+{
+
+template<class T> struct core_typeid_
+{
+    static boost::core::typeinfo ti_;
+
+    static char const * name()
+    {
+        return BOOST_CURRENT_FUNCTION;
+    }
+};
+
+#if defined(__SUNPRO_CC)
+// see #4199, the Sun Studio compiler gets confused about static initialization 
+// constructor arguments. But an assignment works just fine. 
+template<class T> boost::core::typeinfo core_typeid_< T >::ti_ = core_typeid_< T >::name();
+#else
+template<class T> boost::core::typeinfo core_typeid_< T >::ti_(core_typeid_< T >::name());
+#endif
+
+template<class T> struct core_typeid_< T & >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T const >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T volatile >: core_typeid_< T >
+{
+};
+
+template<class T> struct core_typeid_< T const volatile >: core_typeid_< T >
+{
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#define BOOST_CORE_TYPEID(T) (boost::detail::core_typeid_<T>::ti_)
+
+#else
+
+#include <boost/core/demangle.hpp>
+#include <typeinfo>
+
+namespace boost
+{
+
+namespace core
+{
+
+#if defined( BOOST_NO_STD_TYPEINFO )
+
+typedef ::type_info typeinfo;
+
+#else
+
+typedef std::type_info typeinfo;
+
+#endif
+
+inline std::string demangled_name( core::typeinfo const & ti )
+{
+    return core::demangle( ti.name() );
+}
+
+} // namespace core
+
+} // namespace boost
+
+#define BOOST_CORE_TYPEID(T) typeid(T)
+
+#endif
+
+#endif  // #ifndef BOOST_CORE_TYPEINFO_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/core/underlying_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+//  underlying_type.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes, 2009
+//  Copyright (C) 2011-2012 Vicente J. Botet Escriba
+//  Copyright (C) 2012 Anthony Williams
+//  Copyright (C) 2014 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_CORE_UNDERLYING_TYPE_HPP
+#define BOOST_CORE_UNDERLYING_TYPE_HPP
+
+#include <boost/config.hpp>
+
+// GCC 4.7 and later seem to provide std::underlying_type
+#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) || (defined(BOOST_GCC) && BOOST_GCC >= 40700 && defined(__GXX_EXPERIMENTAL_CXX0X__))
+#include <type_traits>
+#define BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+namespace detail {
+
+template< typename EnumType, typename Void = void >
+struct underlying_type_impl;
+
+#if defined(BOOST_NO_CXX11_SCOPED_ENUMS)
+
+// Support for boost/core/scoped_enum.hpp
+template< typename EnumType >
+struct underlying_type_impl< EnumType, typename EnumType::is_boost_scoped_enum_tag >
+{
+    /**
+     * The member typedef type names the underlying type of EnumType. It is EnumType::underlying_type when the EnumType is an emulated scoped enum,
+     */
+    typedef typename EnumType::underlying_type type;
+};
+
+#endif
+
+#if defined(BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE)
+
+template< typename EnumType, typename Void >
+struct underlying_type_impl
+{
+    typedef typename std::underlying_type< EnumType >::type type;
+};
+
+#endif
+
+} // namespace detail
+
+#if !defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_DETAIL_HAS_STD_UNDERLYING_TYPE)
+#define BOOST_NO_UNDERLYING_TYPE
+#endif
+
+/**
+ * Meta-function to get the underlying type of a scoped enum.
+ *
+ * Requires EnumType must be an enum type or the emulation of a scoped enum.
+ * If BOOST_NO_UNDERLYING_TYPE is defined, the implementation will not be able
+ * to deduce the underlying type of enums. The user is expected to specialize
+ * this trait in this case.
+ */
+template< typename EnumType >
+struct underlying_type :
+    public detail::underlying_type_impl< EnumType >
+{
+};
+
+} // namespace boost
+
+#endif  // BOOST_CORE_UNDERLYING_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/asymmetric_coroutine.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,2233 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_ASYMMETRIC_COROUTINE_H
+#define BOOST_COROUTINES_ASYMMETRIC_COROUTINE_H
+
+#include <cstddef>
+#include <iterator>
+#include <memory>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/move/move.hpp>
+#include <boost/range.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/utility/explicit_operator_bool.hpp>
+
+#include <boost/coroutine/attributes.hpp>
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/parameters.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/stack_allocator.hpp>
+#include <boost/coroutine/detail/pull_coroutine_impl.hpp>
+#include <boost/coroutine/detail/pull_coroutine_object.hpp>
+#include <boost/coroutine/detail/pull_coroutine_synthesized.hpp>
+#include <boost/coroutine/detail/push_coroutine_impl.hpp>
+#include <boost/coroutine/detail/push_coroutine_object.hpp>
+#include <boost/coroutine/detail/push_coroutine_synthesized.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+template< typename R >
+class pull_coroutine;
+
+template< typename Arg >
+class push_coroutine
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::pull_coroutine_object;
+
+    typedef detail::push_coroutine_impl< Arg >          impl_type;
+    typedef detail::push_coroutine_synthesized< Arg >   synth_type;
+    typedef detail::parameters< Arg >                   param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
+
+    explicit push_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    push_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( pull_coroutine< Arg > &);
+
+    explicit push_coroutine( coroutine_fn,
+                             attributes const& = attributes() );
+
+    template< typename StackAllocator >
+    explicit push_coroutine( coroutine_fn,
+                             attributes const&,
+                             StackAllocator);
+# endif
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#else
+    template< typename Fn >
+    explicit push_coroutine( Fn fn,
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( Fn fn,
+                             attributes const&,
+                             StackAllocator);
+
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#endif
+
+    ~push_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
+    {
+        push_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    void swap( push_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    push_coroutine & operator()( Arg arg)
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->push( arg);
+        return * this;
+    }
+
+    class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void >
+    {
+    private:
+       push_coroutine< Arg >    *   c_;
+
+    public:
+        iterator() :
+           c_( 0)
+        {}
+
+        explicit iterator( push_coroutine< Arg > * c) :
+            c_( c)
+        {}
+
+        iterator & operator=( Arg a)
+        {
+            BOOST_ASSERT( c_);
+            if ( ! ( * c_)( a) ) c_ = 0;
+            return * this;
+        }
+
+        bool operator==( iterator const& other) const
+        { return other.c_ == c_; }
+
+        bool operator!=( iterator const& other) const
+        { return other.c_ != c_; }
+
+        iterator & operator*()
+        { return * this; }
+
+        iterator & operator++()
+        { return * this; }
+    };
+
+    struct const_iterator;
+};
+
+template< typename Arg >
+class push_coroutine< Arg & >
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::pull_coroutine_object;
+
+    typedef detail::push_coroutine_impl< Arg & >          impl_type;
+    typedef detail::push_coroutine_synthesized< Arg & >   synth_type;
+    typedef detail::parameters< Arg & >                   param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
+
+    explicit push_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    push_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( pull_coroutine< Arg & > &);
+
+    explicit push_coroutine( coroutine_fn,
+                             attributes const& = attributes() );
+
+    template< typename StackAllocator >
+    explicit push_coroutine( coroutine_fn,
+                             attributes const&,
+                             StackAllocator);
+# endif
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#else
+    template< typename Fn >
+    explicit push_coroutine( Fn,
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( Fn,
+                             attributes const&,
+                             StackAllocator);
+
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#endif
+
+    ~push_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
+    {
+        push_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    void swap( push_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    push_coroutine & operator()( Arg & arg)
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->push( arg);
+        return * this;
+    }
+
+    class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void >
+    {
+    private:
+       push_coroutine< Arg & >  *   c_;
+
+    public:
+        iterator() :
+           c_( 0)
+        {}
+
+        explicit iterator( push_coroutine< Arg & > * c) :
+            c_( c)
+        {}
+
+        iterator & operator=( Arg & a)
+        {
+            BOOST_ASSERT( c_);
+            if ( ! ( * c_)( a) ) c_ = 0;
+            return * this;
+        }
+
+        bool operator==( iterator const& other) const
+        { return other.c_ == c_; }
+
+        bool operator!=( iterator const& other) const
+        { return other.c_ != c_; }
+
+        iterator & operator*()
+        { return * this; }
+
+        iterator & operator++()
+        { return * this; }
+    };
+
+    struct const_iterator;
+};
+
+template<>
+class push_coroutine< void >
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::pull_coroutine_object;
+
+    typedef detail::push_coroutine_impl< void >          impl_type;
+    typedef detail::push_coroutine_synthesized< void >   synth_type;
+    typedef detail::parameters< void >                   param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
+
+    explicit push_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    push_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( pull_coroutine< void > &);
+
+    explicit push_coroutine( coroutine_fn,
+                             attributes const& = attributes() );
+
+    template< typename StackAllocator >
+    explicit push_coroutine( coroutine_fn,
+                             attributes const&,
+                             StackAllocator);
+# endif
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#else
+    template< typename Fn >
+    explicit push_coroutine( Fn,
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( Fn,
+                             attributes const&,
+                             StackAllocator);
+
+    template< typename Fn >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const& = attributes() );
+
+    template< typename Fn, typename StackAllocator >
+    explicit push_coroutine( BOOST_RV_REF( Fn),
+                             attributes const&,
+                             StackAllocator);
+#endif
+
+    ~push_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    inline push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    inline push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
+    {
+        push_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    inline bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    inline void swap( push_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    inline push_coroutine & operator()()
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->push();
+        return * this;
+    }
+
+    struct iterator;
+    struct const_iterator;
+};
+
+
+
+template< typename R >
+class pull_coroutine
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::push_coroutine_object;
+
+    typedef detail::pull_coroutine_impl< R >            impl_type;
+    typedef detail::pull_coroutine_synthesized< R >     synth_type;
+    typedef detail::parameters< R >                     param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
+
+    explicit pull_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    pull_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( push_coroutine< R > &);
+
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, coroutine_fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename StackAllocator >
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, coroutine_fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+# endif
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#else
+    template< typename Fn >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R >, R, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#endif
+
+    ~pull_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
+    {
+        pull_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    void swap( pull_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    pull_coroutine & operator()()
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->pull();
+        return * this;
+    }
+
+    R get() const
+    {
+        BOOST_ASSERT( 0 != impl_);
+
+        return impl_->get();
+    }
+
+    class iterator : public std::iterator< std::input_iterator_tag, typename remove_reference< R >::type >
+    {
+    private:
+        pull_coroutine< R > *   c_;
+        R                   *   val_;
+
+        void fetch_()
+        {
+            BOOST_ASSERT( c_);
+
+            if ( ! ( * c_) )
+            {
+                c_ = 0;
+                val_ = 0;
+                return;
+            }
+            val_ = c_->impl_->get_pointer();
+        }
+
+        void increment_()
+        {
+            BOOST_ASSERT( c_);
+            BOOST_ASSERT( * c_);
+
+            ( * c_)();
+            fetch_();
+        }
+
+    public:
+        typedef typename iterator::pointer      pointer_t;
+        typedef typename iterator::reference    reference_t;
+
+        iterator() :
+            c_( 0), val_( 0)
+        {}
+
+        explicit iterator( pull_coroutine< R > * c) :
+            c_( c), val_( 0)
+        { fetch_(); }
+
+        iterator( iterator const& other) :
+            c_( other.c_), val_( other.val_)
+        {}
+
+        iterator & operator=( iterator const& other)
+        {
+            if ( this == & other) return * this;
+            c_ = other.c_;
+            val_ = other.val_;
+            return * this;
+        }
+
+        bool operator==( iterator const& other) const
+        { return other.c_ == c_ && other.val_ == val_; }
+
+        bool operator!=( iterator const& other) const
+        { return other.c_ != c_ || other.val_ != val_; }
+
+        iterator & operator++()
+        {
+            increment_();
+            return * this;
+        }
+
+        iterator operator++( int);
+
+        reference_t operator*() const
+        {
+            if ( ! val_)
+                boost::throw_exception(
+                    invalid_result() );
+            return * val_;
+        }
+
+        pointer_t operator->() const
+        {
+            if ( ! val_)
+                boost::throw_exception(
+                    invalid_result() );
+            return val_;
+        }
+    };
+
+    friend class iterator;
+
+    struct const_iterator;
+};
+
+template< typename R >
+class pull_coroutine< R & >
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::push_coroutine_object;
+
+    typedef detail::pull_coroutine_impl< R & >            impl_type;
+    typedef detail::pull_coroutine_synthesized< R & >     synth_type;
+    typedef detail::parameters< R & >                     param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
+
+    explicit pull_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    pull_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( push_coroutine< R & > &);
+
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, coroutine_fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename StackAllocator >
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, coroutine_fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+# endif
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#else
+    template< typename Fn >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, stack_allocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< R & >, R &, Fn, StackAllocator
+        >                                                        object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#endif
+
+    ~pull_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
+    {
+        pull_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    void swap( pull_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    pull_coroutine & operator()()
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->pull();
+        return * this;
+    }
+
+    R & get() const
+    { return impl_->get(); }
+
+    class iterator : public std::iterator< std::input_iterator_tag, R >
+    {
+    private:
+        pull_coroutine< R & >   *   c_;
+        R                       *   val_;
+
+        void fetch_()
+        {
+            BOOST_ASSERT( c_);
+
+            if ( ! ( * c_) )
+            {
+                c_ = 0;
+                val_ = 0;
+                return;
+            }
+            val_ = c_->impl_->get_pointer();
+        }
+
+        void increment_()
+        {
+            BOOST_ASSERT( c_);
+            BOOST_ASSERT( * c_);
+
+            ( * c_)();
+            fetch_();
+        }
+
+    public:
+        typedef typename iterator::pointer      pointer_t;
+        typedef typename iterator::reference    reference_t;
+
+        iterator() :
+            c_( 0), val_( 0)
+        {}
+
+        explicit iterator( pull_coroutine< R & > * c) :
+            c_( c), val_( 0)
+        { fetch_(); }
+
+        iterator( iterator const& other) :
+            c_( other.c_), val_( other.val_)
+        {}
+
+        iterator & operator=( iterator const& other)
+        {
+            if ( this == & other) return * this;
+            c_ = other.c_;
+            val_ = other.val_;
+            return * this;
+        }
+
+        bool operator==( iterator const& other) const
+        { return other.c_ == c_ && other.val_ == val_; }
+
+        bool operator!=( iterator const& other) const
+        { return other.c_ != c_ || other.val_ != val_; }
+
+        iterator & operator++()
+        {
+            increment_();
+            return * this;
+        }
+
+        iterator operator++( int);
+
+        reference_t operator*() const
+        {
+            if ( ! val_)
+                boost::throw_exception(
+                    invalid_result() );
+            return * val_;
+        }
+
+        pointer_t operator->() const
+        {
+            if ( ! val_)
+                boost::throw_exception(
+                    invalid_result() );
+            return val_;
+        }
+    };
+
+    friend class iterator;
+
+    struct const_iterator;
+};
+
+template<>
+class pull_coroutine< void >
+{
+private:
+    template< typename V, typename X, typename Y, typename Z >
+    friend class detail::push_coroutine_object;
+
+    typedef detail::pull_coroutine_impl< void >            impl_type;
+    typedef detail::pull_coroutine_synthesized< void >     synth_type;
+    typedef detail::parameters< void >                     param_type;
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
+
+    explicit pull_coroutine( detail::synthesized_t::flag_t, impl_type & impl) :
+        impl_( & impl)
+    { BOOST_ASSERT( impl_); }
+
+public:
+    pull_coroutine() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( push_coroutine< void > &);
+
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, coroutine_fn, stack_allocator
+        >                                       object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename StackAllocator >
+    explicit pull_coroutine( coroutine_fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, coroutine_fn, StackAllocator
+        >                                                                   object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+# endif
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, stack_allocator
+        >                                                       object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, StackAllocator
+        >                                                       object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#else
+    template< typename Fn >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, stack_allocator
+        >                                                       object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( Fn fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, StackAllocator
+        >                                                       object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs = attributes() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        stack_allocator stack_alloc;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, stack_allocator
+        >                                           object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit pull_coroutine( BOOST_RV_REF( Fn) fn,
+                             attributes const& attrs,
+                             StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef detail::pull_coroutine_object<
+            push_coroutine< void >, void, Fn, StackAllocator
+        >                                           object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+        impl_->pull();
+    }
+#endif
+
+    ~pull_coroutine()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    inline pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    inline pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
+    {
+        pull_coroutine tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    inline bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete(); }
+
+    inline void swap( pull_coroutine & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    inline pull_coroutine & operator()()
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->pull();
+        return * this;
+    }
+
+    struct iterator;
+    struct const_iterator;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+template< typename Arg >
+push_coroutine< Arg >::push_coroutine( coroutine_fn fn,
+                                       attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, coroutine_fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename StackAllocator >
+push_coroutine< Arg >::push_coroutine( coroutine_fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, coroutine_fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+push_coroutine< Arg & >::push_coroutine( coroutine_fn fn,
+                                         attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, coroutine_fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename StackAllocator >
+push_coroutine< Arg & >::push_coroutine( coroutine_fn fn,
+                                         attributes const& attrs,
+                                         StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, coroutine_fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+inline push_coroutine< void >::push_coroutine( coroutine_fn fn,
+                                               attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, coroutine_fn, stack_allocator
+    >                                                               object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename StackAllocator >
+push_coroutine< void >::push_coroutine( coroutine_fn fn,
+                                        attributes const& attrs,
+                                        StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, coroutine_fn, StackAllocator
+    >                                                               object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+# endif
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, stack_allocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, StackAllocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                         attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                         attributes const& attrs,
+                                         StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn >
+push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                        attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn, typename StackAllocator >
+push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                        attributes const& attrs,
+                                        StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+#else
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg >::push_coroutine( Fn fn,
+                                       attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, stack_allocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg >::push_coroutine( Fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, StackAllocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg & >::push_coroutine( Fn fn,
+                                         attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg & >::push_coroutine( Fn fn,
+                                         attributes const& attrs,
+                                         StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn >
+push_coroutine< void >::push_coroutine( Fn fn,
+                                        attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn, typename StackAllocator >
+push_coroutine< void >::push_coroutine( Fn fn,
+                                        attributes const& attrs,
+                                        StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, stack_allocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg >, Arg, Fn, StackAllocator
+    >                                                    object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn >
+push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                         attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Arg >
+template< typename Fn, typename StackAllocator >
+push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                         attributes const& attrs,
+                                         StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn >
+push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                        attributes const& attrs) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    stack_allocator stack_alloc;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, stack_allocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+
+template< typename Fn, typename StackAllocator >
+push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
+                                        attributes const& attrs,
+                                        StackAllocator stack_alloc) :
+    impl_( 0)
+{
+    // create a stack-context
+    stack_context stack_ctx;
+    // allocate the coroutine-stack
+    stack_alloc.allocate( stack_ctx, attrs.size);
+    BOOST_ASSERT( 0 < stack_ctx.sp);
+    // typedef of internal coroutine-type
+    typedef detail::push_coroutine_object<
+        pull_coroutine< void >, void, Fn, StackAllocator
+    >                                                            object_t;
+    // reserve space on top of coroutine-stack for internal coroutine-type
+    stack_context internal_stack_ctx;
+    internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+    internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+    BOOST_ASSERT( 0 < internal_stack_ctx.size);
+    // placement new for internal coroutine
+    impl_ = new ( internal_stack_ctx.sp) object_t(
+            fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+    BOOST_ASSERT( impl_);
+}
+#endif
+
+template< typename R >
+void swap( pull_coroutine< R > & l, pull_coroutine< R > & r) BOOST_NOEXCEPT
+{ l.swap( r); }
+
+template< typename Arg >
+void swap( push_coroutine< Arg > & l, push_coroutine< Arg > & r) BOOST_NOEXCEPT
+{ l.swap( r); }
+
+template< typename R >
+typename pull_coroutine< R >::iterator
+range_begin( pull_coroutine< R > & c)
+{ return typename pull_coroutine< R >::iterator( & c); }
+
+template< typename R >
+typename pull_coroutine< R >::iterator
+range_end( pull_coroutine< R > &)
+{ return typename pull_coroutine< R >::iterator(); }
+
+template< typename Arg >
+typename push_coroutine< Arg >::iterator
+range_begin( push_coroutine< Arg > & c)
+{ return typename push_coroutine< Arg >::iterator( & c); }
+
+template< typename Arg >
+typename push_coroutine< Arg >::iterator
+range_end( push_coroutine< Arg > &)
+{ return typename push_coroutine< Arg >::iterator(); }
+
+template< typename T >
+struct asymmetric_coroutine
+{
+    typedef push_coroutine< T > push_type;
+    typedef pull_coroutine< T > pull_type;
+};
+
+// deprecated
+template< typename T >
+struct coroutine
+{
+    typedef push_coroutine< T > push_type;
+    typedef pull_coroutine< T > pull_type;
+};
+
+template< typename R >
+typename pull_coroutine< R >::iterator
+begin( pull_coroutine< R > & c)
+{ return boost::begin( c); }
+
+template< typename R >
+typename pull_coroutine< R >::iterator
+end( pull_coroutine< R > & c)
+{ return boost::end( c); }
+
+template< typename R >
+typename push_coroutine< R >::iterator
+begin( push_coroutine< R > & c)
+{ return boost::begin( c); }
+
+template< typename R >
+typename push_coroutine< R >::iterator
+end( push_coroutine< R > & c)
+{ return boost::end( c); }
+
+}
+
+template< typename Arg >
+struct range_mutable_iterator< coroutines::push_coroutine< Arg > >
+{ typedef typename coroutines::push_coroutine< Arg >::iterator type; };
+
+template< typename R >
+struct range_mutable_iterator< coroutines::pull_coroutine< R > >
+{ typedef typename coroutines::pull_coroutine< R >::iterator type; };
+
+}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_ASYMMETRIC_COROUTINE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/checkpoint.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_CHECKPOINT_H
-#define BOOST_COROUTINES_CHECKPOINT_H
-
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-class checkpoint
-{
-public:
-private:
-    context::fcontext_t ctx_;
-    void            *   sp_;
-};
-
-}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_CHECKPOINT_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/exceptions.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_EXCEPTIONS_H
-#define BOOST_COROUTINES_DETAIL_EXCEPTIONS_H
-
-#include <boost/config.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-struct forced_unwind {};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_EXCEPTIONS_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/holder.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_HOLDER_H
-#define BOOST_COROUTINES_DETAIL_HOLDER_H
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/optional.hpp>
-
-#include <boost/coroutine/detail/coroutine_context.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename Data >
-struct holder
-{
-    coroutine_context      *   ctx;
-    optional< Data >        data;
-    bool                    force_unwind;
-
-    explicit holder( coroutine_context * ctx_) :
-        ctx( ctx_), data(), force_unwind( false)
-    { BOOST_ASSERT( ctx); }
-
-    explicit holder( coroutine_context * ctx_, Data data_) :
-        ctx( ctx_), data( data_), force_unwind( false)
-    { BOOST_ASSERT( ctx); }
-
-    explicit holder( coroutine_context * ctx_, bool force_unwind_) :
-        ctx( ctx_), data(), force_unwind( force_unwind_)
-    {
-        BOOST_ASSERT( ctx);
-        BOOST_ASSERT( force_unwind);
-    }
-
-    holder( holder const& other) :
-        ctx( other.ctx), data( other.data),
-        force_unwind( other.force_unwind)
-    {}
-
-    holder & operator=( holder const& other)
-    {
-        if ( this == & other) return * this;
-        ctx = other.ctx;
-        data = other.data;
-        force_unwind = other.force_unwind;
-        return * this;
-    }
-};
-
-template<>
-struct holder< void >
-{
-    coroutine_context  *   ctx;
-    bool                force_unwind;
-
-    explicit holder( coroutine_context * ctx_, bool force_unwind_ = false) :
-        ctx( ctx_), force_unwind( force_unwind_)
-    { BOOST_ASSERT( ctx); }
-
-    holder( holder const& other) :
-        ctx( other.ctx), force_unwind( other.force_unwind)
-    {}
-
-    holder & operator=( holder const& other)
-    {
-        if ( this == & other) return * this;
-        ctx = other.ctx;
-        force_unwind = other.force_unwind;
-        return * this;
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_HOLDER_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/param.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_PARAM_H
-#define BOOST_COROUTINES_DETAIL_PARAM_H
-
-#include <boost/config.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/is_scalar.hpp>
-#include <boost/type_traits/is_stateless.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename T >
-struct param : 
-    public mpl::eval_if<
-        mpl::or_<
-            is_scalar< T >,
-            is_stateless< T >,
-            is_reference< T >
-        >,
-        mpl::identity< T >,
-        add_reference< T >
-    >
-{};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_PARAM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/parameters.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,102 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PARAMETERS_H
+#define BOOST_COROUTINES_DETAIL_PARAMETERS_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/flags.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename Data >
+struct parameters
+{
+    Data                *   data;
+    bool                    do_unwind;
+    void                *   coro;
+
+    parameters() :
+        data( 0), do_unwind( false), coro( 0)
+    {}
+
+    explicit parameters( void * coro_) :
+        data( 0), do_unwind( false), coro( coro_)
+    { BOOST_ASSERT( 0 != coro); }
+
+    explicit parameters( Data * data_, void * coro_) :
+        data( data_), do_unwind( false), coro( coro_)
+    {
+        BOOST_ASSERT( 0 != data);
+        BOOST_ASSERT( 0 != coro);
+    }
+
+    explicit parameters( unwind_t::flag_t) :
+        data( 0), do_unwind( true)
+    {}
+};
+
+template< typename Data >
+struct parameters< Data & >
+{
+    Data                *   data;
+    bool                    do_unwind;
+    void                *   coro;
+
+    parameters() :
+        data( 0), do_unwind( false), coro( 0)
+    {}
+
+    explicit parameters( void * coro_) :
+        data( 0), do_unwind( false), coro( coro_)
+    { BOOST_ASSERT( 0 != coro); }
+
+    explicit parameters( Data * data_, void * coro_) :
+        data( data_), do_unwind( false), coro( coro_)
+    {
+        BOOST_ASSERT( 0 != data);
+        BOOST_ASSERT( 0 != coro);
+    }
+
+    explicit parameters( unwind_t::flag_t) :
+        data( 0), do_unwind( true), coro( 0)
+    {}
+};
+
+template<>
+struct parameters< void >
+{
+    bool                    do_unwind;
+    void                *   coro;
+
+    parameters() :
+        do_unwind( false), coro(0)
+    {}
+
+    parameters( void * coro_) :
+        do_unwind( false), coro( coro_)
+    { BOOST_ASSERT( 0 != coro); }
+
+    explicit parameters( unwind_t::flag_t) :
+        do_unwind( true), coro( 0)
+    {}
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PARAMETERS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,355 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H
+#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/parameters.hpp>
+#include <boost/coroutine/detail/trampoline_pull.hpp>
+#include <boost/coroutine/exceptions.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+struct stack_context;
+
+namespace detail {
+
+template< typename R >
+class pull_coroutine_impl : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+    R                   *   result_;
+
+public:
+    typedef parameters< R >                           param_type;
+
+    pull_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee),
+        result_( 0)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    pull_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu,
+                         R * result) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee),
+        result_( result)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~pull_coroutine_impl() {}
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void pull()
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        result_ = from->data;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    bool has_result() const
+    { return 0 != result_; }
+
+    R get() const
+    {
+        if ( ! has_result() )
+            boost::throw_exception(
+                invalid_result() );
+        return * result_;
+    }
+
+    R * get_pointer() const
+    {
+        if ( ! has_result() )
+            boost::throw_exception(
+                invalid_result() );
+        return result_;
+    }
+
+    virtual void destroy() = 0;
+};
+
+template< typename R >
+class pull_coroutine_impl< R & > : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+    R                   *   result_;
+
+public:
+    typedef parameters< R & >                           param_type;
+
+    pull_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee),
+        result_( 0)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    pull_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu,
+                         R * result) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee),
+        result_( result)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~pull_coroutine_impl() {}
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void pull()
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        result_ = from->data;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    bool has_result() const
+    { return 0 != result_; }
+
+    R & get() const
+    {
+        if ( ! has_result() )
+            boost::throw_exception(
+                invalid_result() );
+        return * result_;
+    }
+
+    R * get_pointer() const
+    {
+        if ( ! has_result() )
+            boost::throw_exception(
+                invalid_result() );
+        return result_;
+    }
+
+    virtual void destroy() = 0;
+};
+
+template<>
+class pull_coroutine_impl< void > : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+
+public:
+    typedef parameters< void >      param_type;
+
+    pull_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~pull_coroutine_impl() {}
+
+    inline bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    inline bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    inline bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    inline bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    inline bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    inline bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    inline void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    inline void pull()
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    virtual void destroy() = 0;
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_object.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,324 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H
+#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/move/move.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/pull_coroutine_impl.hpp>
+#include <boost/coroutine/detail/trampoline_pull.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/flags.hpp>
+#include <boost/coroutine/stack_context.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4355)
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+struct pull_coroutine_context
+{
+    coroutine_context   caller;
+    coroutine_context   callee;
+
+    template< typename Coro >
+    pull_coroutine_context( stack_context const& stack_ctx, Coro *) :
+        caller(),
+        callee( trampoline_pull< Coro >, stack_ctx)
+    {}
+};
+
+template< typename PushCoro, typename R, typename Fn, typename StackAllocator >
+class pull_coroutine_object : private pull_coroutine_context,
+                              public pull_coroutine_impl< R >
+{
+private:
+    typedef pull_coroutine_context                                      ctx_t;
+    typedef pull_coroutine_impl< R >                                    base_t;
+    typedef pull_coroutine_object< PushCoro, R, Fn, StackAllocator >    obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    pull_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run()
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PushCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu() );
+        PushCoro push_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( push_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename PushCoro, typename R, typename Fn, typename StackAllocator >
+class pull_coroutine_object< PushCoro, R &, Fn, StackAllocator > : private pull_coroutine_context,
+                                                                   public pull_coroutine_impl< R & >
+{
+private:
+    typedef pull_coroutine_context                                      ctx_t;
+    typedef pull_coroutine_impl< R & >                                  base_t;
+    typedef pull_coroutine_object< PushCoro, R &, Fn, StackAllocator >  obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    pull_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run()
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PushCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu() );
+        PushCoro push_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( push_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename PushCoro, typename Fn, typename StackAllocator >
+class pull_coroutine_object< PushCoro, void, Fn, StackAllocator > : private pull_coroutine_context,
+                                                                    public pull_coroutine_impl< void >
+{
+private:
+    typedef pull_coroutine_context                                      ctx_t;
+    typedef pull_coroutine_impl< void >                                 base_t;
+    typedef pull_coroutine_object< PushCoro, void, Fn, StackAllocator > obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    pull_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run()
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PushCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu() );
+        PushCoro push_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( push_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/pull_coroutine_synthesized.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,80 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H
+#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/pull_coroutine_impl.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename R >
+class pull_coroutine_synthesized : public pull_coroutine_impl< R >
+{
+private:
+    typedef pull_coroutine_impl< R >                                    impl_t;
+
+public:
+    pull_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu,
+                                R * result) :
+        impl_t( caller, callee, unwind, preserve_fpu, result)
+    {}
+
+    void destroy() {}
+};
+
+template< typename R >
+class pull_coroutine_synthesized< R & > : public pull_coroutine_impl< R & >
+{
+private:
+    typedef pull_coroutine_impl< R & >                                    impl_t;
+
+public:
+    pull_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu,
+                                R * result) :
+        impl_t( caller, callee, unwind, preserve_fpu, result)
+    {}
+
+    void destroy() {}
+};
+
+template<>
+class pull_coroutine_synthesized< void > : public pull_coroutine_impl< void >
+{
+private:
+    typedef pull_coroutine_impl< void >                                    impl_t;
+
+public:
+    pull_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu) :
+        impl_t( caller, callee, unwind, preserve_fpu)
+    {}
+
+    inline void destroy() {}
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,295 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H
+#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/parameters.hpp>
+#include <boost/coroutine/detail/trampoline_push.hpp>
+#include <boost/coroutine/exceptions.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+struct stack_context;
+
+namespace detail {
+
+template< typename Arg >
+class push_coroutine_impl : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+
+public:
+    typedef parameters< Arg >                           param_type;
+
+    push_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void push( Arg const& arg)
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( const_cast< Arg * >( & arg), this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    void push( BOOST_RV_REF( Arg) arg)
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( const_cast< Arg * >( & arg), this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    virtual void destroy() = 0;
+};
+
+template< typename Arg >
+class push_coroutine_impl< Arg & > : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+
+public:
+    typedef parameters< Arg & >                         param_type;
+
+    push_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void push( Arg & arg)
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( & arg, this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    virtual void destroy() = 0;
+};
+
+template<>
+class push_coroutine_impl< void > : private noncopyable
+{
+protected:
+    int                     flags_;
+    exception_ptr           except_;
+    coroutine_context   *   caller_;
+    coroutine_context   *   callee_;
+
+public:
+    typedef parameters< void >                          param_type;
+
+    push_coroutine_impl( coroutine_context * caller,
+                         coroutine_context * callee,
+                         bool unwind, bool preserve_fpu) :
+        flags_( 0),
+        except_(),
+        caller_( caller),
+        callee_( callee)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    inline bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    inline bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    inline bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    inline bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    inline bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    inline bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    inline void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            param_type to( unwind_t::force_unwind);
+            caller_->jump(
+                * callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    inline void push()
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        param_type to( this);
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                caller_->jump(
+                    * callee_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ &= ~flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        if ( except_) rethrow_exception( except_);
+    }
+
+    virtual void destroy() = 0;
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_object.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,336 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H
+#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/move/move.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/push_coroutine_impl.hpp>
+#include <boost/coroutine/detail/trampoline_push.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/flags.hpp>
+#include <boost/coroutine/stack_context.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4355)
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+struct push_coroutine_context
+{
+    coroutine_context   caller;
+    coroutine_context   callee;
+
+    template< typename Coro >
+    push_coroutine_context( stack_context const& stack_ctx, Coro *) :
+        caller(),
+        callee( trampoline_push< Coro >, stack_ctx)
+    {}
+};
+
+struct push_coroutine_context_void
+{
+    coroutine_context   caller;
+    coroutine_context   callee;
+
+    template< typename Coro >
+    push_coroutine_context_void( stack_context const& stack_ctx, Coro *) :
+        caller(),
+        callee( trampoline_push_void< Coro >, stack_ctx)
+    {}
+};
+
+template< typename PullCoro, typename R, typename Fn, typename StackAllocator >
+class push_coroutine_object : private push_coroutine_context,
+                              public push_coroutine_impl< R >
+{
+private:
+    typedef push_coroutine_context                                      ctx_t;
+    typedef push_coroutine_impl< R >                                    base_t;
+    typedef push_coroutine_object< PullCoro, R, Fn, StackAllocator >    obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    push_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run( R * result)
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PullCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu(), result);
+        PullCoro pull_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( pull_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename PullCoro, typename R, typename Fn, typename StackAllocator >
+class push_coroutine_object< PullCoro, R &, Fn, StackAllocator > : private push_coroutine_context,
+                                                                   public push_coroutine_impl< R & >
+{
+private:
+    typedef push_coroutine_context                                          ctx_t;
+    typedef push_coroutine_impl< R & >                                      base_t;
+    typedef push_coroutine_object< PullCoro, R &, Fn, StackAllocator >      obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    push_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run( R * result)
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PullCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu(), result);
+        PullCoro push_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( push_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename PullCoro, typename Fn, typename StackAllocator >
+class push_coroutine_object< PullCoro, void, Fn, StackAllocator > : private push_coroutine_context_void,
+                                                                    public push_coroutine_impl< void >
+{
+private:
+    typedef push_coroutine_context_void                                     ctx_t;
+    typedef push_coroutine_impl< void >                                     base_t;
+    typedef push_coroutine_object< PullCoro, void, Fn, StackAllocator >     obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    push_coroutine_object( Fn fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                           stack_context const& stack_ctx,
+                           stack_context const& internal_stack_ctx,
+                           StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        ctx_t( internal_stack_ctx, this),
+        base_t( & this->caller,
+                & this->callee,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run()
+    {
+        BOOST_ASSERT( ! base_t::unwind_requested() );
+
+        base_t::flags_ |= flag_started;
+        base_t::flags_ |= flag_running;
+
+        // create push_coroutine
+        typename PullCoro::synth_type b( & this->callee, & this->caller, false, base_t::preserve_fpu() );
+        PullCoro push_coro( synthesized_t::syntesized, b);
+        try
+        { fn_( push_coro); }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { base_t::except_ = current_exception(); }
+
+        base_t::flags_ |= flag_complete;
+        base_t::flags_ &= ~flag_running;
+        typename base_t::param_type to;
+        this->callee.jump(
+            this->caller,
+            reinterpret_cast< intptr_t >( & to),
+            base_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/push_coroutine_synthesized.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,78 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H
+#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/push_coroutine_impl.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename R >
+class push_coroutine_synthesized : public push_coroutine_impl< R >
+{
+private:
+    typedef push_coroutine_impl< R >                                    impl_t;
+
+public:
+    push_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu) :
+        impl_t( caller, callee, unwind, preserve_fpu)
+    {}
+
+    void destroy() {}
+};
+
+template< typename R >
+class push_coroutine_synthesized< R & > : public push_coroutine_impl< R & >
+{
+private:
+    typedef push_coroutine_impl< R & >                                    impl_t;
+
+public:
+    push_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu) :
+        impl_t( caller, callee, unwind, preserve_fpu)
+    {}
+
+    void destroy() {}
+};
+
+template<>
+class push_coroutine_synthesized< void > : public push_coroutine_impl< void >
+{
+private:
+    typedef push_coroutine_impl< void >                                    impl_t;
+
+public:
+    push_coroutine_synthesized( coroutine_context * caller,
+                                coroutine_context * callee,
+                                bool unwind, bool preserve_fpu) :
+        impl_t( caller, callee, unwind, preserve_fpu)
+    {}
+
+    inline void destroy() {}
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/segmented_stack_allocator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_SEGMENTED_STACK_ALLOCATOR_H
-#define BOOST_COROUTINES_DETAIL_SEGMENTED_STACK_ALLOCATOR_H
-
-#include <cstddef>
-
-#include <boost/config.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-struct stack_context;
-
-namespace detail {
-
-#if defined(BOOST_USE_SEGMENTED_STACKS)
-class BOOST_COROUTINES_DECL segmented_stack_allocator
-{
-public:
-    static bool is_stack_unbound();
-
-    static std::size_t default_stacksize();
-
-    static std::size_t minimum_stacksize();
-
-    static std::size_t maximum_stacksize();
-
-    void allocate( stack_context &, std::size_t = minimum_stacksize() );
-
-    void deallocate( stack_context &);
-};
-#endif
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_SEGMENTED_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/setup.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_SETUP_H
+#define BOOST_COROUTINES_DETAIL_SETUP_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/move/move.hpp>
+#include <boost/type_traits/decay.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/coroutine/attributes.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename Fn >
+struct setup
+{
+    struct dummy {};
+
+    Fn                      fn;
+    coroutine_context   *   caller;
+    coroutine_context   *   callee;
+    attributes              attr;
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    setup( Fn fn_,
+           coroutine_context * caller_,
+           coroutine_context * callee_,
+           attributes const& attr_) :
+        fn( boost::forward< Fn >( fn_) ),
+        caller( caller_),
+        callee( callee_),
+        attr( attr_)
+    {}
+#endif
+    setup( BOOST_RV_REF( Fn) fn_,
+           coroutine_context * caller_,
+           coroutine_context * callee_,
+           attributes const& attr_,
+           typename disable_if<
+               is_same< typename decay< Fn >::type, setup >,
+               dummy*
+           >::type = 0) :
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn( fn_),
+#else
+        fn( boost::forward< Fn >( fn_) ),
+#endif
+        caller( caller_),
+        callee( callee_),
+        attr( attr_)
+    {}
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_SETUP_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/stack_tuple.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_STACK_TUPLE_H
-#define BOOST_COROUTINES_DETAIL_STACK_TUPLE_H
-
-#include <cstddef>
-
-#include <boost/config.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/stack_context.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename StackAllocator >
-struct stack_tuple
-{
-    coroutines::stack_context   stack_ctx;
-    StackAllocator              stack_alloc;
-
-    stack_tuple( StackAllocator const& stack_alloc_, std::size_t size) :
-        stack_ctx(),
-        stack_alloc( stack_alloc_)
-    { stack_alloc.allocate( stack_ctx, size); }
-
-    ~stack_tuple()
-    { stack_alloc.deallocate( stack_ctx); }
-};
-
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_STACK_TUPLE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/detail/standard_stack_allocator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_DETAIL_STANDARD_STACK_ALLOCATOR_H
-#define BOOST_COROUTINES_DETAIL_STANDARD_STACK_ALLOCATOR_H
-
-#include <cstddef>
-
-#include <boost/config.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-struct stack_context;
-
-namespace detail {
-
-class BOOST_COROUTINES_DECL standard_stack_allocator
-{
-public:
-    static bool is_stack_unbound();
-
-    static std::size_t default_stacksize();
-
-    static std::size_t minimum_stacksize();
-
-    static std::size_t maximum_stacksize();
-
-    void allocate( stack_context &, std::size_t);
-
-    void deallocate( stack_context &);
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_DETAIL_STANDARD_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_call.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,822 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H
+#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/move/move.hpp>
+#include <boost/utility/explicit_operator_bool.hpp>
+
+#include <boost/coroutine/attributes.hpp>
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_impl.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_object.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
+#include <boost/coroutine/stack_allocator.hpp>
+#include <boost/coroutine/stack_context.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename Arg >
+class symmetric_coroutine_call
+{
+private:
+    template< typename X >
+    friend class symmetric_coroutine_yield;
+
+    typedef symmetric_coroutine_impl< Arg >   impl_type;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+public:
+    typedef Arg                                value_type;
+    typedef symmetric_coroutine_yield< Arg >   yield_type;
+
+    symmetric_coroutine_call() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( yield_type &);
+
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, coroutine_fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename StackAllocator >
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, coroutine_fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+# endif
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#else
+    template< typename Fn >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#endif
+
+    ~symmetric_coroutine_call()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_call tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
+
+    void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    symmetric_coroutine_call & operator()( Arg arg) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->resume( arg);
+        return * this;
+    }
+};
+
+template< typename Arg >
+class symmetric_coroutine_call< Arg & >
+{
+private:
+    template< typename X >
+    friend class symmetric_coroutine_yield;
+
+    typedef symmetric_coroutine_impl< Arg & >     impl_type;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+public:
+    typedef Arg                                    value_type;
+    typedef symmetric_coroutine_yield< Arg & >     yield_type;
+
+    symmetric_coroutine_call() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( yield_type &);
+
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, coroutine_fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename StackAllocator >
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, coroutine_fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+# endif
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#else
+    template< typename Fn >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#endif
+
+    ~symmetric_coroutine_call()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_call tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
+
+    void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    symmetric_coroutine_call & operator()( Arg & arg) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->resume( arg);
+        return * this;
+    }
+};
+
+template<>
+class symmetric_coroutine_call< void >
+{
+private:
+    template< typename X >
+    friend class symmetric_coroutine_yield;
+
+    typedef symmetric_coroutine_impl< void >        impl_type;
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
+
+    struct dummy {};
+
+    impl_type       *   impl_;
+
+public:
+    typedef void                                     value_type;
+    typedef symmetric_coroutine_yield< void >        yield_type;
+
+    symmetric_coroutine_call() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+# ifdef BOOST_MSVC
+    typedef void ( * coroutine_fn)( yield_type &);
+
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, coroutine_fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename StackAllocator >
+    explicit symmetric_coroutine_call( coroutine_fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, coroutine_fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< coroutine_fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+# endif
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t(
+                    boost::forward< Fn >( fn), attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#else
+    template< typename Fn >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( Fn fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs = attributes(),
+                                       stack_allocator stack_alloc = stack_allocator() ) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+
+    template< typename Fn, typename StackAllocator >
+    explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
+                                       attributes const& attrs,
+                                       StackAllocator stack_alloc) :
+        impl_( 0)
+    {
+        // create a stack-context
+        stack_context stack_ctx;
+        // allocate the coroutine-stack
+        stack_alloc.allocate( stack_ctx, attrs.size);
+        BOOST_ASSERT( 0 < stack_ctx.sp);
+        // typedef of internal coroutine-type
+        typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
+        // reserve space on top of coroutine-stack for internal coroutine-type
+        stack_context internal_stack_ctx;
+        internal_stack_ctx.sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.sp);
+        internal_stack_ctx.size = stack_ctx.size - sizeof( object_t);
+        BOOST_ASSERT( 0 < internal_stack_ctx.size);
+        // placement new for internal coroutine
+        impl_ = new ( internal_stack_ctx.sp) object_t( fn, attrs, stack_ctx, internal_stack_ctx, stack_alloc); 
+        BOOST_ASSERT( impl_);
+    }
+#endif
+
+    ~symmetric_coroutine_call()
+    {
+        if ( 0 != impl_)
+        {
+            impl_->destroy();
+            impl_ = 0;
+        }
+    }
+
+    inline symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    inline symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_call tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    inline bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
+
+    inline void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    inline symmetric_coroutine_call & operator()() BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( * this);
+
+        impl_->resume();
+        return * this;
+    }
+};
+
+template< typename Arg >
+void swap( symmetric_coroutine_call< Arg > & l,
+           symmetric_coroutine_call< Arg > & r)
+{ l.swap( r); }
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,472 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H
+#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/coroutine_context.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/parameters.hpp>
+#include <boost/coroutine/detail/trampoline.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/stack_context.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename R >
+class symmetric_coroutine_impl : private noncopyable
+{
+public:
+    typedef parameters< R >                           param_type;
+
+    symmetric_coroutine_impl( stack_context const& stack_ctx,
+                              bool unwind, bool preserve_fpu) BOOST_NOEXCEPT :
+        flags_( 0),
+        caller_(),
+        callee_( trampoline< symmetric_coroutine_impl< R > >, stack_ctx)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~symmetric_coroutine_impl() {}
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            flags_ |= flag_running;
+            param_type to( unwind_t::force_unwind);
+            caller_.jump(
+                callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_running;
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void resume( R r) BOOST_NOEXCEPT
+    {
+        param_type to( const_cast< R * >( & r), this);
+        resume_( & to);
+    }
+
+    R * yield()
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ &= ~flag_running;
+        param_type to;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                    caller_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        BOOST_ASSERT( from->data);
+        return from->data;
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X > * other, X x)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( & x, other);
+        return yield_to_( other, & to);
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X & > * other, X & x)
+    {
+        typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
+        return yield_to_( other, & to);
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X > * other)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( other);
+        return yield_to_( other, & to);
+    }
+
+    virtual void run( R *) BOOST_NOEXCEPT = 0;
+
+    virtual void destroy() = 0;
+
+protected:
+    template< typename X >
+    friend class symmetric_coroutine_impl;
+
+    int                 flags_;
+    coroutine_context   caller_;
+    coroutine_context   callee_;
+
+    void resume_( param_type * to) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        caller_.jump(
+            callee_,
+            reinterpret_cast< intptr_t >( to),
+            preserve_fpu() );
+        flags_ &= ~flag_running;
+    }
+
+    template< typename Other >
+    R * yield_to_( Other * other, typename Other::param_type * to)
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+        BOOST_ASSERT( ! other->is_running() );
+        BOOST_ASSERT( ! other->is_complete() );
+
+        other->caller_ = caller_;
+        flags_ &= ~flag_running;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                    other->callee_,
+                    reinterpret_cast< intptr_t >( to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        BOOST_ASSERT( from->data);
+        return from->data;
+    }
+};
+
+template< typename R >
+class symmetric_coroutine_impl< R & > : private noncopyable
+{
+public:
+    typedef parameters< R & >                         param_type;
+
+    symmetric_coroutine_impl( stack_context const& stack_ctx,
+                              bool unwind, bool preserve_fpu) BOOST_NOEXCEPT :
+        flags_( 0),
+        caller_(),
+        callee_( trampoline< symmetric_coroutine_impl< R > >, stack_ctx)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~symmetric_coroutine_impl() {}
+
+    bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            flags_ |= flag_running;
+            param_type to( unwind_t::force_unwind);
+            caller_.jump(
+                callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_running;
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    void resume( R & arg) BOOST_NOEXCEPT
+    {
+        param_type to( & arg, this);
+        resume_( & to);
+    }
+
+    R * yield()
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ &= ~flag_running;
+        param_type to;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                    caller_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        BOOST_ASSERT( from->data);
+        return from->data;
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X > * other, X x)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( & x, other);
+        return yield_to_( other, & to);
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X & > * other, X & x)
+    {
+        typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
+        return yield_to_( other, & to);
+    }
+
+    template< typename X >
+    R * yield_to( symmetric_coroutine_impl< X > * other)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( other);
+        return yield_to_( other, & to);
+    }
+
+    virtual void run( R *) BOOST_NOEXCEPT = 0;
+
+    virtual void destroy() = 0;
+
+protected:
+    template< typename X >
+    friend class symmetric_coroutine_impl;
+
+    int                 flags_;
+    coroutine_context   caller_;
+    coroutine_context   callee_;
+
+    void resume_( param_type * to) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ |= flag_running;
+        caller_.jump(
+            callee_,
+            reinterpret_cast< intptr_t >( to),
+            preserve_fpu() );
+        flags_ &= ~flag_running;
+    }
+
+    template< typename Other >
+    R * yield_to_( Other * other, typename Other::param_type * to)
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+        BOOST_ASSERT( ! other->is_running() );
+        BOOST_ASSERT( ! other->is_complete() );
+
+        other->caller_ = caller_;
+        flags_ &= ~flag_running;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                    other->callee_,
+                    reinterpret_cast< intptr_t >( to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+        BOOST_ASSERT( from->data);
+        return from->data;
+    }
+};
+
+template<>
+class symmetric_coroutine_impl< void > : private noncopyable
+{
+public:
+    typedef parameters< void >                          param_type;
+
+    symmetric_coroutine_impl( stack_context const& stack_ctx,
+                              bool unwind, bool preserve_fpu) BOOST_NOEXCEPT :
+        flags_( 0),
+        caller_(),
+        callee_( trampoline_void< symmetric_coroutine_impl< void > >, stack_ctx)
+    {
+        if ( unwind) flags_ |= flag_force_unwind;
+        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
+    }
+
+    virtual ~symmetric_coroutine_impl() {}
+
+    inline bool force_unwind() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_force_unwind); }
+
+    inline bool unwind_requested() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_unwind_stack); }
+
+    inline bool preserve_fpu() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_preserve_fpu); }
+
+    inline bool is_started() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_started); }
+
+    inline bool is_running() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_running); }
+
+    inline bool is_complete() const BOOST_NOEXCEPT
+    { return 0 != ( flags_ & flag_complete); }
+
+    inline void unwind_stack() BOOST_NOEXCEPT
+    {
+        if ( is_started() && ! is_complete() && force_unwind() )
+        {
+            flags_ |= flag_unwind_stack;
+            flags_ |= flag_running;
+            param_type to( unwind_t::force_unwind);
+            caller_.jump(
+                callee_,
+                reinterpret_cast< intptr_t >( & to),
+                preserve_fpu() );
+            flags_ &= ~flag_running;
+            flags_ &= ~flag_unwind_stack;
+
+            BOOST_ASSERT( is_complete() );
+        }
+    }
+
+    inline void resume() BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        param_type to( this);
+        flags_ |= flag_running;
+        caller_.jump(
+            callee_,
+            reinterpret_cast< intptr_t >( & to),
+            preserve_fpu() );
+        flags_ &= ~flag_running;
+    }
+
+    inline void yield() BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+
+        flags_ &= ~flag_running;
+        param_type to;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                     caller_,
+                    reinterpret_cast< intptr_t >( & to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+    }
+
+    template< typename X >
+    void yield_to( symmetric_coroutine_impl< X > * other, X x)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( & x, other);
+        yield_to_( other, & to);
+    }
+
+    template< typename X >
+    void yield_to( symmetric_coroutine_impl< X & > * other, X & x)
+    {
+        typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
+        yield_to_( other, & to);
+    }
+
+    template< typename X >
+    void yield_to( symmetric_coroutine_impl< X > * other)
+    {
+        typename symmetric_coroutine_impl< X >::param_type to( other);
+        yield_to_( other, & to);
+    }
+
+    virtual void run() BOOST_NOEXCEPT = 0;
+
+    virtual void destroy() = 0;
+
+protected:
+    template< typename X >
+    friend class symmetric_coroutine_impl;
+
+    int                 flags_;
+    coroutine_context   caller_;
+    coroutine_context   callee_;
+
+    template< typename Other >
+    void yield_to_( Other * other, typename Other::param_type * to)
+    {
+        BOOST_ASSERT( is_running() );
+        BOOST_ASSERT( ! is_complete() );
+        BOOST_ASSERT( ! other->is_running() );
+        BOOST_ASSERT( ! other->is_complete() );
+
+        other->caller_ = caller_;
+        flags_ &= ~flag_running;
+        param_type * from(
+            reinterpret_cast< param_type * >(
+                callee_.jump(
+                    other->callee_,
+                    reinterpret_cast< intptr_t >( to),
+                    preserve_fpu() ) ) );
+        flags_ |= flag_running;
+        if ( from->do_unwind) throw forced_unwind();
+    }
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_object.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,281 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H
+#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/move/move.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_impl.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/stack_context.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+struct stack_context;
+
+namespace detail {
+
+template< typename R, typename Fn, typename StackAllocator >
+class symmetric_coroutine_object : public symmetric_coroutine_impl< R >
+{
+private:
+    typedef symmetric_coroutine_impl< R >                       impl_t;
+    typedef symmetric_coroutine_object< R, Fn, StackAllocator > obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    symmetric_coroutine_object( Fn fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run( R * r) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! impl_t::unwind_requested() );
+
+        impl_t::flags_ |= flag_started;
+        impl_t::flags_ |= flag_running;
+        try
+        {
+            symmetric_coroutine_yield< R > yc( this, r);
+            fn_( yc);
+        }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { std::terminate(); }
+
+        impl_t::flags_ |= flag_complete;
+        impl_t::flags_ &= ~flag_running;
+        typename impl_t::param_type to;
+        impl_t::callee_.jump(
+            impl_t::caller_, 
+            reinterpret_cast< intptr_t >( & to),
+            impl_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename R, typename Fn, typename StackAllocator >
+class symmetric_coroutine_object< R &, Fn, StackAllocator > : public symmetric_coroutine_impl< R & >
+{
+private:
+    typedef symmetric_coroutine_impl< R & >                         impl_t;
+    typedef symmetric_coroutine_object< R &, Fn, StackAllocator >   obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    symmetric_coroutine_object( Fn fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run( R * r) BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! impl_t::unwind_requested() );
+
+        impl_t::flags_ |= flag_started;
+        impl_t::flags_ |= flag_running;
+        try
+        {
+            symmetric_coroutine_yield< R & > yc( this, r);
+            fn_( yc);
+        }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { std::terminate(); }
+
+        impl_t::flags_ |= flag_complete;
+        impl_t::flags_ &= ~flag_running;
+        typename impl_t::param_type to;
+        impl_t::callee_.jump(
+            impl_t::caller_, 
+            reinterpret_cast< intptr_t >( & to),
+            impl_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+template< typename Fn, typename StackAllocator >
+class symmetric_coroutine_object< void, Fn, StackAllocator > : public symmetric_coroutine_impl< void >
+{
+private:
+    typedef symmetric_coroutine_impl< void >                        impl_t;
+    typedef symmetric_coroutine_object< void, Fn, StackAllocator >  obj_t;
+
+    Fn                  fn_;
+    stack_context       stack_ctx_;
+    StackAllocator      stack_alloc_;
+
+    static void deallocate_( obj_t * obj)
+    {
+        stack_context stack_ctx( obj->stack_ctx_);
+        StackAllocator stack_alloc( obj->stack_alloc_);
+        obj->unwind_stack();
+        obj->~obj_t();
+        stack_alloc.deallocate( stack_ctx);
+    }
+
+public:
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+    symmetric_coroutine_object( Fn fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+        fn_( fn),
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+#endif
+
+    symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
+                                stack_context const& stack_ctx,
+                                stack_context const& internal_stack_ctx,
+                                StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
+        impl_t( internal_stack_ctx,
+                stack_unwind == attrs.do_unwind,
+                fpu_preserved == attrs.preserve_fpu),
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        fn_( fn),
+#else
+        fn_( boost::forward< Fn >( fn) ),
+#endif
+        stack_ctx_( stack_ctx),
+        stack_alloc_( stack_alloc)
+    {}
+
+    void run() BOOST_NOEXCEPT
+    {
+        BOOST_ASSERT( ! impl_t::unwind_requested() );
+
+        impl_t::flags_ |= flag_started;
+        impl_t::flags_ |= flag_running;
+        try
+        {
+            symmetric_coroutine_yield< void > yc( this);
+            fn_( yc);
+        }
+        catch ( forced_unwind const&)
+        {}
+        catch (...)
+        { std::terminate(); }
+
+        impl_t::flags_ |= flag_complete;
+        impl_t::flags_ &= ~flag_running;
+        typename impl_t::param_type to;
+        impl_t::callee_.jump(
+            impl_t::caller_, 
+            reinterpret_cast< intptr_t >( & to),
+            impl_t::preserve_fpu() );
+        BOOST_ASSERT_MSG( false, "coroutine is complete");
+    }
+
+    void destroy()
+    { deallocate_( this); }
+};
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/symmetric_coroutine_yield.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,307 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H
+#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H
+
+#include <algorithm>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/move/move.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/utility/explicit_operator_bool.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/exceptions.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename R >
+class symmetric_coroutine_yield
+{
+private:
+    template< typename X, typename Y, typename Z >
+    friend class symmetric_coroutine_object;
+
+    typedef symmetric_coroutine_impl< R >       impl_type;
+
+    struct dummy {};
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
+
+    impl_type   *   impl_;
+    R           *   result_;
+
+    symmetric_coroutine_yield( impl_type * impl, R * result) BOOST_NOEXCEPT :
+        impl_( impl),
+        result_( result)
+    {
+        BOOST_ASSERT( 0 != impl_);
+        BOOST_ASSERT( 0 != result_);
+    }
+
+public:
+    symmetric_coroutine_yield() BOOST_NOEXCEPT :
+        impl_( 0),
+        result_( 0)
+    {}
+
+    symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
+        impl_( 0),
+        result_( 0)
+    { swap( other); }
+
+    symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_yield tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_; }
+
+    void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
+    {
+        std::swap( impl_, other.impl_);
+        std::swap( result_, other.result_);
+    }
+
+    symmetric_coroutine_yield & operator()()
+    {
+        result_ = impl_->yield();
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type x,
+                                            typename disable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        result_ = impl_->yield_to( other.impl_, x);
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other,
+                                            typename enable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        result_ = impl_->yield_to( other.impl_);
+        return * this;
+    }
+
+    R get() const
+    {
+        if ( 0 == result_)
+            boost::throw_exception(
+                invalid_result() );
+
+        return * result_; 
+    }
+};
+
+template< typename R >
+class symmetric_coroutine_yield< R & >
+{
+private:
+    template< typename X, typename Y, typename Z >
+    friend class symmetric_coroutine_object;
+
+    typedef symmetric_coroutine_impl< R & >     impl_type;
+
+    struct dummy {};
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
+
+    impl_type   *   impl_;
+    R           *   result_;
+
+    symmetric_coroutine_yield( impl_type * impl, R * result) BOOST_NOEXCEPT :
+        impl_( impl),
+        result_( result)
+    {
+        BOOST_ASSERT( 0 != impl_);
+        BOOST_ASSERT( 0 != result_);
+    }
+
+public:
+    symmetric_coroutine_yield() BOOST_NOEXCEPT :
+        impl_( 0),
+        result_( 0)
+    {}
+
+    symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
+        impl_( 0),
+        result_( 0)
+    { swap( other); }
+
+    symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_yield tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_; }
+
+    void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
+    {
+        std::swap( impl_, other.impl_);
+        std::swap( result_, other.result_);
+    }
+
+    symmetric_coroutine_yield & operator()()
+    {
+        result_ = impl_->yield();
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type & x,
+                                            typename disable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        result_ = impl_->yield_to( other.impl_, x);
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other,
+                                            typename enable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        result_ = impl_->yield_to( other.impl_);
+        return * this;
+    }
+
+    R & get() const
+    {
+        if ( 0 == result_)
+            boost::throw_exception(
+                invalid_result() );
+
+        return * result_; 
+    }
+};
+
+template<>
+class symmetric_coroutine_yield< void >
+{
+private:
+    template< typename X, typename Y, typename Z >
+    friend class symmetric_coroutine_object;
+
+    typedef symmetric_coroutine_impl< void >    impl_type;
+
+    struct dummy {};
+
+    BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
+
+    impl_type   *   impl_;
+
+    symmetric_coroutine_yield( impl_type * impl) BOOST_NOEXCEPT :
+        impl_( impl)
+    { BOOST_ASSERT( 0 != impl_); }
+
+public:
+    symmetric_coroutine_yield() BOOST_NOEXCEPT :
+        impl_( 0)
+    {}
+
+    symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
+        impl_( 0)
+    { swap( other); }
+
+    symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
+    {
+        symmetric_coroutine_yield tmp( boost::move( other) );
+        swap( tmp);
+        return * this;
+    }
+
+    BOOST_EXPLICIT_OPERATOR_BOOL();
+
+    inline bool operator!() const BOOST_NOEXCEPT
+    { return 0 == impl_; }
+
+    inline void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
+    { std::swap( impl_, other.impl_); }
+
+    inline symmetric_coroutine_yield & operator()()
+    {
+        impl_->yield();
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type & x,
+                                            typename disable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        impl_->yield_to( other.impl_, x);
+        return * this;
+    }
+
+    template< typename Coro >
+    symmetric_coroutine_yield & operator()( Coro & other,
+                                            typename enable_if<
+                                                is_same< typename Coro::value_type, void >,
+                                                dummy*
+                                            >::type = 0)
+    {
+        BOOST_ASSERT( other);
+
+        impl_->yield_to( other.impl_);
+        return * this;
+    }
+};
+
+template< typename R >
+void swap( symmetric_coroutine_yield< R > & l, symmetric_coroutine_yield< R > & r)
+{ l.swap( r); }
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/trampoline_pull.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H
+#define BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename Coro >
+void trampoline_pull( intptr_t vp)
+{
+    typedef typename Coro::param_type   param_type;
+
+    BOOST_ASSERT( 0 != vp);
+
+    param_type * param(
+        reinterpret_cast< param_type * >( vp) );
+    BOOST_ASSERT( 0 != param);
+
+    Coro * coro(
+        reinterpret_cast< Coro * >( param->coro) );
+    BOOST_ASSERT( 0 != coro);
+
+    coro->run();
+}
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/detail/trampoline_push.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,77 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H
+#define BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H
+
+#include <cstddef>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/move/move.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/detail/flags.hpp>
+#include <boost/coroutine/detail/parameters.hpp>
+#include <boost/coroutine/detail/setup.hpp>
+#include <boost/coroutine/detail/setup.hpp>
+#include <boost/coroutine/exceptions.hpp>
+#include <boost/coroutine/flags.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+namespace detail {
+
+template< typename Coro >
+void trampoline_push( intptr_t vp)
+{
+    typedef typename Coro::param_type   param_type;
+
+    BOOST_ASSERT( vp);
+
+    param_type * param(
+        reinterpret_cast< param_type * >( vp) );
+    BOOST_ASSERT( 0 != param);
+    BOOST_ASSERT( 0 != param->data);
+
+    Coro * coro(
+        reinterpret_cast< Coro * >( param->coro) );
+    BOOST_ASSERT( 0 != coro);
+
+    coro->run( param->data);
+}
+
+template< typename Coro >
+void trampoline_push_void( intptr_t vp)
+{
+    typedef typename Coro::param_type   param_type;
+
+    BOOST_ASSERT( vp);
+
+    param_type * param(
+        reinterpret_cast< param_type * >( vp) );
+    BOOST_ASSERT( 0 != param);
+
+    Coro * coro(
+        reinterpret_cast< Coro * >( param->coro) );
+    BOOST_ASSERT( 0 != coro);
+
+    coro->run();
+}
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/posix/protected_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,105 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
+#define BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
+
+extern "C" {
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <unistd.h>
+}
+
+#if defined(BOOST_USE_VALGRIND)
+#include <valgrind/valgrind.h>
+#endif
+
+#include <cmath>
+#include <cstddef>
+#include <new>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/stack_context.hpp>
+#include <boost/coroutine/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+template< typename traitsT >
+struct basic_protected_stack_allocator
+{
+    typedef traitsT traits_type;
+
+    void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
+    {
+        BOOST_ASSERT( traits_type::minimum_size() <= size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
+
+        // page at bottom will be used as guard-page
+        const std::size_t pages(
+            static_cast< std::size_t >( 
+                std::floor(
+                    static_cast< float >( size) / traits_type::page_size() ) ) );
+        BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
+        const std::size_t size_( pages * traits_type::page_size() );
+        BOOST_ASSERT( 0 < size && 0 < size_);
+        BOOST_ASSERT( size_ <= size);
+
+        // conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
+#if defined(MAP_ANON)
+        void * limit = ::mmap( 0, size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+#else
+        void * limit = ::mmap( 0, size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+#endif
+        if ( MAP_FAILED == limit) throw std::bad_alloc();
+
+        // conforming to POSIX.1-2001
+#if defined(BOOST_DISABLE_ASSERTS)
+        ::mprotect( limit, traits_type::page_size(), PROT_NONE);
+#else
+        const int result( ::mprotect( limit, traits_type::page_size(), PROT_NONE) );
+        BOOST_ASSERT( 0 == result);
+#endif
+
+        ctx.size = size_;
+        ctx.sp = static_cast< char * >( limit) + ctx.size;
+#if defined(BOOST_USE_VALGRIND)
+        ctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( ctx.sp, limit);
+#endif
+    }
+
+    void deallocate( stack_context & ctx)
+    {
+        BOOST_ASSERT( ctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
+
+#if defined(BOOST_USE_VALGRIND)
+        VALGRIND_STACK_DEREGISTER( ctx.valgrind_stack_id);
+#endif
+        void * limit = static_cast< char * >( ctx.sp) - ctx.size;
+        // conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
+        ::munmap( limit, ctx.size);
+    }
+};
+
+typedef basic_protected_stack_allocator< stack_traits > protected_stack_allocator;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/posix/segmented_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,69 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H
+#define BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H
+
+#include <cstddef>
+#include <new>
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/stack_context.hpp>
+#include <boost/coroutine/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+// forward declaration for splitstack-functions defined in libgcc
+extern "C" {
+void *__splitstack_makecontext( std::size_t,
+                                void * [BOOST_COROUTINES_SEGMENTS],
+                                std::size_t *);
+
+void __splitstack_releasecontext( void * [BOOST_COROUTINES_SEGMENTS]);
+
+void __splitstack_resetcontext( void * [BOOST_COROUTINES_SEGMENTS]);
+
+void __splitstack_block_signals_context( void * [BOOST_COROUTINES_SEGMENTS],
+                                         int * new_value, int * old_value);
+}
+
+namespace boost {
+namespace coroutines {
+
+template< typename traitsT >
+struct basic_segmented_stack_allocator
+{
+    typedef traitsT traits_type;
+
+    void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
+    {
+        void * limit = __splitstack_makecontext( size, ctx.segments_ctx, & ctx.size);
+        if ( ! limit) throw std::bad_alloc();
+
+        // ctx.size is already filled by __splitstack_makecontext
+        ctx.sp = static_cast< char * >( limit) + ctx.size;
+
+        int off = 0;
+        __splitstack_block_signals_context( ctx.segments_ctx, & off, 0);
+    }
+
+    void deallocate( stack_context & ctx)
+    { __splitstack_releasecontext( ctx.segments_ctx); }
+};
+
+typedef basic_segmented_stack_allocator< stack_traits > segmented_stack_allocator;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/protected_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,13 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_WINDOWS)
+# include <boost/coroutine/windows/protected_stack_allocator.hpp>
+#else
+# include <boost/coroutine/posix/protected_stack_allocator.hpp>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/segmented_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_USE_SEGMENTED_STACKS)
+# if defined(BOOST_WINDOWS)
+#  error "segmented stacks are not supported by Windows"
+# else
+#  include <boost/coroutine/posix/segmented_stack_allocator.hpp>
+# endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/stack_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_STACK_TRAITS_H
+#define BOOST_COROUTINES_STACK_TRAITS_H
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+struct BOOST_COROUTINES_DECL stack_traits
+{
+    static bool is_unbounded() BOOST_NOEXCEPT;
+
+    static std::size_t page_size() BOOST_NOEXCEPT;
+
+    static std::size_t default_size() BOOST_NOEXCEPT;
+
+    static std::size_t minimum_size() BOOST_NOEXCEPT;
+
+    static std::size_t maximum_size() BOOST_NOEXCEPT;
+};
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_STACK_TRAITS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/standard_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H
+#define BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H
+
+#if defined(BOOST_USE_VALGRIND)
+#include <valgrind/valgrind.h>
+#endif
+
+#include <cstddef>
+#include <cstdlib>
+#include <new>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/stack_context.hpp>
+#include <boost/coroutine/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+template< typename traitsT >
+struct basic_standard_stack_allocator
+{
+    typedef traitsT traits_type;
+
+    void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
+    {
+        BOOST_ASSERT( traits_type::minimum_size() <= size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
+
+        void * limit = std::malloc( size);
+        if ( ! limit) throw std::bad_alloc();
+
+        ctx.size = size;
+        ctx.sp = static_cast< char * >( limit) + ctx.size;
+#if defined(BOOST_USE_VALGRIND)
+        ctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( ctx.sp, limit);
+#endif
+    }
+
+    void deallocate( stack_context & ctx)
+    {
+        BOOST_ASSERT( ctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
+
+#if defined(BOOST_USE_VALGRIND)
+        VALGRIND_STACK_DEREGISTER( ctx.valgrind_stack_id);
+#endif
+
+        void * limit = static_cast< char * >( ctx.sp) - ctx.size;
+        std::free( limit);
+    }
+};
+
+typedef basic_standard_stack_allocator< stack_traits >  standard_stack_allocator;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/symmetric_coroutine.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_SYMMETRIC_COROUTINE_H
+#define BOOST_COROUTINES_SYMMETRIC_COROUTINE_H
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/symmetric_coroutine_call.hpp>
+#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+template< typename T >
+struct symmetric_coroutine
+{
+    typedef detail::symmetric_coroutine_call< T >   call_type;
+    typedef detail::symmetric_coroutine_yield< T >  yield_type;
+};
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_SYMMETRIC_COROUTINE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/coroutine.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1430 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_COROUTINE_H
-#define BOOST_COROUTINES_OLD_COROUTINE_H
-
-#include <cstddef>
-#include <memory>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/move/move.hpp>
-#include <boost/range.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/decay.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/utility/result_of.hpp>
-
-#include <boost/coroutine/attributes.hpp>
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/stack_allocator.hpp>
-#include <boost/coroutine/v1/detail/arg.hpp>
-#include <boost/coroutine/v1/detail/coroutine_base.hpp>
-#include <boost/coroutine/v1/detail/coroutine_caller.hpp>
-#include <boost/coroutine/v1/detail/coroutine_get.hpp>
-#include <boost/coroutine/v1/detail/coroutine_object.hpp>
-#include <boost/coroutine/v1/detail/coroutine_op.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename Signature,
-    template< class, int > class C,
-    typename Result = typename function_traits< Signature >::result_type,
-    int arity = function_traits< Signature >::arity
->
-struct caller;
-
-template<
-    typename Signature,
-    template< class, int > class C
->
-struct caller< Signature, C, void, 0 >
-{ typedef C< void(), 0 > type; };
-
-template<
-    typename Signature,
-    template< class, int > class C,
-    typename Result
->
-struct caller< Signature, C, Result, 0 >
-{ typedef C< void( Result), 1 > type; };
-
-template<
-    typename Signature,
-    template< class, int > class C,
-    int arity
->
-struct caller< Signature, C, void, arity >
-{ typedef C< typename detail::arg< Signature >::type(), 0 > type; };
-
-template<
-    typename Signature,
-    template< class, int > class C,
-    typename Result, int arity
->
-struct caller
-{ typedef C< typename detail::arg< Signature >::type( Result), 1 > type; };
-
-}
-
-template< typename Signature, int arity = function_traits< Signature >::arity >
-class coroutine;
-
-template< typename Signature >
-class coroutine< Signature, 0 > : public detail::coroutine_op<
-                                        Signature,
-                                        coroutine< Signature >,
-                                        typename function_traits< Signature >::result_type,
-                                        function_traits< Signature >::arity
-                                  >,
-                                  public detail::coroutine_get<
-                                        coroutine< Signature >,
-                                        typename function_traits< Signature >::result_type,
-                                        function_traits< Signature >::arity
-                                  >
-{
-private:
-    typedef detail::coroutine_base< Signature >                 base_t;
-    typedef typename base_t::ptr_t                              ptr_t;
-
-    template< typename X, typename Y, int >
-    friend struct detail::coroutine_get;
-    template< typename X, typename Y, typename Z, int >
-    friend struct detail::coroutine_op;
-    template< typename X, typename Y, typename Z, typename A, typename B, typename C, int >
-    friend class detail::coroutine_object;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( coroutine)
-
-    template< typename Allocator >
-    coroutine( detail::coroutine_context const& callee,
-               bool unwind, bool preserve_fpu,
-               Allocator const& alloc) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_caller<
-                Signature, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    typedef typename detail::caller<
-            Signature,
-            boost::coroutines::coroutine
-    >::type                                                     caller_type;
-
-    coroutine() BOOST_NOEXCEPT :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( caller_type &);
-
-    explicit coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >() ) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator >
-    explicit coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >() ) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-       typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator, typename Allocator >
-    explicit coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-#endif
-    template< typename Fn >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-#else
-    template< typename Fn >
-    explicit coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-#endif
-
-    coroutine( BOOST_RV_REF( coroutine) other) BOOST_NOEXCEPT :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    { swap( other); }
-
-    coroutine & operator=( BOOST_RV_REF( coroutine) other) BOOST_NOEXCEPT
-    {
-        coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-};
-
-template< typename Signature, int arity >
-class coroutine : public detail::coroutine_op<
-                        Signature,
-                        coroutine< Signature >,
-                        typename function_traits< Signature >::result_type,
-                        function_traits< Signature >::arity
-                  >,
-                  public detail::coroutine_get<
-                        coroutine< Signature >,
-                        typename function_traits< Signature >::result_type,
-                        function_traits< Signature >::arity
-                  >
-{
-private:
-    typedef detail::coroutine_base< Signature >                 base_t;
-    typedef typename base_t::ptr_t                              ptr_t;
-
-    template< typename X, typename Y, int >
-    friend struct detail::coroutine_get;
-    template< typename X, typename Y, typename Z, int >
-    friend struct detail::coroutine_op;
-    template< typename X, typename Y, typename Z, typename A, typename B, typename C, int >
-    friend class detail::coroutine_object;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( coroutine)
-
-    template< typename Allocator >
-    coroutine( detail::coroutine_context const& callee,
-               bool unwind, bool preserve_fpu,
-               Allocator const& alloc) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_caller<
-                Signature, Allocator
-            >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    typedef typename detail::caller<
-        Signature,
-        boost::coroutines::coroutine
-    >::type                                                     caller_type;
-    typedef typename detail::arg< Signature >::type             arguments;
-
-    coroutine() BOOST_NOEXCEPT :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( caller_type &);
-
-    explicit coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >() ) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    explicit coroutine( coroutine_fn fn, arguments arg, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >() ) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-       typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), arg, attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator >
-    explicit coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >() ) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator, typename Allocator >
-    explicit coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-        typedef detail::coroutine_object<
-                Signature,
-                coroutine_fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-        >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-#endif
-    template< typename Fn >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, arguments arg, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), arg, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, arguments arg, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), arg, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, arguments arg, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), arg, attr, stack_alloc, a) );
-    }
-#else
-    template< typename Fn >
-    explicit coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit coroutine( Fn fn, arguments arg, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, arg, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, stack_allocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< coroutine > const& alloc =
-                    std::allocator< coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, std::allocator< coroutine >,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, coroutine >,
-                   dummy *
-               >::type = 0) :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    {
-//      BOOST_STATIC_ASSERT((
-//          is_same< void, typename result_of< Fn() >::type >::value));
-        typedef detail::coroutine_object<
-                Signature,
-                Fn, StackAllocator, Allocator,
-                caller_type,
-                typename function_traits< Signature >::result_type,
-                function_traits< Signature >::arity
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-#endif
-
-    coroutine( BOOST_RV_REF( coroutine) other) BOOST_NOEXCEPT :
-        detail::coroutine_op<
-            Signature,
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        detail::coroutine_get<
-            coroutine< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        impl_()
-    { swap( other); }
-
-    coroutine & operator=( BOOST_RV_REF( coroutine) other) BOOST_NOEXCEPT
-    {
-        coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-};
-
-template< typename Signature >
-void swap( coroutine< Signature > & l, coroutine< Signature > & r) BOOST_NOEXCEPT
-{ l.swap( r); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::iterator
-range_begin( coroutine< Signature > & c)
-{ return typename coroutine< Signature >::iterator( & c); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::const_iterator
-range_begin( coroutine< Signature > const& c)
-{ return typename coroutine< Signature >::const_iterator( & c); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::iterator
-range_end( coroutine< Signature > &)
-{ return typename coroutine< Signature >::iterator(); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::const_iterator
-range_end( coroutine< Signature > const&)
-{ return typename coroutine< Signature >::const_iterator(); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::iterator
-begin( coroutine< Signature > & c)
-{ return boost::begin( c); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::iterator
-end( coroutine< Signature > & c)
-{ return boost::end( c); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::const_iterator
-begin( coroutine< Signature > const& c)
-{ return boost::const_begin( c); }
-
-template< typename Signature >
-inline
-typename coroutine< Signature >::const_iterator
-end( coroutine< Signature > const& c)
-{ return boost::const_end( c); }
-
-}
-
-template< typename Signature >
-struct range_mutable_iterator< coroutines::coroutine< Signature > >
-{ typedef typename coroutines::coroutine< Signature >::iterator type; };
-
-template< typename Signature >
-struct range_const_iterator< coroutines::coroutine< Signature > >
-{ typedef typename coroutines::coroutine< Signature >::const_iterator type; };
-
-}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_COROUTINE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/arg.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_ARG_H
-#define BOOST_COROUTINES_OLD_DETAIL_ARG_H
-
-#include <boost/config.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
-#include <boost/tuple/tuple.hpp>
-#include <boost/type_traits/function_traits.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename Signature,
-    int arity = function_traits< Signature >::arity >
-struct arg;
-
-template< typename Signature >
-struct arg< Signature, 1 >
-{
-    typedef typename function_traits< Signature >::arg1_type    type;
-};
-
-#define BOOST_CONTEXT_TUPLE_COMMA(n) BOOST_PP_COMMA_IF(BOOST_PP_SUB(n,1))
-#define BOOST_CONTEXT_TUPLE_TYPE(z,n,unused) \
-    BOOST_CONTEXT_TUPLE_COMMA(n) typename function_traits< Signature >::BOOST_PP_CAT(BOOST_PP_CAT(arg,n),_type)
-#define BOOST_CONTEXT_TUPLE_TYPES(n) BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(n,1),BOOST_CONTEXT_TUPLE_TYPE,~)
-#define BOOST_CONTEXT_TUPLE(z,n,unused) \
-template< typename Signature > \
-struct arg< Signature, n > \
-{ \
-    typedef tuple< BOOST_CONTEXT_TUPLE_TYPES(n) >   type; \
-};
-BOOST_PP_REPEAT_FROM_TO(2,11,BOOST_CONTEXT_TUPLE,~)
-#undef BOOST_CONTEXT_TUPLE
-#undef BOOST_CONTEXT_TUPLE_TYPES
-#undef BOOST_CONTEXT_TUPLE_TYPE
-#undef BOOST_CONTEXT_TUPLE_COMMA
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_ARG_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_base.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,125 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_BASE_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_BASE_H
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-#include <boost/coroutine/v1/detail/coroutine_base_resume.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-struct stack_context;
-
-namespace detail {
-
-template< typename Signature >
-class coroutine_base : private noncopyable,
-                       public coroutine_base_resume<
-                            Signature,
-                            coroutine_base< Signature >,
-                            typename function_traits< Signature >::result_type,
-                            function_traits< Signature >::arity
-                       >
-{
-public:
-    typedef intrusive_ptr< coroutine_base >     ptr_t;
-
-private:
-    template< typename X, typename Y, typename Z, int >
-    friend class coroutine_base_resume;
-    template< typename X, typename Y, typename Z, typename A, typename B, typename C, int >
-    friend class coroutine_object;
-
-    unsigned int        use_count_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-    int                 flags_;
-    exception_ptr       except_;
-
-protected:
-    virtual void deallocate_object() = 0;
-
-public:
-    coroutine_base( coroutine_context::ctx_fn fn, stack_context * stack_ctx,
-                    bool unwind, bool preserve_fpu) :
-        coroutine_base_resume<
-            Signature,
-            coroutine_base< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        use_count_( 0),
-        caller_(),
-        callee_( fn, stack_ctx),
-        flags_( 0),
-        except_()
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    coroutine_base( coroutine_context const& callee, bool unwind, bool preserve_fpu) :
-        coroutine_base_resume<
-            Signature,
-            coroutine_base< Signature >,
-            typename function_traits< Signature >::result_type,
-            function_traits< Signature >::arity
-        >(),
-        use_count_( 0),
-        caller_(),
-        callee_( callee),
-        flags_( 0),
-        except_()
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_COROUTINE_BASE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_base_resume.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_BASE_RESUME_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_BASE_RESUME_H
-
-#include <iterator>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/optional.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
-#include <boost/range.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/detail/holder.hpp>
-#include <boost/coroutine/v1/detail/arg.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename Signature, typename D, typename Result, int arity >
-class coroutine_base_resume;
-
-template< typename Signature, typename D >
-class coroutine_base_resume< Signature, D, void, 0 >
-{
-public:
-    void resume()
-    {
-        holder< void > hldr_to( & static_cast< D * >( this)->caller_);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                hldr_to.ctx->jump(
-                    static_cast< D * >( this)->callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    static_cast< D * >( this)->preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( static_cast< D * >( this)->except_)
-            rethrow_exception( static_cast< D * >( this)->except_);
-    }
-};
-
-template< typename Signature, typename D, typename Result >
-class coroutine_base_resume< Signature, D, Result, 0 >
-{
-public:
-    void resume()
-    {
-        BOOST_ASSERT( static_cast< D * >( this));
-        BOOST_ASSERT( ! static_cast< D * >( this)->is_complete() );
-
-        holder< void > hldr_to( & static_cast< D * >( this)->caller_);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                hldr_to.ctx->jump(
-                    static_cast< D * >( this)->callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    static_cast< D * >( this)->preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx;
-        result_ = hldr_from->data;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( static_cast< D * >( this)->except_)
-            rethrow_exception( static_cast< D * >( this)->except_);
-    }
-
-protected:
-    template< typename X, typename Y, int >
-    friend struct coroutine_get;
-
-    optional< Result >  result_;
-};
-
-template< typename Signature, typename D >
-class coroutine_base_resume< Signature, D, void, 1 >
-{
-public:
-    typedef typename arg< Signature >::type     arg_type;
-
-    void resume( arg_type a1)
-    {
-        BOOST_ASSERT( static_cast< D * >( this));
-        BOOST_ASSERT( ! static_cast< D * >( this)->is_complete() );
-
-        holder< arg_type > hldr_to( & static_cast< D * >( this)->caller_, a1);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                hldr_to.ctx->jump(
-                    static_cast< D * >( this)->callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    static_cast< D * >( this)->preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( static_cast< D * >( this)->except_)
-            rethrow_exception( static_cast< D * >( this)->except_);
-    }
-};
-
-template< typename Signature, typename D, typename Result >
-class coroutine_base_resume< Signature, D, Result, 1 >
-{
-public:
-    typedef typename arg< Signature >::type     arg_type;
-
-    void resume( arg_type a1)
-    {
-        BOOST_ASSERT( static_cast< D * >( this));
-        BOOST_ASSERT( ! static_cast< D * >( this)->is_complete() );
-
-        coroutine_context caller;
-        holder< arg_type > hldr_to( & static_cast< D * >( this)->caller_, a1);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                hldr_to.ctx->jump(
-                    static_cast< D * >( this)->callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    static_cast< D * >( this)->preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx;
-        result_ = hldr_from->data;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( static_cast< D * >( this)->except_)
-            rethrow_exception( static_cast< D * >( this)->except_);
-    }
-
-protected:
-    template< typename X, typename Y, int >
-    friend struct coroutine_get;
-
-    optional< Result >  result_;
-};
-
-#define BOOST_COROUTINE_BASE_RESUME_COMMA(n) BOOST_PP_COMMA_IF(BOOST_PP_SUB(n,1))
-#define BOOST_COROUTINE_BASE_RESUME_VAL(z,n,unused) BOOST_COROUTINE_BASE_RESUME_COMMA(n) BOOST_PP_CAT(a,n)
-#define BOOST_COROUTINE_BASE_RESUME_VALS(n) BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(n,1),BOOST_COROUTINE_BASE_RESUME_VAL,~)
-#define BOOST_COROUTINE_BASE_RESUME_ARG_TYPE(n) \
-    typename function_traits< Signature >::BOOST_PP_CAT(BOOST_PP_CAT(arg,n),_type)
-#define BOOST_COROUTINE_BASE_RESUME_ARG(z,n,unused) BOOST_COROUTINE_BASE_RESUME_COMMA(n) BOOST_COROUTINE_BASE_RESUME_ARG_TYPE(n) BOOST_PP_CAT(a,n)
-#define BOOST_COROUTINE_BASE_RESUME_ARGS(n) BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(n,1),BOOST_COROUTINE_BASE_RESUME_ARG,~)
-#define BOOST_COROUTINE_BASE_RESUME(z,n,unused) \
-template< typename Signature, typename D > \
-class coroutine_base_resume< Signature, D, void, n > \
-{ \
-public: \
-    typedef typename arg< Signature >::type     arg_type; \
-\
-    void resume( BOOST_COROUTINE_BASE_RESUME_ARGS(n)) \
-    { \
-        BOOST_ASSERT( static_cast< D * >( this)); \
-        BOOST_ASSERT( ! static_cast< D * >( this)->is_complete() ); \
-\
-        holder< arg_type > hldr_to( \
-            & static_cast< D * >( this)->caller_, \
-            arg_type(BOOST_COROUTINE_BASE_RESUME_VALS(n) ) ); \
-        holder< void > * hldr_from( \
-            reinterpret_cast< holder< void > * >( \
-                hldr_to.ctx->jump( \
-                    static_cast< D * >( this)->callee_, \
-                    reinterpret_cast< intptr_t >( & hldr_to), \
-                    static_cast< D * >( this)->preserve_fpu() ) ) ); \
-        BOOST_ASSERT( hldr_from->ctx); \
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx; \
-        if ( hldr_from->force_unwind) throw forced_unwind(); \
-        if ( static_cast< D * >( this)->except_) \
-            rethrow_exception( static_cast< D * >( this)->except_); \
-    } \
-}; \
-\
-template< typename Signature, typename D, typename Result > \
-class coroutine_base_resume< Signature, D, Result, n > \
-{ \
-public: \
-    typedef typename arg< Signature >::type     arg_type; \
-\
-    void resume( BOOST_COROUTINE_BASE_RESUME_ARGS(n)) \
-    { \
-        BOOST_ASSERT( static_cast< D * >( this)); \
-        BOOST_ASSERT( ! static_cast< D * >( this)->is_complete() ); \
-\
-        holder< arg_type > hldr_to( \
-            & static_cast< D * >( this)->caller_, \
-            arg_type(BOOST_COROUTINE_BASE_RESUME_VALS(n) ) ); \
-        holder< Result > * hldr_from( \
-            reinterpret_cast< holder< Result > * >( \
-                hldr_to.ctx->jump( \
-                    static_cast< D * >( this)->callee_, \
-                    reinterpret_cast< intptr_t >( & hldr_to), \
-                    static_cast< D * >( this)->preserve_fpu() ) ) ); \
-        BOOST_ASSERT( hldr_from->ctx); \
-        static_cast< D * >( this)->callee_ = * hldr_from->ctx; \
-        result_ = hldr_from->data; \
-        if ( hldr_from->force_unwind) throw forced_unwind(); \
-        if ( static_cast< D * >( this)->except_) \
-            rethrow_exception( static_cast< D * >( this)->except_); \
-    } \
-\
-protected: \
-    template< typename X, typename Y, int > \
-    friend struct coroutine_get; \
-\
-    optional< Result >  result_; \
-};
-BOOST_PP_REPEAT_FROM_TO(2,11,BOOST_COROUTINE_BASE_RESUME,~)
-#undef BOOST_COROUTINE_BASE_RESUME
-#undef BOOST_COROUTINE_BASE_RESUME_ARGS
-#undef BOOST_COROUTINE_BASE_RESUME_ARG
-#undef BOOST_COROUTINE_BASE_RESUME_ARG_TYPE
-#undef BOOST_COROUTINE_BASE_RESUME_VALS
-#undef BOOST_COROUTINE_BASE_RESUME_VAL
-#undef BOOST_COROUTINE_BASE_RESUME_COMMA
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_coroutine_base_resume_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_caller.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_CALLER_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_CALLER_H
-
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/v1/detail/coroutine_base.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename Signature, typename Allocator >
-class coroutine_caller : public  coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_caller< Signature, Allocator >
-    >::other   allocator_t;
-
-    coroutine_caller( coroutine_context const& callee, bool unwind, bool preserve_fpu,
-                    allocator_t const& alloc) BOOST_NOEXCEPT :
-        coroutine_base< Signature >( callee, unwind, preserve_fpu),
-        alloc_( alloc)
-    {}
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-
-private:
-    allocator_t   alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_caller * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_COROUTINE_CALLER_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_get.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_GET_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_GET_H
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/type_traits/function_traits.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/param.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename D,
-    typename Result, int arity
->
-struct coroutine_get;
-
-template< typename D, int arity >
-struct coroutine_get< D, void, arity >
-{};
-
-template< typename D, typename Result, int arity >
-struct coroutine_get
-{
-    bool has_result() const
-    { return static_cast< D const* >( this)->impl_->result_; }
-
-    typename param< Result >::type get() const
-    {
-        BOOST_ASSERT( static_cast< D const* >( this)->impl_->result_);
-        return static_cast< D const* >( this)->impl_->result_.get();
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_COROUTINE_GET_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OBJECT_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OBJECT_H
-
-#include <cstddef>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/move/move.hpp>
-#include <boost/ref.hpp>
-#include <boost/tuple/tuple.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/attributes.hpp>
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-#include <boost/coroutine/detail/holder.hpp>
-#include <boost/coroutine/detail/param.hpp>
-#include <boost/coroutine/detail/stack_tuple.hpp>
-#include <boost/coroutine/detail/trampoline.hpp>
-#include <boost/coroutine/flags.hpp>
-#include <boost/coroutine/stack_context.hpp>
-#include <boost/coroutine/stack_context.hpp>
-#include <boost/coroutine/v1/detail/arg.hpp>
-#include <boost/coroutine/v1/detail/coroutine_base.hpp>
-
-#ifdef BOOST_MSVC
- #pragma warning (push)
- #pragma warning (disable: 4355) // using 'this' in initializer list
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result, int arity
->
-class coroutine_object;
-
-#include <boost/coroutine/v1/detail/coroutine_object_void_0.ipp>
-#include <boost/coroutine/v1/detail/coroutine_object_void_1.ipp>
-#include <boost/coroutine/v1/detail/coroutine_object_void_arity.ipp>
-#include <boost/coroutine/v1/detail/coroutine_object_result_0.ipp>
-#include <boost/coroutine/v1/detail/coroutine_object_result_1.ipp>
-#include <boost/coroutine/v1/detail/coroutine_object_result_arity.ipp>
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#ifdef BOOST_MSVC
- #pragma warning (pop)
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OBJECT_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_0.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,363 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, Fn, StackAllocator, Allocator, Caller, Result, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 0
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 0
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 0
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( & this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_1.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,557 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, Fn, StackAllocator, Allocator, Caller, Result, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_( arg); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( Fn fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( const reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_result_arity.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,559 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result, int arity
->
-class coroutine_object :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_( arg); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( Fn fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result, int arity
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, arity > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    typename Result, int arity
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, Result, arity > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, Result, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< Result > * hldr_from(
-            reinterpret_cast< holder< Result > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( const reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            {
-                fn_( c);
-            }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Result > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_0.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,357 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, Fn, StackAllocator, Allocator, Caller, void, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 0
-        >
-    >::other                                        allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >           pbase_type;
-    typedef coroutine_base< Signature >             base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->pbase_type::stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 0
-        >
-    >::other                                        allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >           pbase_type;
-    typedef coroutine_base< Signature >             base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, 0 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 0
-        >
-    >::other                                        allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >           pbase_type;
-    typedef coroutine_base< Signature >             base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object const&);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_1.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,550 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, Fn, StackAllocator, Allocator, Caller, void, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_( arg); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( Fn fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( reference_wrapper< Fn > fn,
-                      typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, 1 > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, 1
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( const reference_wrapper< Fn > fn,
-                      typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_object_void_arity.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,551 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    int arity
->
-class coroutine_object< Signature, Fn, StackAllocator, Allocator, Caller, void, arity > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_( arg); }
-#else
-    coroutine_object( Fn fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( Fn fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( BOOST_RV_REF( Fn) fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-#endif
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    int arity
->
-class coroutine_object< Signature, reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, arity > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Signature,
-    typename Fn, typename StackAllocator, typename Allocator,
-    typename Caller,
-    int arity
->
-class coroutine_object< Signature, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller, void, arity > :
-    private stack_tuple< StackAllocator >,
-    public coroutine_base< Signature >
-{
-public:
-    typedef typename Allocator::template rebind<
-        coroutine_object<
-            Signature, Fn, StackAllocator, Allocator, Caller, void, arity
-        >
-    >::other                                            allocator_t;
-    typedef typename arg< Signature >::type             arg_type;
-
-private:
-    typedef stack_tuple< StackAllocator >                pbase_type;
-    typedef coroutine_base< Signature >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    coroutine_object( coroutine_object &);
-    coroutine_object & operator=( coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void enter_( typename detail::param< arg_type >::type arg)
-    {
-        tuple< coroutine_object *,
-            typename detail::param< arg_type >::type
-        > tpl( this, arg);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( & tpl),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< arg_type > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    coroutine_object( const reference_wrapper< Fn > fn, typename detail::param< arg_type >::type arg, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline2< coroutine_object, typename detail::param< arg_type >::type >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_( arg); }
-
-    ~coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void run( typename detail::param< arg_type >::type arg)
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            c.impl_->result_ = arg;
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
--- a/DEPENDENCIES/generic/include/boost/coroutine/v1/detail/coroutine_op.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,326 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OP_H
-#define BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OP_H
-
-#include <iterator>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/optional.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/v1/detail/arg.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename Signature, typename D, typename Result, int arity >
-struct coroutine_op;
-
-template< typename Signature, typename D >
-struct coroutine_op< Signature, D, void, 0 >
-{
-    D & operator()()
-    {
-        BOOST_ASSERT( static_cast< D * >( this)->impl_);
-        BOOST_ASSERT( ! static_cast< D * >( this)->impl_->is_complete() );
-
-        static_cast< D * >( this)->impl_->resume();
-
-        return * static_cast< D * >( this);
-    }
-};
-
-template< typename Signature, typename D, typename Result >
-struct coroutine_op< Signature, D, Result, 0 >
-{
-    class iterator : public std::iterator< std::input_iterator_tag, typename remove_reference< Result >::type >
-    {
-    private:
-        D               *   dp_;
-        optional< Result >  val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( dp_);
-
-            if ( ! dp_->has_result() )
-            {
-                dp_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = dp_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( dp_);
-            BOOST_ASSERT( * dp_);
-
-            ( * dp_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename iterator::pointer      pointer_t;
-        typedef typename iterator::reference    reference_t;
-
-        iterator() :
-            dp_( 0), val_()
-        {}
-
-        explicit iterator( D * dp) :
-            dp_( dp), val_()
-        { fetch_(); }
-
-        iterator( iterator const& other) :
-            dp_( other.dp_), val_( other.val_)
-        {}
-
-        iterator & operator=( iterator const& other)
-        {
-            if ( this == & other) return * this;
-            dp_ = other.dp_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.dp_ == dp_ && other.val_ == val_; }
-
-        bool operator!=( iterator const& other)
-        { return other.dp_ != dp_ || other.val_ != val_; }
-
-        iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        iterator operator++( int)
-        {
-            iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        { return const_cast< optional< Result > & >( val_).get(); }
-
-        pointer_t operator->() const
-        { return const_cast< optional< Result > & >( val_).get_ptr(); }
-    };
-
-    class const_iterator : public std::iterator< std::input_iterator_tag, const typename remove_reference< Result >::type >
-    {
-    private:
-        D                   *   dp_;
-        optional< Result >      val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( dp_);
-
-            if ( ! dp_->has_result() )
-            {
-                dp_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = dp_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( dp_);
-            BOOST_ASSERT( * dp_);
-
-            ( * dp_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename const_iterator::pointer      pointer_t;
-        typedef typename const_iterator::reference    reference_t;
-
-        const_iterator() :
-            dp_( 0), val_()
-        {}
-
-        explicit const_iterator( D const* dp) :
-            dp_( const_cast< D * >( dp) ), val_()
-        { fetch_(); }
-
-        const_iterator( const_iterator const& other) :
-            dp_( other.dp_), val_( other.val_)
-        {}
-
-        const_iterator & operator=( const_iterator const& other)
-        {
-            if ( this == & other) return * this;
-            dp_ = other.dp_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( const_iterator const& other)
-        { return other.dp_ == dp_ && other.val_ == val_; }
-
-        bool operator!=( const_iterator const& other)
-        { return other.dp_ != dp_ || other.val_ != val_; }
-
-        const_iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        const_iterator operator++( int)
-        {
-            const_iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        { return val_.get(); }
-
-        pointer_t operator->() const
-        { return val_.get_ptr(); }
-    };
-
-    D & operator()()
-    {
-        BOOST_ASSERT( static_cast< D * >( this)->impl_);
-        BOOST_ASSERT( ! static_cast< D * >( this)->impl_->is_complete() );
-
-        static_cast< D * >( this)->impl_->resume();
-
-        return * static_cast< D * >( this);
-    }
-};
-
-template< typename Signature, typename D >
-struct coroutine_op< Signature, D, void, 1 >
-{
-    typedef typename arg< Signature >::type   arg_type;
-
-    class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void >
-    {
-    private:
-       D    *   dp_;
-
-    public:
-        iterator() :
-           dp_( 0)
-        {}
-
-        explicit iterator( D * dp) :
-            dp_( dp)
-        {}
-
-        iterator & operator=( arg_type a1)
-        {
-            BOOST_ASSERT( dp_);
-            if ( ! ( * dp_)( a1) ) dp_ = 0;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.dp_ == dp_; }
-
-        bool operator!=( iterator const& other)
-        { return other.dp_ != dp_; }
-
-        iterator & operator*()
-        { return * this; }
-
-        iterator & operator++()
-        { return * this; }
-    };
-
-    struct const_iterator;
-
-    D & operator()( arg_type a1)
-    {
-        BOOST_ASSERT( static_cast< D * >( this)->impl_);
-        BOOST_ASSERT( ! static_cast< D * >( this)->impl_->is_complete() );
-
-        static_cast< D * >( this)->impl_->resume( a1);
-
-        return * static_cast< D * >( this);
-    }
-};
-
-template< typename Signature, typename D, typename Result >
-struct coroutine_op< Signature, D, Result, 1 >
-{
-    typedef typename arg< Signature >::type   arg_type;
-
-    D & operator()( arg_type a1)
-    {
-        BOOST_ASSERT( static_cast< D * >( this)->impl_);
-        BOOST_ASSERT( ! static_cast< D * >( this)->impl_->is_complete() );
-
-        static_cast< D * >( this)->impl_->resume( a1);
-
-        return * static_cast< D * >( this);
-    }
-};
-
-#define BOOST_COROUTINE_OP_COMMA(n) BOOST_PP_COMMA_IF(BOOST_PP_SUB(n,1))
-#define BOOST_COROUTINE_OP_VAL(z,n,unused) BOOST_COROUTINE_OP_COMMA(n) BOOST_PP_CAT(a,n)
-#define BOOST_COROUTINE_OP_VALS(n) BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(n,1),BOOST_COROUTINE_OP_VAL,~)
-#define BOOST_COROUTINE_OP_ARG_TYPE(n) \
-    typename function_traits< Signature >::BOOST_PP_CAT(BOOST_PP_CAT(arg,n),_type)
-#define BOOST_COROUTINE_OP_ARG(z,n,unused) BOOST_COROUTINE_OP_COMMA(n) BOOST_COROUTINE_OP_ARG_TYPE(n) BOOST_PP_CAT(a,n)
-#define BOOST_COROUTINE_OP_ARGS(n) BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(n,1),BOOST_COROUTINE_OP_ARG,~)
-#define BOOST_COROUTINE_OP(z,n,unused) \
-template< typename Signature, typename D, typename Result > \
-struct coroutine_op< Signature, D, Result, n > \
-{ \
-    D & operator()( BOOST_COROUTINE_OP_ARGS(n)) \
-    { \
-        BOOST_ASSERT( static_cast< D * >( this)->impl_); \
-        BOOST_ASSERT( ! static_cast< D * >( this)->impl_->is_complete() ); \
-\
-        static_cast< D * >( this)->impl_->resume(BOOST_COROUTINE_OP_VALS(n)); \
-\
-        return * static_cast< D * >( this); \
-    } \
-};
-BOOST_PP_REPEAT_FROM_TO(2,11,BOOST_COROUTINE_OP,~)
-#undef BOOST_COROUTINE_OP
-#undef BOOST_COROUTINE_OP_ARGS
-#undef BOOST_COROUTINE_OP_ARG
-#undef BOOST_COROUTINE_OP_ARG_TYPE
-#undef BOOST_COROUTINE_OP_VALS
-#undef BOOST_COROUTINE_OP_VAL
-#undef BOOST_COROUTINE_OP_COMMA
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_OLD_DETAIL_COROUTINE_OP_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/coroutine.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3001 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_COROUTINE_H
-#define BOOST_COROUTINES_UNIDIRECT_COROUTINE_H
-
-#include <cstddef>
-#include <iterator>
-#include <memory>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/move/move.hpp>
-#include <boost/optional.hpp>
-#include <boost/range.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/type_traits/decay.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/utility/enable_if.hpp>
-
-#include <boost/coroutine/attributes.hpp>
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/detail/param.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/stack_allocator.hpp>
-#include <boost/coroutine/v2/detail/pull_coroutine_base.hpp>
-#include <boost/coroutine/v2/detail/pull_coroutine_caller.hpp>
-#include <boost/coroutine/v2/detail/pull_coroutine_object.hpp>
-#include <boost/coroutine/v2/detail/push_coroutine_base.hpp>
-#include <boost/coroutine/v2/detail/push_coroutine_caller.hpp>
-#include <boost/coroutine/v2/detail/push_coroutine_object.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-template< typename Arg >
-class pull_coroutine;
-
-template< typename Arg >
-class push_coroutine
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::pull_coroutine_object;
-
-    typedef detail::push_coroutine_base< Arg >  base_t;
-    typedef typename base_t::ptr_t              ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
-
-    template< typename Allocator >
-    push_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc) :
-        impl_()
-    {
-        typedef detail::push_coroutine_caller<
-                Arg, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    push_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( pull_coroutine< Arg > &);
-
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-	template< typename StackAllocator >
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename StackAllocator, typename Allocator >
-    explicit push_coroutine(coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#else
-    template< typename Fn >
-    explicit push_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-
-    push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
-    {
-        push_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( push_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    push_coroutine & operator()( Arg const& arg)
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->push( arg);
-        return * this;
-    }
-
-    push_coroutine & operator()( Arg && arg) {
-        BOOST_ASSERT( * this);
-
-        impl_->push( arg);
-        return * this;
-    }
-#else
-    push_coroutine & operator()( Arg const& arg)
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->push( forward< Arg >( arg) );
-        return * this;
-    }
-
-    push_coroutine & operator()( BOOST_RV_REF( Arg) arg)
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->push( forward< Arg >( arg) );
-        return * this;
-    }
-#endif
-
-    class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void >
-    {
-    private:
-       push_coroutine< Arg >    *   c_;
-
-    public:
-        iterator() :
-           c_( 0)
-        {}
-
-        explicit iterator( push_coroutine< Arg > * c) :
-            c_( c)
-        {}
-
-        iterator & operator=( Arg a)
-        {
-            BOOST_ASSERT( c_);
-            if ( ! ( * c_)( a) ) c_ = 0;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.c_ == c_; }
-
-        bool operator!=( iterator const& other)
-        { return other.c_ != c_; }
-
-        iterator & operator*()
-        { return * this; }
-
-        iterator & operator++()
-        { return * this; }
-    };
-
-    struct const_iterator;
-};
-
-template< typename Arg >
-class push_coroutine< Arg & >
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::pull_coroutine_object;
-
-    typedef detail::push_coroutine_base< Arg & >    base_t;
-    typedef typename base_t::ptr_t                  ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
-
-    template< typename Allocator >
-    push_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc) :
-        impl_()
-    {
-        typedef detail::push_coroutine_caller<
-                Arg &, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    push_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( pull_coroutine< Arg & > &);
-
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename StackAllocator >
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename StackAllocator, typename Allocator >
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#else
-    template< typename Fn >
-    explicit push_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-
-    push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
-    {
-        push_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( push_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-    push_coroutine & operator()( Arg & arg)
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->push( arg);
-        return * this;
-    }
-
-    class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void >
-    {
-    private:
-       push_coroutine< Arg & >    *   c_;
-
-    public:
-        iterator() :
-           c_( 0)
-        {}
-
-        explicit iterator( push_coroutine< Arg & > * c) :
-            c_( c)
-        {}
-
-        iterator & operator=( Arg & a)
-        {
-            BOOST_ASSERT( c_);
-            if ( ! ( * c_)( a) ) c_ = 0;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.c_ == c_; }
-
-        bool operator!=( iterator const& other)
-        { return other.c_ != c_; }
-
-        iterator & operator*()
-        { return * this; }
-
-        iterator & operator++()
-        { return * this; }
-    };
-
-    struct const_iterator;
-};
-
-template<>
-class push_coroutine< void >
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::pull_coroutine_object;
-
-    typedef detail::push_coroutine_base< void >  base_t;
-    typedef base_t::ptr_t                        ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( push_coroutine)
-
-    template< typename Allocator >
-    push_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc) :
-        impl_()
-    {
-        typedef detail::push_coroutine_caller<
-                void, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    push_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( pull_coroutine< void > &);
-
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-	template< typename StackAllocator >
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename StackAllocator, typename Allocator >
-    explicit push_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-              typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#else
-    template< typename Fn >
-    explicit push_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< push_coroutine > const& alloc =
-                    std::allocator< push_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, push_coroutine >,
-                   dummy *
-               >::type = 0);
-#endif
-
-    push_coroutine( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    push_coroutine & operator=( BOOST_RV_REF( push_coroutine) other) BOOST_NOEXCEPT
-    {
-        push_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( push_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-    push_coroutine & operator()()
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->push();
-        return * this;
-    }
-
-    struct iterator;
-    struct const_iterator;
-};
-
-
-
-template< typename R >
-class pull_coroutine
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::push_coroutine_object;
-
-    typedef detail::pull_coroutine_base< R >    base_t;
-    typedef typename base_t::ptr_t              ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
-
-    template< typename Allocator >
-    pull_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc,
-                    optional< R > const& result) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_caller<
-                R, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a, result) );
-    }
-
-public:
-    pull_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( push_coroutine< R > &);
-
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, coroutine_fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, coroutine_fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, coroutine_fn, StackAllocator, Allocator,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-#endif
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, Allocator,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-#else
-    template< typename Fn >
-    explicit pull_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, Allocator,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R, Fn, StackAllocator, Allocator,
-                push_coroutine< R >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-#endif
-
-    pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
-    {
-        pull_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( pull_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-    pull_coroutine & operator()()
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->pull();
-        return * this;
-    }
-
-    bool has_result() const
-    {
-        BOOST_ASSERT( ! empty() );
-
-        return impl_->has_result();
-    }
-
-    R get() const
-    {
-        BOOST_ASSERT( ! empty() );
-
-        return impl_->get();
-    }
-
-    class iterator : public std::iterator< std::input_iterator_tag, typename remove_reference< R >::type >
-    {
-    private:
-        pull_coroutine< R > *   c_;
-        optional< R >           val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( c_);
-
-            if ( ! c_->has_result() )
-            {
-                c_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = c_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( c_);
-            BOOST_ASSERT( * c_);
-
-            ( * c_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename iterator::pointer      pointer_t;
-        typedef typename iterator::reference    reference_t;
-
-        iterator() :
-            c_( 0), val_()
-        {}
-
-        explicit iterator( pull_coroutine< R > * c) :
-            c_( c), val_()
-        { fetch_(); }
-
-        iterator( iterator const& other) :
-            c_( other.c_), val_( other.val_)
-        {}
-
-        iterator & operator=( iterator const& other)
-        {
-            if ( this == & other) return * this;
-            c_ = other.c_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.c_ == c_ && other.val_ == val_; }
-
-        bool operator!=( iterator const& other)
-        { return other.c_ != c_ || other.val_ != val_; }
-
-        iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        iterator operator++( int)
-        {
-            iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return const_cast< optional< R > & >( val_).get();
-        }
-
-        pointer_t operator->() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return const_cast< optional< R > & >( val_).get_ptr();
-        }
-    };
-
-    class const_iterator : public std::iterator< std::input_iterator_tag, const typename remove_reference< R >::type >
-    {
-    private:
-        pull_coroutine< R > *   c_;
-        optional< R >           val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( c_);
-
-            if ( ! c_->has_result() )
-            {
-                c_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = c_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( c_);
-            BOOST_ASSERT( * c_);
-
-            ( * c_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename const_iterator::pointer      pointer_t;
-        typedef typename const_iterator::reference    reference_t;
-
-        const_iterator() :
-            c_( 0), val_()
-        {}
-
-        explicit const_iterator( pull_coroutine< R > const* c) :
-            c_( const_cast< pull_coroutine< R > * >( c) ), val_()
-        { fetch_(); }
-
-        const_iterator( const_iterator const& other) :
-            c_( other.c_), val_( other.val_)
-        {}
-
-        const_iterator & operator=( const_iterator const& other)
-        {
-            if ( this == & other) return * this;
-            c_ = other.c_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( const_iterator const& other)
-        { return other.c_ == c_ && other.val_ == val_; }
-
-        bool operator!=( const_iterator const& other)
-        { return other.c_ != c_ || other.val_ != val_; }
-
-        const_iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        const_iterator operator++( int)
-        {
-            const_iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return val_.get();
-        }
-
-        pointer_t operator->() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return val_.get_ptr();
-        }
-    };
-};
-
-template< typename R >
-class pull_coroutine< R & >
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::push_coroutine_object;
-
-    typedef detail::pull_coroutine_base< R & >  base_t;
-    typedef typename base_t::ptr_t              ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
-
-    template< typename Allocator >
-    pull_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc,
-                    optional< R * > const& result) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_caller<
-                R &, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a, result) );
-    }
-
-public:
-    pull_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( push_coroutine< R & > &);
-
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, coroutine_fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, coroutine_fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, coroutine_fn, StackAllocator, Allocator,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-#endif
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, Allocator,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-#else
-    template< typename Fn >
-    explicit pull_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, Allocator,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                R &, Fn, StackAllocator, Allocator,
-                push_coroutine< R & >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-#endif
-
-    pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
-    {
-        pull_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( pull_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-    pull_coroutine & operator()()
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->pull();
-        return * this;
-    }
-
-    bool has_result() const
-    {
-        BOOST_ASSERT( ! empty() );
-
-        return impl_->has_result();
-    }
-
-    R & get() const
-    { return impl_->get(); }
-
-    class iterator : public std::iterator< std::input_iterator_tag, R >
-    {
-    private:
-        pull_coroutine< R & > *  c_;
-        optional< R & >          val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( c_);
-
-            if ( ! c_->has_result() )
-            {
-                c_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = c_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( c_);
-            BOOST_ASSERT( * c_);
-
-            ( * c_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename iterator::pointer      pointer_t;
-        typedef typename iterator::reference    reference_t;
-
-        iterator() :
-            c_( 0), val_()
-        {}
-
-        explicit iterator( pull_coroutine< R & > * c) :
-            c_( c), val_()
-        { fetch_(); }
-
-        iterator( iterator const& other) :
-            c_( other.c_), val_( other.val_)
-        {}
-
-        iterator & operator=( iterator const& other)
-        {
-            if ( this == & other) return * this;
-            c_ = other.c_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( iterator const& other)
-        { return other.c_ == c_ && other.val_ == val_; }
-
-        bool operator!=( iterator const& other)
-        { return other.c_ != c_ || other.val_ != val_; }
-
-        iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        iterator operator++( int)
-        {
-            iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return const_cast< optional< R & > & >( val_).get();
-        }
-
-        pointer_t operator->() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return const_cast< optional< R & > & >( val_).get_ptr();
-        }
-    };
-
-    class const_iterator : public std::iterator< std::input_iterator_tag, R >
-    {
-    private:
-        pull_coroutine< R & >   *   c_;
-        optional< R & >             val_;
-
-        void fetch_()
-        {
-            BOOST_ASSERT( c_);
-
-            if ( ! c_->has_result() )
-            {
-                c_ = 0;
-                val_ = none;
-                return;
-            }
-            val_ = c_->get();
-        }
-
-        void increment_()
-        {
-            BOOST_ASSERT( c_);
-            BOOST_ASSERT( * c_);
-
-            ( * c_)();
-            fetch_();
-        }
-
-    public:
-        typedef typename const_iterator::pointer      pointer_t;
-        typedef typename const_iterator::reference    reference_t;
-
-        const_iterator() :
-            c_( 0), val_()
-        {}
-
-        explicit const_iterator( pull_coroutine< R & > const* c) :
-            c_( const_cast< pull_coroutine< R & > * >( c) ), val_()
-        { fetch_(); }
-
-        const_iterator( const_iterator const& other) :
-            c_( other.c_), val_( other.val_)
-        {}
-
-        const_iterator & operator=( const_iterator const& other)
-        {
-            if ( this == & other) return * this;
-            c_ = other.c_;
-            val_ = other.val_;
-            return * this;
-        }
-
-        bool operator==( const_iterator const& other)
-        { return other.c_ == c_ && other.val_ == val_; }
-
-        bool operator!=( const_iterator const& other)
-        { return other.c_ != c_ || other.val_ != val_; }
-
-        const_iterator & operator++()
-        {
-            increment_();
-            return * this;
-        }
-
-        const_iterator operator++( int)
-        {
-            const_iterator tmp( * this);
-            ++*this;
-            return tmp;
-        }
-
-        reference_t operator*() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return val_.get();
-        }
-
-        pointer_t operator->() const
-        {
-            if ( ! val_)
-                boost::throw_exception(
-                    invalid_result() );
-            return val_.get_ptr();
-        }
-    };
-};
-
-template<>
-class pull_coroutine< void >
-{
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class detail::push_coroutine_object;
-
-    typedef detail::pull_coroutine_base< void > base_t;
-    typedef base_t::ptr_t                       ptr_t;
-
-    struct dummy
-    { void nonnull() {} };
-
-    typedef void ( dummy::*safe_bool)();
-
-    ptr_t  impl_;
-
-    BOOST_MOVABLE_BUT_NOT_COPYABLE( pull_coroutine)
-
-    template< typename Allocator >
-    pull_coroutine( detail::coroutine_context const& callee,
-                    bool unwind, bool preserve_fpu,
-                    Allocator const& alloc) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_caller<
-                void, Allocator
-        >                               caller_t;
-        typename caller_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) caller_t(
-                callee, unwind, preserve_fpu, a) );
-    }
-
-public:
-    pull_coroutine() BOOST_NOEXCEPT :
-        impl_()
-    {}
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-    typedef void ( * coroutine_fn) ( push_coroutine< void > &);
-
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, coroutine_fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, coroutine_fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( coroutine_fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               disable_if<
-                   is_same< typename decay< coroutine_fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, coroutine_fn, StackAllocator, Allocator,
-                push_coroutine< void >
-            >                               object_t;
-        object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-    }
-#endif
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, Allocator,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-    }
-#else
-    template< typename Fn >
-    explicit pull_coroutine( Fn fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( Fn fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, Allocator,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr = attributes(),
-               stack_allocator const& stack_alloc =
-                    stack_allocator(),
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, stack_allocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               std::allocator< pull_coroutine > const& alloc =
-                    std::allocator< pull_coroutine >(),
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, std::allocator< pull_coroutine >,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-
-    template< typename Fn, typename StackAllocator, typename Allocator >
-    explicit pull_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-               StackAllocator const& stack_alloc,
-               Allocator const& alloc,
-               typename disable_if<
-                   is_same< typename decay< Fn >::type, pull_coroutine >,
-                   dummy *
-               >::type = 0) :
-        impl_()
-    {
-        typedef detail::pull_coroutine_object<
-                void, Fn, StackAllocator, Allocator,
-                push_coroutine< void >
-            >                               object_t;
-        typename object_t::allocator_t a( alloc);
-        impl_ = ptr_t(
-            // placement new
-            ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-    }
-#endif
-
-    pull_coroutine( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT :
-        impl_()
-    { swap( other); }
-
-    pull_coroutine & operator=( BOOST_RV_REF( pull_coroutine) other) BOOST_NOEXCEPT
-    {
-        pull_coroutine tmp( boost::move( other) );
-        swap( tmp);
-        return * this;
-    }
-
-    bool empty() const BOOST_NOEXCEPT
-    { return ! impl_; }
-
-    operator safe_bool() const BOOST_NOEXCEPT
-    { return ( empty() || impl_->is_complete() ) ? 0 : & dummy::nonnull; }
-
-    bool operator!() const BOOST_NOEXCEPT
-    { return empty() || impl_->is_complete(); }
-
-    void swap( pull_coroutine & other) BOOST_NOEXCEPT
-    { impl_.swap( other.impl_); }
-
-    pull_coroutine & operator()()
-    {
-        BOOST_ASSERT( * this);
-
-        impl_->pull();
-        return * this;
-    }
-
-    struct iterator;
-    struct const_iterator;
-};
-
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-#ifdef BOOST_MSVC
-template< typename Arg >
-push_coroutine< Arg >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, coroutine_fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename StackAllocator >
-push_coroutine< Arg >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, coroutine_fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename StackAllocator, typename Allocator >
-push_coroutine< Arg >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, coroutine_fn, StackAllocator, Allocator,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-push_coroutine< Arg & >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, coroutine_fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename StackAllocator >
-push_coroutine< Arg & >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, coroutine_fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename StackAllocator, typename Allocator >
-push_coroutine< Arg & >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, coroutine_fn, StackAllocator, Allocator,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-inline
-push_coroutine< void >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, coroutine_fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename StackAllocator >
-push_coroutine< void >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, coroutine_fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename StackAllocator, typename Allocator >
-push_coroutine< void >::push_coroutine( coroutine_fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           disable_if<
-               is_same< typename decay< coroutine_fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, coroutine_fn, StackAllocator, Allocator,
-            pull_coroutine< void >
-        >                               object_t;
-    object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< coroutine_fn >( fn), attr, stack_alloc, a) );
-}
-#endif
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Fn >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, Allocator,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( forward< Fn >( fn), attr, stack_alloc, a) );
-}
-#else
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg >::push_coroutine( Fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg & >::push_coroutine( Fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg & >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg & >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-           Arg &, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Arg >
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            Arg &, Fn, StackAllocator, Allocator,
-            pull_coroutine< Arg & >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn >
-push_coroutine< void >::push_coroutine( Fn fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator >
-push_coroutine< void >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< void >::push_coroutine( Fn fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_convertible< Fn &, BOOST_RV_REF( Fn) >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, Allocator,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           stack_allocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, stack_allocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           std::allocator< push_coroutine > const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, std::allocator< push_coroutine >,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-
-template< typename Fn, typename StackAllocator, typename Allocator >
-push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn, attributes const& attr,
-           StackAllocator const& stack_alloc,
-           Allocator const& alloc,
-           typename disable_if<
-               is_same< typename decay< Fn >::type, push_coroutine >,
-               dummy *
-           >::type) :
-    impl_()
-{
-    typedef detail::push_coroutine_object<
-            void, Fn, StackAllocator, Allocator,
-            pull_coroutine< void >
-        >                               object_t;
-    typename object_t::allocator_t a( alloc);
-    impl_ = ptr_t(
-        // placement new
-        ::new( a.allocate( 1) ) object_t( fn, attr, stack_alloc, a) );
-}
-#endif
-
-template< typename R >
-void swap( pull_coroutine< R > & l, pull_coroutine< R > & r) BOOST_NOEXCEPT
-{ l.swap( r); }
-
-template< typename Arg >
-void swap( push_coroutine< Arg > & l, push_coroutine< Arg > & r) BOOST_NOEXCEPT
-{ l.swap( r); }
-
-template< typename R >
-inline
-typename pull_coroutine< R >::iterator
-range_begin( pull_coroutine< R > & c)
-{ return typename pull_coroutine< R >::iterator( & c); }
-
-template< typename R >
-inline
-typename pull_coroutine< R >::const_iterator
-range_begin( pull_coroutine< R > const& c)
-{ return typename pull_coroutine< R >::const_iterator( & c); }
-
-template< typename R >
-inline
-typename pull_coroutine< R >::iterator
-range_end( pull_coroutine< R > &)
-{ return typename pull_coroutine< R >::iterator(); }
-
-template< typename R >
-inline
-typename pull_coroutine< R >::const_iterator
-range_end( pull_coroutine< R > const&)
-{ return typename pull_coroutine< R >::const_iterator(); }
-
-template< typename Arg >
-inline
-typename push_coroutine< Arg >::iterator
-range_begin( push_coroutine< Arg > & c)
-{ return typename push_coroutine< Arg >::iterator( & c); }
-
-template< typename Arg >
-inline
-typename push_coroutine< Arg >::const_iterator
-range_begin( push_coroutine< Arg > const& c)
-{ return typename push_coroutine< Arg >::const_iterator( & c); }
-
-template< typename Arg >
-inline
-typename push_coroutine< Arg >::iterator
-range_end( push_coroutine< Arg > &)
-{ return typename push_coroutine< Arg >::iterator(); }
-
-template< typename Arg >
-inline
-typename push_coroutine< Arg >::const_iterator
-range_end( push_coroutine< Arg > const&)
-{ return typename push_coroutine< Arg >::const_iterator(); }
-
-template< typename T >
-struct coroutine
-{
-    typedef push_coroutine< T > push_type;
-    typedef pull_coroutine< T > pull_type;
-};
-
-}
-
-template< typename Arg >
-struct range_mutable_iterator< coroutines::push_coroutine< Arg > >
-{ typedef typename coroutines::push_coroutine< Arg >::iterator type; };
-
-template< typename Arg >
-struct range_const_iterator< coroutines::push_coroutine< Arg > >
-{ typedef typename coroutines::push_coroutine< Arg >::const_iterator type; };
-
-template< typename R >
-struct range_mutable_iterator< coroutines::pull_coroutine< R > >
-{ typedef typename coroutines::pull_coroutine< R >::iterator type; };
-
-template< typename R >
-struct range_const_iterator< coroutines::pull_coroutine< R > >
-{ typedef typename coroutines::pull_coroutine< R >::const_iterator type; };
-
-}
-
-namespace std {
-
-template< typename R >
-inline
-typename boost::coroutines::pull_coroutine< R >::iterator
-begin( boost::coroutines::pull_coroutine< R > & c)
-{ return boost::begin( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::pull_coroutine< R >::iterator
-end( boost::coroutines::pull_coroutine< R > & c)
-{ return boost::end( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::pull_coroutine< R >::const_iterator
-begin( boost::coroutines::pull_coroutine< R > const& c)
-{ return boost::const_begin( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::pull_coroutine< R >::const_iterator
-end( boost::coroutines::pull_coroutine< R > const& c)
-{ return boost::const_end( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::push_coroutine< R >::iterator
-begin( boost::coroutines::push_coroutine< R > & c)
-{ return boost::begin( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::push_coroutine< R >::iterator
-end( boost::coroutines::push_coroutine< R > & c)
-{ return boost::end( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::push_coroutine< R >::const_iterator
-begin( boost::coroutines::push_coroutine< R > const& c)
-{ return boost::const_begin( c); }
-
-template< typename R >
-inline
-typename boost::coroutines::push_coroutine< R >::const_iterator
-end( boost::coroutines::push_coroutine< R > const& c)
-{ return boost::const_end( c); }
-
-}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_COROUTINE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_base.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,337 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_BASE_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_BASE_H
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
-#include <boost/optional.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-#include <boost/coroutine/detail/holder.hpp>
-#include <boost/coroutine/detail/param.hpp>
-#include <boost/coroutine/exceptions.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-struct stack_context;
-
-namespace detail {
-
-template< typename R >
-class pull_coroutine_base : private noncopyable
-{
-public:
-    typedef intrusive_ptr< pull_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class push_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-    optional< R >       result_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    pull_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx),
-        result_()
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    pull_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu,
-                         optional< R > const& result) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee),
-        result_( result)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~pull_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-    void pull()
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< R > hldr_to( & caller_);
-        holder< R > * hldr_from(
-            reinterpret_cast< holder< R > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        result_ = hldr_from->data;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-
-    bool has_result() const
-    { return result_; }
-
-    R get() const
-    {
-        if ( ! has_result() )
-            boost::throw_exception(
-                invalid_result() );
-        return result_.get(); 
-    }
-};
-
-template< typename R >
-class pull_coroutine_base< R & > : private noncopyable
-{
-public:
-    typedef intrusive_ptr< pull_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class push_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-    optional< R * >     result_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    pull_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx),
-        result_()
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    pull_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu,
-                         optional< R * > const& result) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee),
-        result_( result)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~pull_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-    void pull()
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< R & > hldr_to( & caller_);
-        holder< R & > * hldr_from(
-            reinterpret_cast< holder< R & > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        result_ = hldr_from->data;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-
-    bool has_result() const
-    { return result_; }
-
-    R & get() const
-    {
-        if ( ! has_result() )
-            boost::throw_exception(
-                invalid_result() );
-        return * result_.get();
-    }
-};
-
-template<>
-class pull_coroutine_base< void > : private noncopyable
-{
-public:
-    typedef intrusive_ptr< pull_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class push_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    pull_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    pull_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~pull_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( pull_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-    void pull()
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< void > hldr_to( & caller_);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_BASE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_caller.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_CALLER_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_CALLER_H
-
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/optional.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/v2/detail/pull_coroutine_base.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename R, typename Allocator >
-class pull_coroutine_caller : public  pull_coroutine_base< R >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_caller< R, Allocator >
-    >::other   allocator_t;
-
-    pull_coroutine_caller( coroutine_context const& callee, bool unwind, bool preserve_fpu,
-                           allocator_t const& alloc, optional< R > const& data) BOOST_NOEXCEPT :
-        pull_coroutine_base< R >( callee, unwind, preserve_fpu, data),
-        alloc_( alloc)
-    {}
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-
-private:
-    allocator_t   alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_caller * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-};
-
-template< typename R, typename Allocator >
-class pull_coroutine_caller< R &, Allocator > : public  pull_coroutine_base< R & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_caller< R &, Allocator >
-    >::other   allocator_t;
-
-    pull_coroutine_caller( coroutine_context const& callee, bool unwind, bool preserve_fpu,
-                           allocator_t const& alloc, optional< R * > const& data) BOOST_NOEXCEPT :
-        pull_coroutine_base< R & >( callee, unwind, preserve_fpu, data),
-        alloc_( alloc)
-    {}
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-
-private:
-    allocator_t   alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_caller * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-};
-
-template< typename Allocator >
-class pull_coroutine_caller< void, Allocator > : public  pull_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_caller< void, Allocator >
-    >::other   allocator_t;
-
-    pull_coroutine_caller( coroutine_context const& callee, bool unwind, bool preserve_fpu,
-                           allocator_t const& alloc) BOOST_NOEXCEPT :
-        pull_coroutine_base< void >( callee, unwind, preserve_fpu),
-        alloc_( alloc)
-    {}
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-
-private:
-    allocator_t   alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_caller * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_CALLER_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/pull_coroutine_object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1124 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_OBJECT_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_OBJECT_H
-
-#include <cstddef>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/move/move.hpp>
-#include <boost/ref.hpp>
-#include <boost/tuple/tuple.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/attributes.hpp>
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-#include <boost/coroutine/detail/holder.hpp>
-#include <boost/coroutine/detail/param.hpp>
-#include <boost/coroutine/detail/stack_tuple.hpp>
-#include <boost/coroutine/detail/trampoline.hpp>
-#include <boost/coroutine/flags.hpp>
-#include <boost/coroutine/stack_context.hpp>
-#include <boost/coroutine/v2/detail/pull_coroutine_base.hpp>
-
-#ifdef BOOST_MSVC
- #pragma warning (push)
- #pragma warning (disable: 4355) // using 'this' in initializer list
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object : private stack_tuple< StackAllocator >,
-                              public pull_coroutine_base< R >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R >                    base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R > * hldr_from(
-            reinterpret_cast< holder< R > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    pull_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    pull_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create push_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< R, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< R >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R >                    base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R > * hldr_from(
-            reinterpret_cast< holder< R > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< R, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< R >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R >                    base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R > * hldr_from(
-            reinterpret_cast< holder< R > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< R &, Fn, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< R & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R &, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R & >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R * > * hldr_from(
-            reinterpret_cast< holder< R * > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        this->result_ = hldr_from->data;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    pull_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    pull_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create push_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< R &, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< R & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R &, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R & >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R * > * hldr_from(
-            reinterpret_cast< holder< R * > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename R, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< R &, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< R & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            R &, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< R & >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< R * > * hldr_from(
-            reinterpret_cast< holder< R * > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< R * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< R * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< void, Fn, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    pull_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    pull_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create push_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< void, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class pull_coroutine_object< void, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public pull_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        pull_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef pull_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, pull_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    pull_coroutine_object( pull_coroutine_object &);
-    pull_coroutine_object & operator=( pull_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    pull_coroutine_object( const reference_wrapper< Fn > fn,
-                           attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< pull_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~pull_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            // create pull_coroutine
-            Caller c( this->caller_, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#ifdef BOOST_MSVC
- #pragma warning (pop)
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PULL_COROUTINE_OBJECT_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_base.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_BASE_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_BASE_H
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/detail/coroutine_context.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-
-struct stack_context;
-
-namespace detail {
-
-template< typename Arg >
-class push_coroutine_base : private noncopyable
-{
-public:
-    typedef intrusive_ptr< push_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class pull_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    push_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    push_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~push_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( push_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( push_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    void push( Arg const& arg)
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< Arg > hldr_to( & caller_, arg);
-        holder< Arg > * hldr_from(
-            reinterpret_cast< holder< Arg > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-
-    void push( Arg && arg)
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< Arg > hldr_to( & caller_, boost::forward( arg) );
-        holder< Arg > * hldr_from(
-            reinterpret_cast< holder< Arg > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-#else
-    void push( Arg const& arg)
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< Arg > hldr_to( & caller_, arg);
-        holder< Arg > * hldr_from(
-            reinterpret_cast< holder< Arg > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-
-    void push( BOOST_RV_REF( Arg) arg)
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< Arg > hldr_to( & caller_, arg);
-        holder< Arg > * hldr_from(
-            reinterpret_cast< holder< Arg > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-#endif
-};
-
-template< typename Arg >
-class push_coroutine_base< Arg & > : private noncopyable
-{
-public:
-    typedef intrusive_ptr< push_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class pull_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    push_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    push_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~push_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( push_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( push_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-    void push( Arg & arg)
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< Arg * > hldr_to( & caller_, & arg);
-        holder< Arg * > * hldr_from(
-            reinterpret_cast< holder< Arg * > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-};
-
-template<>
-class push_coroutine_base< void > : private noncopyable
-{
-public:
-    typedef intrusive_ptr< push_coroutine_base >     ptr_t;
-
-private:
-    template<
-        typename X, typename Y, typename Z, typename V, typename W
-    >
-    friend class pull_coroutine_object;
-
-    unsigned int        use_count_;
-
-protected:
-    int                 flags_;
-    exception_ptr       except_;
-    coroutine_context   caller_;
-    coroutine_context   callee_;
-
-    virtual void deallocate_object() = 0;
-
-public:
-    push_coroutine_base( coroutine_context::ctx_fn fn,
-                         stack_context * stack_ctx,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( fn, stack_ctx)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    push_coroutine_base( coroutine_context const& callee,
-                         bool unwind, bool preserve_fpu) :
-        use_count_( 0),
-        flags_( 0),
-        except_(),
-        caller_(),
-        callee_( callee)
-    {
-        if ( unwind) flags_ |= flag_force_unwind;
-        if ( preserve_fpu) flags_ |= flag_preserve_fpu;
-    }
-
-    virtual ~push_coroutine_base()
-    {}
-
-    bool force_unwind() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_force_unwind); }
-
-    bool unwind_requested() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_unwind_stack); }
-
-    bool preserve_fpu() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_preserve_fpu); }
-
-    bool is_complete() const BOOST_NOEXCEPT
-    { return 0 != ( flags_ & flag_complete); }
-
-    friend inline void intrusive_ptr_add_ref( push_coroutine_base * p) BOOST_NOEXCEPT
-    { ++p->use_count_; }
-
-    friend inline void intrusive_ptr_release( push_coroutine_base * p) BOOST_NOEXCEPT
-    { if ( --p->use_count_ == 0) p->deallocate_object(); }
-
-    void push()
-    {
-        BOOST_ASSERT( ! is_complete() );
-
-        holder< void > hldr_to( & caller_);
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                hldr_to.ctx->jump(
-                    callee_,
-                    reinterpret_cast< intptr_t >( & hldr_to),
-                    preserve_fpu() ) ) );
-        BOOST_ASSERT( hldr_from->ctx);
-        callee_ = * hldr_from->ctx;
-        if ( hldr_from->force_unwind) throw forced_unwind();
-        if ( except_) rethrow_exception( except_);
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_BASE_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_caller.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_CALLER_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_CALLER_H
-
-#include <boost/config.hpp>
-#include <boost/context/fcontext.hpp>
-
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/v2/detail/push_coroutine_base.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template< typename Arg, typename Allocator >
-class push_coroutine_caller : public  push_coroutine_base< Arg >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_caller< Arg, Allocator >
-    >::other   allocator_t;
-
-    push_coroutine_caller( coroutine_context const& callee, bool unwind,
-                           bool preserve_fpu, allocator_t const& alloc) BOOST_NOEXCEPT :
-        push_coroutine_base< Arg >( callee, unwind, preserve_fpu),
-        alloc_( alloc)
-    {}
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-
-private:
-    allocator_t   alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_caller * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_CALLER_H
--- a/DEPENDENCIES/generic/include/boost/coroutine/v2/detail/push_coroutine_object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1208 +0,0 @@
-
-//          Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_OBJECT_H
-#define BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_OBJECT_H
-
-#include <cstddef>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/exception_ptr.hpp>
-#include <boost/move/move.hpp>
-#include <boost/ref.hpp>
-#include <boost/tuple/tuple.hpp>
-#include <boost/type_traits/function_traits.hpp>
-#include <boost/utility.hpp>
-
-#include <boost/coroutine/attributes.hpp>
-#include <boost/coroutine/detail/config.hpp>
-#include <boost/coroutine/exceptions.hpp>
-#include <boost/coroutine/detail/flags.hpp>
-#include <boost/coroutine/detail/holder.hpp>
-#include <boost/coroutine/detail/param.hpp>
-#include <boost/coroutine/detail/stack_tuple.hpp>
-#include <boost/coroutine/detail/trampoline.hpp>
-#include <boost/coroutine/flags.hpp>
-#include <boost/coroutine/stack_context.hpp>
-#include <boost/coroutine/v2/detail/push_coroutine_base.hpp>
-
-#ifdef BOOST_MSVC
- #pragma warning (push)
- #pragma warning (disable: 4355) // using 'this' in initializer list
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace coroutines {
-namespace detail {
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object : private stack_tuple< StackAllocator >,
-                              public push_coroutine_base< Arg >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    push_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    push_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg > * hldr_from(
-                reinterpret_cast< holder< Arg > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< Arg, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< Arg >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg > * hldr_from(
-                reinterpret_cast< holder< Arg > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< Arg, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< Arg >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg >                  base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg > * hldr_from(
-                reinterpret_cast< holder< Arg > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< Arg &, Fn, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< Arg & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg &, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg & >                base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    push_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    push_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg * > * hldr_from(
-                reinterpret_cast< holder< Arg * > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< Arg &, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< Arg & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg &, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg & >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg * > * hldr_from(
-                reinterpret_cast< holder< Arg * > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Arg, typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< Arg &, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< Arg & >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            Arg, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< Arg & >                base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< Arg * > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< Arg * > * hldr_from(
-                reinterpret_cast< holder< Arg * > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-            BOOST_ASSERT( hldr_from->data);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_, hldr_from->data);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< Arg * > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< void, Fn, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    push_coroutine_object( Fn && fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( forward< Fn >( fn) ),
-        alloc_( alloc)
-    { enter_(); }
-#else
-    push_coroutine_object( Fn fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-#endif
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< void > * hldr_from(
-                reinterpret_cast< holder< void > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< void, reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( reference_wrapper< Fn > fn, attributes const& attr,
-                           StackAllocator const& stack_alloc,
-                           allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< void > * hldr_from(
-                reinterpret_cast< holder< void > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-template<
-    typename Fn,
-    typename StackAllocator, typename Allocator,
-    typename Caller
->
-class push_coroutine_object< void, const reference_wrapper< Fn >, StackAllocator, Allocator, Caller > :
-    private stack_tuple< StackAllocator >,
-    public push_coroutine_base< void >
-{
-public:
-    typedef typename Allocator::template rebind<
-        push_coroutine_object<
-            void, Fn, StackAllocator, Allocator, Caller
-        >
-    >::other                                            allocator_t;
-
-private:
-    typedef stack_tuple< StackAllocator >               pbase_type;
-    typedef push_coroutine_base< void >                 base_type;
-
-    Fn                      fn_;
-    allocator_t             alloc_;
-
-    static void destroy_( allocator_t & alloc, push_coroutine_object * p)
-    {
-        alloc.destroy( p);
-        alloc.deallocate( p, 1);
-    }
-
-    push_coroutine_object( push_coroutine_object &);
-    push_coroutine_object & operator=( push_coroutine_object const&);
-
-    void enter_()
-    {
-        holder< void > * hldr_from(
-            reinterpret_cast< holder< void > * >(
-                this->caller_.jump(
-                    this->callee_,
-                    reinterpret_cast< intptr_t >( this),
-                    this->preserve_fpu() ) ) );
-        this->callee_ = * hldr_from->ctx;
-        if ( this->except_) rethrow_exception( this->except_);
-    }
-
-    void unwind_stack_() BOOST_NOEXCEPT
-    {
-        BOOST_ASSERT( ! this->is_complete() );
-
-        this->flags_ |= flag_unwind_stack;
-        holder< void > hldr_to( & this->caller_, true);
-        this->caller_.jump(
-            this->callee_,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        this->flags_ &= ~flag_unwind_stack;
-
-        BOOST_ASSERT( this->is_complete() );
-    }
-
-public:
-    push_coroutine_object( const reference_wrapper< Fn > fn, attributes const& attr,
-                      StackAllocator const& stack_alloc,
-                      allocator_t const& alloc) :
-        pbase_type( stack_alloc, attr.size),
-        base_type(
-            trampoline1< push_coroutine_object >,
-            & this->stack_ctx,
-            stack_unwind == attr.do_unwind,
-            fpu_preserved == attr.preserve_fpu),
-        fn_( fn),
-        alloc_( alloc)
-    { enter_(); }
-
-    ~push_coroutine_object()
-    {
-        if ( ! this->is_complete() && this->force_unwind() )
-            unwind_stack_();
-    }
-
-    void run()
-    {
-        coroutine_context callee;
-        coroutine_context caller;
-
-        {
-            holder< void > hldr_to( & caller);
-            holder< void > * hldr_from(
-                reinterpret_cast< holder< void > * >(
-                    caller.jump(
-                        this->caller_,
-                        reinterpret_cast< intptr_t >( & hldr_to),
-                        this->preserve_fpu() ) ) );
-            BOOST_ASSERT( hldr_from->ctx);
-
-            // create pull_coroutine
-            Caller c( * hldr_from->ctx, false, this->preserve_fpu(), alloc_);
-            try
-            { fn_( c); }
-            catch ( forced_unwind const&)
-            {}
-            catch (...)
-            { this->except_ = current_exception(); }
-            callee = c.impl_->callee_;
-        }
-
-        this->flags_ |= flag_complete;
-        holder< void > hldr_to( & caller);
-        caller.jump(
-            callee,
-            reinterpret_cast< intptr_t >( & hldr_to),
-            this->preserve_fpu() );
-        BOOST_ASSERT_MSG( false, "push_coroutine is complete");
-    }
-
-    void deallocate_object()
-    { destroy_( alloc_, this); }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif
-
-#ifdef BOOST_MSVC
- #pragma warning (pop)
-#endif
-
-#endif // BOOST_COROUTINES_UNIDIRECT_DETAIL_PUSH_COROUTINE_OBJECT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/coroutine/windows/protected_stack_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+
+//          Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
+#define BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
+
+extern "C" {
+#include <windows.h>
+}
+
+#include <cmath>
+#include <cstddef>
+#include <new>
+
+#include <boost/config.hpp>
+
+#include <boost/coroutine/detail/config.hpp>
+#include <boost/coroutine/stack_traits.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines {
+
+struct stack_context;
+
+template< typename traitsT >
+struct basic_protected_stack_allocator
+{
+    typedef traitsT traits_type;
+
+    void allocate( stack_context & ctx, std::size_t size)
+    {
+        BOOST_ASSERT( traits_type::minimum_size() <= size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
+
+        // page at bottom will be used as guard-page
+        const std::size_t pages(
+            static_cast< std::size_t >( 
+                std::floor(
+                    static_cast< float >( size) / traits_type::page_size() ) ) );
+        BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
+        const std::size_t size_ = pages * traits_type::page_size();
+        BOOST_ASSERT( 0 < size && 0 < size_);
+
+        void * limit = ::VirtualAlloc( 0, size_, MEM_COMMIT, PAGE_READWRITE);
+        if ( ! limit) throw std::bad_alloc();
+
+        DWORD old_options;
+#if defined(BOOST_DISABLE_ASSERTS)
+        ::VirtualProtect(
+            limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
+#else
+        const BOOL result = ::VirtualProtect(
+            limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
+        BOOST_ASSERT( FALSE != result);
+#endif
+
+        ctx.size = size_;
+        ctx.sp = static_cast< char * >( limit) + ctx.size;
+    }
+
+    void deallocate( stack_context & ctx)
+    {
+        BOOST_ASSERT( ctx.sp);
+        BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
+        BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
+
+        void * limit = static_cast< char * >( ctx.sp) - ctx.size;
+        ::VirtualFree( limit, 0, MEM_RELEASE);
+    }
+};
+
+typedef basic_protected_stack_allocator< stack_traits > protected_stack_allocator;
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/cstdfloat.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// <boost/cstdfloat.hpp> implements floating-point typedefs having
+// specified widths, as described in N3626 (proposed for C++14).
+// See: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3626.pdf
+
+#ifndef _BOOST_CSTDFLOAT_2014_01_09_HPP_
+  #define _BOOST_CSTDFLOAT_2014_01_09_HPP_
+
+  // Include the floating-point type definitions.
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+
+  // Support a specialization of std::numeric_limits<> for the wrapped quadmath library (if available).
+  #if !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS)
+    #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+  #endif
+
+  // Support <cmath> functions for the wrapped quadmath library (if available).
+  #if !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+    #include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
+  #endif
+
+  // Support I/O stream operations for the wrapped quadmath library (if available).
+  #if !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM)
+    #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+    #error You can not use <boost/math/cstdfloat/cstdfloat_iostream.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+    #endif
+    #include <boost/math/cstdfloat/cstdfloat_iostream.hpp>
+  #endif
+
+  // Support a specialization of std::complex<> for the wrapped quadmath library (if available).
+  #if !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_COMPLEX)
+    #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS)
+    #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS defined.
+    #endif
+    #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+    #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+    #endif
+    #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM)
+    #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM defined.
+    #endif
+    #include <boost/math/cstdfloat/cstdfloat_complex.hpp>
+  #endif
+
+
+  // Undefine BOOST_NO_FLOAT128_T because this constant is not meant for public use.
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T)
+  #undef BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T
+  #endif
+
+#endif // _BOOST_CSTDFLOAT_2014_01_09_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/cxx11_char_types.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+//  boost cxx11_char_types.hpp  --------------------------------------------------------//
+
+//  Copyright Beman Dawes 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//  The purpose of this header is to emulate the C++11 char16_t and char32_t            //
+//  character and string types so that they can be used in both C++11 and C++03         //
+//  programs.                                                                           //
+//                                                                                      //
+//  The emulation names use char16/char32 rather than char16_t/char32_t to avoid use    //
+//  of names that are keywords in C++11.                                                //
+//                                                                                      //
+//  The emulation names are placed in namespace boost, as is usual for Boost C++11      //
+//  emulation names such as those in header <boost/cstdint.hpp>.                        //
+//                                                                                      //
+//  An alternative would would have been to place the C++11 emulation names at global   //
+//  scope, and put the C++11 string types in namespace std. That is the approach taken  //
+//  by Microsoft Visual Studio 2010, but is controversion with some Boost users and     //
+//  developers, and runs counter to usual Boost practice.                               //
+//                                                                                      //
+//  Thanks to Mathias Gaunard and others for discussions leading to the final form      //
+//  of these typedefs.                                                                  //
+//                                                                                      //
+//   Boost               C++11            C++03                                         //
+//   ----------------    --------------   --------------------------------              //
+//   boost::char16       char16_t         uint16_t                                      //
+//   boost::char32       char32_t         uint32_t                                      //
+//   boost::u16string    std::u16string   std::basic_string<boost::char16>              //
+//   boost::u32string    std::u32string   std::basic_string<boost::char32>              //
+//                                                                                      //
+//   Uses the typedefs provided by Microsoft Visual C++ 2010 if present                 //
+//                                                                                      //
+//   Thanks to Mathias Gaunard and others for discussions leading to the final form     //
+//   of these typedefs.                                                                 //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+
+#if !defined(BOOST_CXX11_CHAR_TYPES_HPP)
+# define BOOST_CXX11_CHAR_TYPES_HPP
+
+# include <boost/config.hpp>
+# include <boost/cstdint.hpp>
+# include <string>
+
+namespace boost
+{
+
+# if defined(BOOST_NO_CHAR16_T) && (!defined(_MSC_VER) || _MSC_VER < 1600)  // 1600 == VC++10 
+    typedef boost::uint_least16_t             char16;
+    typedef std::basic_string<boost::char16>  u16string;
+# else
+    typedef char16_t                          char16;
+    typedef std::u16string                    u16string;
+# endif
+
+# if defined(BOOST_NO_CHAR32_T) && (!defined(_MSC_VER) || _MSC_VER < 1600)  // 1600 == VC++10 
+    typedef  boost::uint_least32_t            char32;
+    typedef std::basic_string<boost::char32>  u32string;
+# else
+    typedef char32_t                          char32;
+    typedef std::u32string                    u32string;
+# endif
+
+}  // namespace boost
+
+#endif  // !defined(BOOST_CXX11_CHAR_TYPES_HPP)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/basic_pointerbuf.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,139 @@
+//-----------------------------------------------------------------------------
+// boost detail/templated_streams.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2013 John Maddock, Antony Polukhin
+// 
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_DETAIL_BASIC_POINTERBUF_HPP
+#define BOOST_DETAIL_BASIC_POINTERBUF_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include "boost/config.hpp"
+#include <streambuf>
+
+namespace boost { namespace detail {
+
+//
+// class basic_pointerbuf:
+// acts as a stream buffer which wraps around a pair of pointers:
+//
+template <class charT, class BufferT >
+class basic_pointerbuf : public BufferT {
+protected:
+   typedef BufferT base_type;
+   typedef basic_pointerbuf<charT, BufferT> this_type;
+   typedef typename base_type::int_type int_type;
+   typedef typename base_type::char_type char_type;
+   typedef typename base_type::pos_type pos_type;
+   typedef ::std::streamsize streamsize;
+   typedef typename base_type::off_type off_type;
+
+public:
+   basic_pointerbuf() : base_type() { setbuf(0, 0); }
+   const charT* getnext() { return this->gptr(); }
+
+#ifndef BOOST_NO_USING_TEMPLATE
+    using base_type::pptr;
+    using base_type::pbase;
+#else
+    charT* pptr() const { return base_type::pptr(); }
+    charT* pbase() const { return base_type::pbase(); }
+#endif
+
+protected:
+   // VC mistakenly assumes that `setbuf` and other functions are not referenced.
+   // Marking those functions with `inline` suppresses the warnings.
+   // There must be no harm from marking virtual functions as inline: inline virtual
+   // call can be inlined ONLY when the compiler knows the "exact class".
+   inline base_type* setbuf(char_type* s, streamsize n);
+   inline typename this_type::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which);
+   inline typename this_type::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which);
+
+private:
+   basic_pointerbuf& operator=(const basic_pointerbuf&);
+   basic_pointerbuf(const basic_pointerbuf&);
+};
+
+template<class charT, class BufferT>
+BufferT*
+basic_pointerbuf<charT, BufferT>::setbuf(char_type* s, streamsize n)
+{
+   this->setg(s, s, s + n);
+   return this;
+}
+
+template<class charT, class BufferT>
+typename basic_pointerbuf<charT, BufferT>::pos_type
+basic_pointerbuf<charT, BufferT>::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which)
+{
+   typedef typename boost::int_t<sizeof(way) * CHAR_BIT>::least cast_type;
+
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   std::ptrdiff_t size = this->egptr() - this->eback();
+   std::ptrdiff_t pos = this->gptr() - this->eback();
+   charT* g = this->eback();
+   switch(static_cast<cast_type>(way))
+   {
+   case ::std::ios_base::beg:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + off, g + size);
+      break;
+   case ::std::ios_base::end:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + size - off, g + size);
+      break;
+   case ::std::ios_base::cur:
+   {
+      std::ptrdiff_t newpos = static_cast<std::ptrdiff_t>(pos + off);
+      if((newpos < 0) || (newpos > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + newpos, g + size);
+      break;
+   }
+   default: ;
+   }
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4244)
+#endif
+   return static_cast<pos_type>(this->gptr() - this->eback());
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template<class charT, class BufferT>
+typename basic_pointerbuf<charT, BufferT>::pos_type
+basic_pointerbuf<charT, BufferT>::seekpos(pos_type sp, ::std::ios_base::openmode which)
+{
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   off_type size = static_cast<off_type>(this->egptr() - this->eback());
+   charT* g = this->eback();
+   if(off_type(sp) <= size)
+   {
+      this->setg(g, g + off_type(sp), g + size);
+   }
+   return pos_type(off_type(-1));
+}
+
+}} // namespace boost::detail
+
+#endif // BOOST_DETAIL_BASIC_POINTERBUF_HPP
+
--- a/DEPENDENCIES/generic/include/boost/detail/is_function_ref_tester.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-
-// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, 
-// Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#if !defined(BOOST_PP_IS_ITERATING)
-
-///// header body
-
-#ifndef BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
-#define BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
-
-#include "boost/type_traits/detail/yes_no_type.hpp"
-#include "boost/type_traits/config.hpp"
-
-#if defined(BOOST_TT_PREPROCESSING_MODE)
-#   include "boost/preprocessor/iterate.hpp"
-#   include "boost/preprocessor/enum_params.hpp"
-#   include "boost/preprocessor/comma_if.hpp"
-#endif
-
-namespace boost {
-namespace detail {
-namespace is_function_ref_tester_ {
-
-template <class T>
-boost::type_traits::no_type BOOST_TT_DECL is_function_ref_tester(T& ...);
-
-#if !defined(BOOST_TT_PREPROCESSING_MODE)
-// preprocessor-generated part, don't edit by hand!
-
-template <class R>
-boost::type_traits::yes_type is_function_ref_tester(R (&)(), int);
-
-template <class R,class T0 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0), int);
-
-template <class R,class T0,class T1 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1), int);
-
-template <class R,class T0,class T1,class T2 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2), int);
-
-template <class R,class T0,class T1,class T2,class T3 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23), int);
-
-template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23,class T24 >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24), int);
-
-#else
-
-#define BOOST_PP_ITERATION_PARAMS_1 \
-    (3, (0, 25, "boost/detail/is_function_ref_tester.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif // BOOST_TT_PREPROCESSING_MODE
-
-} // namespace detail
-} // namespace python
-} // namespace boost
-
-#endif // BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED
-
-///// iteration
-
-#else
-#define i BOOST_PP_FRAME_ITERATION(1)
-
-template <class R BOOST_PP_COMMA_IF(i) BOOST_PP_ENUM_PARAMS(i,class T) >
-boost::type_traits::yes_type is_function_ref_tester(R (&)(BOOST_PP_ENUM_PARAMS(i,T)), int);
-
-#undef i
-#endif // BOOST_PP_IS_ITERATING
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/lightweight_test_report.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+//  boost/detail/lightweight_test_reporter.hpp  ----------------------------------------//
+
+//  Copyright Beman Dawes 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//                         Configuration reporting cpp_main()                           //
+//                                                                                      //
+//  Displays configuration information, then returns test_main(argc, argv), which       //
+//  must be supplied by the user.                                                       //
+//                                                                                      //
+//  Note: cpp_main(argc, argv) is called from a try block in main(), which is           //
+//  supplied by <boost/detail/lightweight_main.hpp> as is a catch block that reports    //
+//  std::exception what().                                                              //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+
+#include <boost/config.hpp>
+#include <boost/version.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/detail/lightweight_main.hpp>
+#include <iostream>
+
+int test_main(int argc, char* argv[]);
+
+int cpp_main(int argc, char* argv[])
+{
+  std::cout << BOOST_COMPILER
+#ifdef __GNUC__
+            << ", __GXX_EXPERIMENTAL_CXX0X__ "
+# ifdef __GXX_EXPERIMENTAL_CXX0X__
+              "defined"
+# else
+              "not defined"
+# endif
+#endif
+            << "\n"
+            << BOOST_STDLIB << "\n"
+            << BOOST_PLATFORM << "\n"
+            << "Boost version " << BOOST_VERSION / 100000 << '.'
+            << BOOST_VERSION / 100 % 1000 << '.' << BOOST_VERSION % 100 << "\n";
+
+  std::cout << "Command line: ";
+  for (int a = 0; a < argc; ++a)
+  {
+    std::cout << argv[a];
+    if (a != argc - 1)
+      std::cout << ' ';
+  }
+  std::cout << std::endl;
+
+  return test_main(argc, argv);
+}
\ No newline at end of file
--- a/DEPENDENCIES/generic/include/boost/detail/limits.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,449 +0,0 @@
-// Copyright 2001 John Maddock
-// Distributed under the Boost Software License, Version 1.0. (See accompany-
-// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-/*
- * Copyright (c) 1997
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-/* NOTE: This is not portable code.  Parts of numeric_limits<> are
- * inherently machine-dependent, and this file is written for the MIPS
- * architecture and the SGI MIPSpro C++ compiler.  Parts of it (in
- * particular, some of the characteristics of floating-point types)
- * are almost certainly incorrect for any other platform.
- */
-
-/* The above comment is almost certainly out of date. This file works
- * on systems other than SGI MIPSpro C++ now.
- */
-
-/*
- * Revision history:
- * 21 Sep 2001:
- *    Only include <cwchar> if BOOST_NO_CWCHAR is defined. (Darin Adler)
- * 10 Aug 2001:
- *    Added MIPS (big endian) to the big endian family. (Jens Maurer)
- * 13 Apr 2001:
- *    Added powerpc to the big endian family. (Jeremy Siek)
- * 5 Apr 2001:
- *    Added sparc (big endian) processor support (John Maddock).
- * Initial sub:
- *      Modified by Jens Maurer for gcc 2.95 on x86.
- */
-
-#ifndef BOOST_SGI_CPP_LIMITS
-#define BOOST_SGI_CPP_LIMITS
-
-#include <climits>
-#include <cfloat>
-#include <boost/config.hpp>
-#include <boost/detail/endian.hpp>
-
-#ifndef BOOST_NO_CWCHAR
-#include <cwchar> // for WCHAR_MIN and WCHAR_MAX
-#endif
-
-namespace std {
-
-enum float_round_style {
-  round_indeterminate       = -1,
-  round_toward_zero         =  0,
-  round_to_nearest          =  1,
-  round_toward_infinity     =  2,
-  round_toward_neg_infinity =  3
-};
-
-enum float_denorm_style {
-  denorm_indeterminate = -1,
-  denorm_absent        =  0,
-  denorm_present       =  1
-};
-
-// The C++ standard (section 18.2.1) requires that some of the members of
-// numeric_limits be static const data members that are given constant-
-// initializers within the class declaration.  On compilers where the
-// BOOST_NO_INCLASS_MEMBER_INITIALIZATION macro is defined, it is impossible to write
-// a standard-conforming numeric_limits class.
-//
-// There are two possible workarounds: either initialize the data
-// members outside the class, or change them from data members to
-// enums.  Neither workaround is satisfactory: the former makes it
-// impossible to use the data members in constant-expressions, and the
-// latter means they have the wrong type and that it is impossible to
-// take their addresses.  We choose the former workaround.
-
-#ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
-# define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \
-  enum { __mem_name = __mem_value }
-#else /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */
-# define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \
-  static const __mem_type __mem_name = __mem_value
-#endif /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */
-
-// Base class for all specializations of numeric_limits.
-template <class __number>
-class _Numeric_limits_base {
-public:
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false);
-
-  static __number min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); }
-  static __number max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __number(); }
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits,   0);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, 0);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed,  false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact,   false);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 0);
-
-  static __number epsilon() throw()     { return __number(); }
-  static __number round_error() throw() { return __number(); }
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent,   0);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent,   0);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity,      false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN,     false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style,
-                              has_denorm,
-                              denorm_absent);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss,   false);
-
-  static __number infinity() throw()      { return __number(); }
-  static __number quiet_NaN() throw()     { return __number(); }
-  static __number signaling_NaN() throw() { return __number(); }
-  static __number denorm_min() throw()    { return __number(); }
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559,  false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo,  false);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps,            false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before,  false);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style,
-                              round_style,
-                              round_toward_zero);
-};
-
-// Base class for integers.
-
-template <class _Int,
-          _Int __imin,
-          _Int __imax,
-          int __idigits = -1>
-class _Integer_limits : public _Numeric_limits_base<_Int> 
-{
-public:
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true);
-
-  static _Int min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imin; }
-  static _Int max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return __imax; }
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int,
-                              digits,
-                              (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT)
-                                                   - (__imin == 0 ? 0 : 1) 
-                                              : __idigits);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); 
-                                // log 2 = 0.301029995664...
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed,  __imin != 0);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact,   true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int,  radix,      2);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, true);
-};
-
-#if defined(BOOST_BIG_ENDIAN)
-
- template<class Number, unsigned int Word>
- struct float_helper{
-  static Number get_word() throw() {
-    // sizeof(long double) == 16
-    const unsigned int _S_word[4] = { Word, 0, 0, 0 };
-    return *reinterpret_cast<const Number*>(&_S_word);
-  } 
-};
-
-#else
-
- template<class Number, unsigned int Word>
- struct float_helper{
-  static Number get_word() throw() {
-    // sizeof(long double) == 12, but only 10 bytes significant
-    const unsigned int _S_word[4] = { 0, 0, 0, Word };
-    return *reinterpret_cast<const Number*>(
-        reinterpret_cast<const char *>(&_S_word)+16-
-                (sizeof(Number) == 12 ? 10 : sizeof(Number)));
-  } 
-};
-
-#endif
-
-// Base class for floating-point numbers.
-template <class __number,
-         int __Digits, int __Digits10,
-         int __MinExp, int __MaxExp,
-         int __MinExp10, int __MaxExp10,
-         unsigned int __InfinityWord,
-         unsigned int __QNaNWord, unsigned int __SNaNWord,
-         bool __IsIEC559,
-         float_round_style __RoundStyle>
-class _Floating_limits : public _Numeric_limits_base<__number>
-{
-public:
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits,   __Digits);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent,   __MinExp);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent,   __MaxExp);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity,      true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN,     true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style,
-                              has_denorm,
-                              denorm_indeterminate);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss,   false);
-
- 
-  static __number infinity() throw() {
-    return float_helper<__number, __InfinityWord>::get_word();
-  }
-  static __number quiet_NaN() throw() {
-    return float_helper<__number,__QNaNWord>::get_word();
-  }
-  static __number signaling_NaN() throw() {
-    return float_helper<__number,__SNaNWord>::get_word();
-  }
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559,       __IsIEC559);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded,      true);
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps,           false /* was: true */ );
-  BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false);
-
-  BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle);
-};
-
-// Class numeric_limits
-
-// The unspecialized class.
-
-template<class T> 
-class numeric_limits : public _Numeric_limits_base<T> {};
-
-// Specializations for all built-in integral types.
-
-template<>
-class numeric_limits<bool>
-  : public _Integer_limits<bool, false, true, 0>
-{};
-
-template<>
-class numeric_limits<char>
-  : public _Integer_limits<char, CHAR_MIN, CHAR_MAX>
-{};
-
-template<>
-class numeric_limits<signed char>
-  : public _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX>
-{};
-
-template<>
-class numeric_limits<unsigned char>
-  : public _Integer_limits<unsigned char, 0, UCHAR_MAX>
-{};
-
-#ifndef BOOST_NO_INTRINSIC_WCHAR_T
-template<>
-class numeric_limits<wchar_t>
-#if !defined(WCHAR_MAX) || !defined(WCHAR_MIN)
-#if defined(_WIN32) || defined(__CYGWIN__)
-  : public _Integer_limits<wchar_t, 0, USHRT_MAX>
-#elif defined(__hppa)
-// wchar_t has "unsigned int" as the underlying type
-  : public _Integer_limits<wchar_t, 0, UINT_MAX>
-#else
-// assume that wchar_t has "int" as the underlying type
-  : public _Integer_limits<wchar_t, INT_MIN, INT_MAX>
-#endif
-#else
-// we have WCHAR_MIN and WCHAR_MAX defined, so use it
-  : public _Integer_limits<wchar_t, WCHAR_MIN, WCHAR_MAX>
-#endif
-{};
-#endif
-
-template<>
-class numeric_limits<short>
-  : public _Integer_limits<short, SHRT_MIN, SHRT_MAX>
-{};
-
-template<>
-class numeric_limits<unsigned short>
-  : public _Integer_limits<unsigned short, 0, USHRT_MAX>
-{};
-
-template<>
-class numeric_limits<int>
-  : public _Integer_limits<int, INT_MIN, INT_MAX>
-{};
-
-template<>
-class numeric_limits<unsigned int>
-  : public _Integer_limits<unsigned int, 0, UINT_MAX>
-{};
-
-template<>
-class numeric_limits<long>
-  : public _Integer_limits<long, LONG_MIN, LONG_MAX>
-{};
-
-template<>
-class numeric_limits<unsigned long>
-  : public _Integer_limits<unsigned long, 0, ULONG_MAX>
-{};
-
-#ifdef __GNUC__
-
-// Some compilers have long long, but don't define the
-// LONGLONG_MIN and LONGLONG_MAX macros in limits.h.  This
-// assumes that long long is 64 bits.
-#if !defined(LONGLONG_MAX) && !defined(ULONGLONG_MAX)
-
-# define ULONGLONG_MAX 0xffffffffffffffffLLU
-# define LONGLONG_MAX 0x7fffffffffffffffLL
-
-#endif
-
-#if !defined(LONGLONG_MIN)
-# define LONGLONG_MIN (-LONGLONG_MAX - 1)
-#endif 
-
-
-#if !defined(ULONGLONG_MIN)
-# define ULONGLONG_MIN 0
-#endif 
-
-#endif /* __GNUC__ */
-
-// Specializations for all built-in floating-point type.
-
-template<> class numeric_limits<float>
-  : public _Floating_limits<float, 
-                            FLT_MANT_DIG,   // Binary digits of precision
-                            FLT_DIG,        // Decimal digits of precision
-                            FLT_MIN_EXP,    // Minimum exponent
-                            FLT_MAX_EXP,    // Maximum exponent
-                            FLT_MIN_10_EXP, // Minimum base 10 exponent
-                            FLT_MAX_10_EXP, // Maximum base 10 exponent
-#if defined(BOOST_BIG_ENDIAN)
-                            0x7f80 << (sizeof(int)*CHAR_BIT-16),    // Last word of +infinity
-                            0x7f81 << (sizeof(int)*CHAR_BIT-16),    // Last word of quiet NaN
-                            0x7fc1 << (sizeof(int)*CHAR_BIT-16),    // Last word of signaling NaN
-#else
-                            0x7f800000u,    // Last word of +infinity
-                            0x7f810000u,    // Last word of quiet NaN
-                            0x7fc10000u,    // Last word of signaling NaN
-#endif
-                            true,           // conforms to iec559
-                            round_to_nearest>
-{
-public:
-  static float min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MIN; }
-  static float denorm_min() throw() { return FLT_MIN; }
-  static float max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return FLT_MAX; }
-  static float epsilon() throw() { return FLT_EPSILON; }
-  static float round_error() throw() { return 0.5f; } // Units: ulps.
-};
-
-template<> class numeric_limits<double>
-  : public _Floating_limits<double, 
-                            DBL_MANT_DIG,   // Binary digits of precision
-                            DBL_DIG,        // Decimal digits of precision
-                            DBL_MIN_EXP,    // Minimum exponent
-                            DBL_MAX_EXP,    // Maximum exponent
-                            DBL_MIN_10_EXP, // Minimum base 10 exponent
-                            DBL_MAX_10_EXP, // Maximum base 10 exponent
-#if defined(BOOST_BIG_ENDIAN)
-                            0x7ff0 << (sizeof(int)*CHAR_BIT-16),    // Last word of +infinity
-                            0x7ff1 << (sizeof(int)*CHAR_BIT-16),    // Last word of quiet NaN
-                            0x7ff9 << (sizeof(int)*CHAR_BIT-16),    // Last word of signaling NaN
-#else
-                            0x7ff00000u,    // Last word of +infinity
-                            0x7ff10000u,    // Last word of quiet NaN
-                            0x7ff90000u,    // Last word of signaling NaN
-#endif
-                            true,           // conforms to iec559
-                            round_to_nearest>
-{
-public:
-  static double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MIN; }
-  static double denorm_min() throw() { return DBL_MIN; }
-  static double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return DBL_MAX; }
-  static double epsilon() throw() { return DBL_EPSILON; }
-  static double round_error() throw() { return 0.5; } // Units: ulps.
-};
-
-template<> class numeric_limits<long double>
-  : public _Floating_limits<long double, 
-                            LDBL_MANT_DIG,  // Binary digits of precision
-                            LDBL_DIG,       // Decimal digits of precision
-                            LDBL_MIN_EXP,   // Minimum exponent
-                            LDBL_MAX_EXP,   // Maximum exponent
-                            LDBL_MIN_10_EXP,// Minimum base 10 exponent
-                            LDBL_MAX_10_EXP,// Maximum base 10 exponent
-#if defined(BOOST_BIG_ENDIAN)
-                            0x7ff0 << (sizeof(int)*CHAR_BIT-16),    // Last word of +infinity
-                            0x7ff1 << (sizeof(int)*CHAR_BIT-16),    // Last word of quiet NaN
-                            0x7ff9 << (sizeof(int)*CHAR_BIT-16),    // Last word of signaling NaN
-#else
-                            0x7fff8000u,    // Last word of +infinity
-                            0x7fffc000u,    // Last word of quiet NaN
-                            0x7fff9000u,    // Last word of signaling NaN
-#endif
-                            false,          // Doesn't conform to iec559
-                            round_to_nearest>
-{
-public:
-  static long double min BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MIN; }
-  static long double denorm_min() throw() { return LDBL_MIN; }
-  static long double max BOOST_PREVENT_MACRO_SUBSTITUTION () throw() { return LDBL_MAX; }
-  static long double epsilon() throw() { return LDBL_EPSILON; }
-  static long double round_error() throw() { return 4; } // Units: ulps.
-};
-
-} // namespace std
-
-#endif /* BOOST_SGI_CPP_LIMITS */
-
-// Local Variables:
-// mode:C++
-// End:
-
-
-
--- a/DEPENDENCIES/generic/include/boost/detail/none_t.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
-//
-// Use, modification, and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/optional for documentation.
-//
-// You are welcome to contact the author at:
-//  fernando_cacciola@hotmail.com
-//
-#ifndef BOOST_DETAIL_NONE_T_17SEP2003_HPP
-#define BOOST_DETAIL_NONE_T_17SEP2003_HPP
-
-namespace boost {
-
-namespace detail {
-
-struct none_helper{};
-
-typedef int none_helper::*none_t ;
-
-} // namespace detail
-
-} // namespace boost
-
-#endif
-
--- a/DEPENDENCIES/generic/include/boost/detail/ob_call_traits.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
-//  Use, modification and distribution are subject to the Boost Software License,
-//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt).
-//
-//  See http://www.boost.org/libs/utility for most recent version including documentation.
-//
-//  Crippled version for crippled compilers:
-//  see libs/utility/call_traits.htm
-//
-
-/* Release notes:
-   01st October 2000:
-      Fixed call_traits on VC6, using "poor man's partial specialisation",
-      using ideas taken from "Generative programming" by Krzysztof Czarnecki 
-      & Ulrich Eisenecker.
-*/
-
-#ifndef BOOST_OB_CALL_TRAITS_HPP
-#define BOOST_OB_CALL_TRAITS_HPP
-
-#ifndef BOOST_CONFIG_HPP
-#include <boost/config.hpp>
-#endif
-
-#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP
-#include <boost/type_traits/arithmetic_traits.hpp>
-#endif
-#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP
-#include <boost/type_traits/composite_traits.hpp>
-#endif
-
-namespace boost{
-
-#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
-//
-// use member templates to emulate
-// partial specialisation:
-//
-namespace detail{
-
-template <class T>
-struct standard_call_traits
-{
-   typedef T value_type;
-   typedef T& reference;
-   typedef const T& const_reference;
-   typedef const T& param_type;
-};
-template <class T>
-struct simple_call_traits
-{
-   typedef T value_type;
-   typedef T& reference;
-   typedef const T& const_reference;
-   typedef const T param_type;
-};
-template <class T>
-struct reference_call_traits
-{
-   typedef T value_type;
-   typedef T reference;
-   typedef T const_reference;
-   typedef T param_type;
-};
-
-template <bool pointer, bool arithmetic, bool reference>
-struct call_traits_chooser
-{
-   template <class T>
-   struct rebind
-   {
-      typedef standard_call_traits<T> type;
-   };
-};
-
-template <>
-struct call_traits_chooser<true, false, false>
-{
-   template <class T>
-   struct rebind
-   {
-      typedef simple_call_traits<T> type;
-   };
-};
-
-template <>
-struct call_traits_chooser<false, false, true>
-{
-   template <class T>
-   struct rebind
-   {
-      typedef reference_call_traits<T> type;
-   };
-};
-
-template <bool size_is_small> 
-struct call_traits_sizeof_chooser2
-{
-   template <class T>
-   struct small_rebind
-   {
-      typedef simple_call_traits<T> small_type;
-   };
-};
-
-template<> 
-struct call_traits_sizeof_chooser2<false>
-{
-   template <class T>
-   struct small_rebind
-   {
-      typedef standard_call_traits<T> small_type;
-   };
-};
-
-template <>
-struct call_traits_chooser<false, true, false>
-{
-   template <class T>
-   struct rebind
-   {
-      enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) };
-      typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser;
-      typedef typename chooser::template small_rebind<T> bound_type;
-      typedef typename bound_type::small_type type;
-   };
-};
-
-} // namespace detail
-template <typename T>
-struct call_traits
-{
-private:
-    typedef detail::call_traits_chooser<
-         ::boost::is_pointer<T>::value,
-         ::boost::is_arithmetic<T>::value, 
-         ::boost::is_reference<T>::value
-      > chooser;
-   typedef typename chooser::template rebind<T> bound_type;
-   typedef typename bound_type::type call_traits_type;
-public:
-   typedef typename call_traits_type::value_type       value_type;
-   typedef typename call_traits_type::reference        reference;
-   typedef typename call_traits_type::const_reference  const_reference;
-   typedef typename call_traits_type::param_type       param_type;
-};
-
-#else
-//
-// sorry call_traits is completely non-functional
-// blame your broken compiler:
-//
-
-template <typename T>
-struct call_traits
-{
-   typedef T value_type;
-   typedef T& reference;
-   typedef const T& const_reference;
-   typedef const T& param_type;
-};
-
-#endif // member templates
-
-}
-
-#endif // BOOST_OB_CALL_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/winapi/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,53 @@
+//  config.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
+#define BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+// These constants reflect _WIN32_WINNT_* macros from sdkddkver.h
+// See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx#setting_winver_or__win32_winnt
+#define BOOST_WINAPI_VERSION_NT4 0x0400
+#define BOOST_WINAPI_VERSION_WIN2K 0x0500
+#define BOOST_WINAPI_VERSION_WINXP 0x0501
+#define BOOST_WINAPI_VERSION_WS03 0x0502
+#define BOOST_WINAPI_VERSION_WIN6 0x0600
+#define BOOST_WINAPI_VERSION_VISTA 0x0600
+#define BOOST_WINAPI_VERSION_WS08 0x0600
+#define BOOST_WINAPI_VERSION_LONGHORN 0x0600
+#define BOOST_WINAPI_VERSION_WIN7 0x0601
+#define BOOST_WINAPI_VERSION_WIN8 0x0602
+#define BOOST_WINAPI_VERSION_WINBLUE 0x0603
+
+#if !defined(BOOST_USE_WINAPI_VERSION)
+#if defined(_WIN32_WINNT)
+#define BOOST_USE_WINAPI_VERSION _WIN32_WINNT
+#elif defined(WINVER)
+#define BOOST_USE_WINAPI_VERSION WINVER
+#else
+// By default use Windows XP API
+#define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WINXP
+#endif
+#endif
+
+#if defined(BOOST_USE_WINDOWS_H)
+// We have to define the version macros so that windows.h provides the necessary symbols
+#if !defined(_WIN32_WINNT)
+#define _WIN32_WINNT BOOST_USE_WINAPI_VERSION
+#endif
+#if !defined(WINVER)
+#define WINVER BOOST_USE_WINAPI_VERSION
+#endif
+#endif
+
+#endif // BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/winapi/crypt.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,88 @@
+//  crypt.hpp  --------------------------------------------------------------//
+
+//  Copyright 2014 Antony Polukhin
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CRYPT_HPP
+#define BOOST_DETAIL_WINAPI_CRYPT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+    typedef HCRYPTPROV HCRYPTPROV_;
+
+    using ::CryptEnumProvidersA;
+    using ::CryptAcquireContextA;
+    using ::CryptGenRandom;
+    using ::CryptReleaseContext;
+
+    const DWORD_ PROV_RSA_FULL_         = PROV_RSA_FULL;
+
+    const DWORD_ CRYPT_VERIFYCONTEXT_   = CRYPT_VERIFYCONTEXT;
+    const DWORD_ CRYPT_NEWKEYSET_       = CRYPT_NEWKEYSET;
+    const DWORD_ CRYPT_DELETEKEYSET_    = CRYPT_DELETEKEYSET;
+    const DWORD_ CRYPT_MACHINE_KEYSET_  = CRYPT_MACHINE_KEYSET;
+    const DWORD_ CRYPT_SILENT_          = CRYPT_SILENT;
+#else
+extern "C" {
+    typedef ULONG_PTR_ HCRYPTPROV_;
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptEnumProvidersA(
+            DWORD_ dwIndex,
+            DWORD_ *pdwReserved,
+            DWORD_ dwFlags,
+            DWORD_ *pdwProvType,
+            LPSTR_ szProvName,
+            DWORD_ *pcbProvName
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptAcquireContextA(
+            HCRYPTPROV_ *phProv,
+            LPCSTR_ pszContainer,
+            LPCSTR_ pszProvider,
+            DWORD_ dwProvType,
+            DWORD_ dwFlags
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptGenRandom(
+            HCRYPTPROV_ hProv,
+            DWORD_ dwLen,
+            BYTE_ *pbBuffer
+    );
+
+    __declspec(dllimport) BOOL_ __stdcall
+        CryptReleaseContext(
+            HCRYPTPROV_ hProv,
+            DWORD_ dwFlags
+    );
+
+    const DWORD_ PROV_RSA_FULL_         = 1;
+
+    const DWORD_ CRYPT_VERIFYCONTEXT_   = 0xF0000000;
+    const DWORD_ CRYPT_NEWKEYSET_       = 8;
+    const DWORD_ CRYPT_DELETEKEYSET_    = 16;
+    const DWORD_ CRYPT_MACHINE_KEYSET_  = 32;
+    const DWORD_ CRYPT_SILENT_          = 64;
+}
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_CRYPT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/winapi/thread_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,96 @@
+//  thread_pool.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
+#define BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+typedef ::WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACKFUNC_;
+typedef ::WAITORTIMERCALLBACK WAITORTIMERCALLBACK_;
+
+using ::RegisterWaitForSingleObject;
+using ::UnregisterWait;
+using ::UnregisterWaitEx;
+
+const ULONG_ wt_execute_default = WT_EXECUTEDEFAULT;
+const ULONG_ wt_execute_in_io_thread = WT_EXECUTEINIOTHREAD;
+const ULONG_ wt_execute_in_ui_thread = WT_EXECUTEINUITHREAD;
+const ULONG_ wt_execute_in_wait_thread = WT_EXECUTEINWAITTHREAD;
+const ULONG_ wt_execute_only_once = WT_EXECUTEONLYONCE;
+const ULONG_ wt_execute_in_timer_thread = WT_EXECUTEINTIMERTHREAD;
+const ULONG_ wt_execute_long_function = WT_EXECUTELONGFUNCTION;
+const ULONG_ wt_execute_in_persistent_io_thread = WT_EXECUTEINPERSISTENTIOTHREAD;
+const ULONG_ wt_execute_in_persistent_thread = WT_EXECUTEINPERSISTENTTHREAD;
+const ULONG_ wt_transfer_impersonation = WT_TRANSFER_IMPERSONATION;
+
+inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
+{
+    return WT_SET_MAX_THREADPOOL_THREADS(flags, limit);
+}
+
+#else
+
+extern "C" {
+
+typedef void (NTAPI* WAITORTIMERCALLBACKFUNC_) (PVOID_, BOOLEAN_);
+typedef WAITORTIMERCALLBACKFUNC_ WAITORTIMERCALLBACK_;
+
+__declspec(dllimport) BOOL_ WINAPI RegisterWaitForSingleObject
+(
+    HANDLE_* phNewWaitObject,
+    HANDLE_ hObject,
+    WAITORTIMERCALLBACK_ Callback,
+    PVOID_ Context,
+    ULONG_ dwMilliseconds,
+    ULONG_ dwFlags
+);
+
+__declspec(dllimport) BOOL_ WINAPI UnregisterWait(HANDLE_ WaitHandle);
+__declspec(dllimport) BOOL_ WINAPI UnregisterWaitEx(HANDLE_ WaitHandle, HANDLE_ CompletionEvent);
+
+} // extern "C"
+
+const ULONG_ wt_execute_default = 0x00000000;
+const ULONG_ wt_execute_in_io_thread = 0x00000001;
+const ULONG_ wt_execute_in_ui_thread = 0x00000002;
+const ULONG_ wt_execute_in_wait_thread = 0x00000004;
+const ULONG_ wt_execute_only_once = 0x00000008;
+const ULONG_ wt_execute_in_timer_thread = 0x00000020;
+const ULONG_ wt_execute_long_function = 0x00000010;
+const ULONG_ wt_execute_in_persistent_io_thread = 0x00000040;
+const ULONG_ wt_execute_in_persistent_thread = 0x00000080;
+const ULONG_ wt_transfer_impersonation = 0x00000100;
+
+inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
+{
+    return flags | (limit << 16);
+}
+
+#endif
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
+
+#endif // BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/winapi/tls.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+//  tls.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_TLS_HPP
+#define BOOST_DETAIL_WINAPI_TLS_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+using ::TlsAlloc;
+using ::TlsGetValue;
+using ::TlsSetValue;
+using ::TlsFree;
+
+const DWORD_ tls_out_of_indexes = TLS_OUT_OF_INDEXES;
+
+#else
+
+extern "C" {
+__declspec(dllimport) DWORD_ WINAPI TlsAlloc(void);
+__declspec(dllimport) LPVOID_ WINAPI TlsGetValue(DWORD_ dwTlsIndex);
+__declspec(dllimport) BOOL_ WINAPI TlsSetValue(DWORD_ dwTlsIndex, LPVOID_ lpTlsValue);
+__declspec(dllimport) BOOL_ WINAPI TlsFree(DWORD_ dwTlsIndex);
+}
+
+const DWORD_ tls_out_of_indexes = 0xFFFFFFFF;
+
+#endif
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_TLS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/detail/winapi/waitable_timer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,110 @@
+//  waitable_timer.hpp  --------------------------------------------------------------//
+
+//  Copyright 2013 Andrey Semashev
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
+#define BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost
+{
+namespace detail
+{
+namespace winapi
+{
+#if defined( BOOST_USE_WINDOWS_H )
+
+typedef ::PTIMERAPCROUTINE PTIMERAPCROUTINE_;
+
+# ifdef BOOST_NO_ANSI_APIS
+using ::CreateWaitableTimerW;
+using ::OpenWaitableTimerW;
+# else
+using ::CreateWaitableTimerA;
+using ::OpenWaitableTimerA;
+# endif
+using ::SetWaitableTimer;
+using ::CancelWaitableTimer;
+
+#else
+
+extern "C" {
+
+struct _SECURITY_ATTRIBUTES;
+
+typedef void (WINAPI* PTIMERAPCROUTINE_)
+(
+    LPVOID_ lpArgToCompletionRoutine,
+    DWORD_ dwTimerLowValue,
+    DWORD_ dwTimerHighValue
+);
+
+# ifdef BOOST_NO_ANSI_APIS
+__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerW
+(
+    _SECURITY_ATTRIBUTES* lpTimerAttributes,
+    BOOL_ bManualReset,
+    LPCWSTR_ lpTimerName
+);
+
+__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerW
+(
+    DWORD_ dwDesiredAccess,
+    BOOL_ bInheritHandle,
+    LPCWSTR_ lpTimerName
+);
+# else
+__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerA
+(
+    _SECURITY_ATTRIBUTES* lpTimerAttributes,
+    BOOL_ bManualReset,
+    LPCSTR_ lpTimerName
+);
+
+__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerA
+(
+    DWORD_ dwDesiredAccess,
+    BOOL_ bInheritHandle,
+    LPCSTR_ lpTimerName
+);
+# endif
+
+__declspec(dllimport) BOOL_ WINAPI SetWaitableTimer
+(
+    HANDLE_ hTimer,
+    const LARGE_INTEGER_ *lpDueTime,
+    LONG_ lPeriod,
+    PTIMERAPCROUTINE_ pfnCompletionRoutine,
+    LPVOID_ lpArgToCompletionRoutine,
+    BOOL_ fResume
+);
+
+__declspec(dllimport) BOOL_ WINAPI CancelWaitableTimer(HANDLE_ hTimer);
+
+}
+
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_waitable_timer(_SECURITY_ATTRIBUTES* lpTimerAttributes, BOOL_ bManualReset)
+{
+#ifdef BOOST_NO_ANSI_APIS
+    return CreateWaitableTimerW(lpTimerAttributes, bManualReset, 0);
+#else
+    return CreateWaitableTimerA(lpTimerAttributes, bManualReset, 0);
+#endif
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_WAITABLE_TIMER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/arithmetic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,413 @@
+//  boost/endian/arithmetic.hpp  -------------------------------------------------------//
+
+//  (C) Copyright Darin Adler 2000
+//  (C) Copyright Beman Dawes 2006, 2009, 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See library home page at http://www.boost.org/libs/endian
+
+//--------------------------------------------------------------------------------------//
+
+//  Original design developed by Darin Adler based on classes developed by Mark
+//  Borgerding. Four original class templates were combined into a single endian
+//  class template by Beman Dawes, who also added the unrolled_byte_loops sign
+//  partial specialization to correctly extend the sign when cover integer size
+//  differs from endian representation size.
+
+// TODO: When a compiler supporting constexpr becomes available, try possible uses.
+
+#ifndef BOOST_ENDIAN_ARITHMETIC_HPP
+#define BOOST_ENDIAN_ARITHMETIC_HPP
+
+#if defined(_MSC_VER)  
+# pragma warning(push)  
+# pragma warning(disable:4365)  // conversion ... signed/unsigned mismatch
+#endif
+
+#ifdef BOOST_ENDIAN_LOG
+# include <iostream>
+#endif
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(push, 1)
+#endif
+
+#include <boost/config.hpp>
+#include <boost/predef/detail/endian_compat.h>
+#include <boost/endian/conversion.hpp>
+#include <boost/endian/buffers.hpp>
+#define  BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+#include <boost/endian/detail/cover_operators.hpp>
+#undef   BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/core/scoped_enum.hpp>
+#include <iosfwd>
+#include <climits>
+
+# if CHAR_BIT != 8
+#   error Platforms with CHAR_BIT != 8 are not supported
+# endif
+
+# ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#   define BOOST_ENDIAN_DEFAULT_CONSTRUCT {}          // C++03
+# else
+#   define BOOST_ENDIAN_DEFAULT_CONSTRUCT = default;  // C++0x
+# endif
+
+# if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && defined(BOOST_ENDIAN_FORCE_PODNESS)
+#   define BOOST_ENDIAN_NO_CTORS
+# endif
+
+# ifndef BOOST_ENDIAN_EXPLICIT_CTORS
+#   define BOOST_ENDIAN_EXPLICIT_OPT
+# else
+#   define BOOST_ENDIAN_EXPLICIT_OPT explicit
+# endif
+
+//----------------------------------  synopsis  ----------------------------------------//
+
+namespace boost
+{
+namespace endian
+{
+
+  template <BOOST_SCOPED_ENUM(order) Order, class T, std::size_t n_bits,
+    BOOST_SCOPED_ENUM(align) A = align::no>
+      class endian_arithmetic;
+
+  // big endian signed integer aligned types
+  typedef endian_arithmetic<order::big, int8_t, 8, align::yes>        big_int8_at;
+  typedef endian_arithmetic<order::big, int16_t, 16, align::yes>      big_int16_at;
+  typedef endian_arithmetic<order::big, int32_t, 32, align::yes>      big_int32_at;
+  typedef endian_arithmetic<order::big, int64_t, 64, align::yes>      big_int64_at;
+
+  // big endian unsigned integer aligned types
+  typedef endian_arithmetic<order::big, uint8_t, 8, align::yes>       big_uint8_at;
+  typedef endian_arithmetic<order::big, uint16_t, 16, align::yes>     big_uint16_at;
+  typedef endian_arithmetic<order::big, uint32_t, 32, align::yes>     big_uint32_at;
+  typedef endian_arithmetic<order::big, uint64_t, 64, align::yes>     big_uint64_at;
+
+  // little endian signed integer aligned types
+  typedef endian_arithmetic<order::little, int8_t, 8, align::yes>     little_int8_at;
+  typedef endian_arithmetic<order::little, int16_t, 16, align::yes>   little_int16_at;
+  typedef endian_arithmetic<order::little, int32_t, 32, align::yes>   little_int32_at;
+  typedef endian_arithmetic<order::little, int64_t, 64, align::yes>   little_int64_at;
+
+  // little endian unsigned integer aligned types
+  typedef endian_arithmetic<order::little, uint8_t, 8, align::yes>    little_uint8_at;
+  typedef endian_arithmetic<order::little, uint16_t, 16, align::yes>  little_uint16_at;
+  typedef endian_arithmetic<order::little, uint32_t, 32, align::yes>  little_uint32_at;
+  typedef endian_arithmetic<order::little, uint64_t, 64, align::yes>  little_uint64_at;
+
+  // aligned native endian typedefs are not provided because
+  // <cstdint> types are superior for this use case
+
+  // big endian signed integer unaligned types
+  typedef endian_arithmetic<order::big, int_least8_t, 8>        big_int8_t;
+  typedef endian_arithmetic<order::big, int_least16_t, 16>      big_int16_t;
+  typedef endian_arithmetic<order::big, int_least32_t, 24>      big_int24_t;
+  typedef endian_arithmetic<order::big, int_least32_t, 32>      big_int32_t;
+  typedef endian_arithmetic<order::big, int_least64_t, 40>      big_int40_t;
+  typedef endian_arithmetic<order::big, int_least64_t, 48>      big_int48_t;
+  typedef endian_arithmetic<order::big, int_least64_t, 56>      big_int56_t;
+  typedef endian_arithmetic<order::big, int_least64_t, 64>      big_int64_t;
+
+  // big endian unsigned integer unaligned types
+  typedef endian_arithmetic<order::big, uint_least8_t, 8>       big_uint8_t;
+  typedef endian_arithmetic<order::big, uint_least16_t, 16>     big_uint16_t;
+  typedef endian_arithmetic<order::big, uint_least32_t, 24>     big_uint24_t;
+  typedef endian_arithmetic<order::big, uint_least32_t, 32>     big_uint32_t;
+  typedef endian_arithmetic<order::big, uint_least64_t, 40>     big_uint40_t;
+  typedef endian_arithmetic<order::big, uint_least64_t, 48>     big_uint48_t;
+  typedef endian_arithmetic<order::big, uint_least64_t, 56>     big_uint56_t;
+  typedef endian_arithmetic<order::big, uint_least64_t, 64>     big_uint64_t;
+
+  // little endian signed integer unaligned types
+  typedef endian_arithmetic<order::little, int_least8_t, 8>     little_int8_t;
+  typedef endian_arithmetic<order::little, int_least16_t, 16>   little_int16_t;
+  typedef endian_arithmetic<order::little, int_least32_t, 24>   little_int24_t;
+  typedef endian_arithmetic<order::little, int_least32_t, 32>   little_int32_t;
+  typedef endian_arithmetic<order::little, int_least64_t, 40>   little_int40_t;
+  typedef endian_arithmetic<order::little, int_least64_t, 48>   little_int48_t;
+  typedef endian_arithmetic<order::little, int_least64_t, 56>   little_int56_t;
+  typedef endian_arithmetic<order::little, int_least64_t, 64>   little_int64_t;
+
+  // little endian unsigned integer unaligned types
+  typedef endian_arithmetic<order::little, uint_least8_t, 8>    little_uint8_t;
+  typedef endian_arithmetic<order::little, uint_least16_t, 16>  little_uint16_t;
+  typedef endian_arithmetic<order::little, uint_least32_t, 24>  little_uint24_t;
+  typedef endian_arithmetic<order::little, uint_least32_t, 32>  little_uint32_t;
+  typedef endian_arithmetic<order::little, uint_least64_t, 40>  little_uint40_t;
+  typedef endian_arithmetic<order::little, uint_least64_t, 48>  little_uint48_t;
+  typedef endian_arithmetic<order::little, uint_least64_t, 56>  little_uint56_t;
+  typedef endian_arithmetic<order::little, uint_least64_t, 64>  little_uint64_t;
+
+# ifdef BOOST_BIG_ENDIAN
+  // native endian signed integer unaligned types
+  typedef big_int8_t   native_int8_t;
+  typedef big_int16_t  native_int16_t;
+  typedef big_int24_t  native_int24_t;
+  typedef big_int32_t  native_int32_t;
+  typedef big_int40_t  native_int40_t;
+  typedef big_int48_t  native_int48_t;
+  typedef big_int56_t  native_int56_t;
+  typedef big_int64_t  native_int64_t;
+
+  // native endian unsigned integer unaligned types
+  typedef big_uint8_t   native_uint8_t;
+  typedef big_uint16_t  native_uint16_t;
+  typedef big_uint24_t  native_uint24_t;
+  typedef big_uint32_t  native_uint32_t;
+  typedef big_uint40_t  native_uint40_t;
+  typedef big_uint48_t  native_uint48_t;
+  typedef big_uint56_t  native_uint56_t;
+  typedef big_uint64_t  native_uint64_t;
+# else
+  // native endian signed integer unaligned types
+  typedef little_int8_t   native_int8_t;
+  typedef little_int16_t  native_int16_t;
+  typedef little_int24_t  native_int24_t;
+  typedef little_int32_t  native_int32_t;
+  typedef little_int40_t  native_int40_t;
+  typedef little_int48_t  native_int48_t;
+  typedef little_int56_t  native_int56_t;
+  typedef little_int64_t  native_int64_t;
+
+  // native endian unsigned integer unaligned types
+  typedef little_uint8_t   native_uint8_t;
+  typedef little_uint16_t  native_uint16_t;
+  typedef little_uint24_t  native_uint24_t;
+  typedef little_uint32_t  native_uint32_t;
+  typedef little_uint40_t  native_uint40_t;
+  typedef little_uint48_t  native_uint48_t;
+  typedef little_uint56_t  native_uint56_t;
+  typedef little_uint64_t  native_uint64_t;
+# endif
+
+# ifdef BOOST_ENDIAN_DEPRECATED_NAMES
+
+  typedef order endianness;
+  typedef align alignment;
+
+# ifndef  BOOST_NO_CXX11_TEMPLATE_ALIASES
+  template <BOOST_SCOPED_ENUM(order) Order, class T, std::size_t n_bits,
+    BOOST_SCOPED_ENUM(align) Align = align::no>
+  using endian = endian_arithmetic<Order, T, n_bits, Align>;
+# endif
+
+  // unaligned big endian signed integer types
+  typedef endian_arithmetic< order::big, int_least8_t, 8 >           big8_t;
+  typedef endian_arithmetic< order::big, int_least16_t, 16 >         big16_t;
+  typedef endian_arithmetic< order::big, int_least32_t, 24 >         big24_t;
+  typedef endian_arithmetic< order::big, int_least32_t, 32 >         big32_t;
+  typedef endian_arithmetic< order::big, int_least64_t, 40 >         big40_t;
+  typedef endian_arithmetic< order::big, int_least64_t, 48 >         big48_t;
+  typedef endian_arithmetic< order::big, int_least64_t, 56 >         big56_t;
+  typedef endian_arithmetic< order::big, int_least64_t, 64 >         big64_t;
+
+  // unaligned big endian_arithmetic unsigned integer types
+  typedef endian_arithmetic< order::big, uint_least8_t, 8 >          ubig8_t;
+  typedef endian_arithmetic< order::big, uint_least16_t, 16 >        ubig16_t;
+  typedef endian_arithmetic< order::big, uint_least32_t, 24 >        ubig24_t;
+  typedef endian_arithmetic< order::big, uint_least32_t, 32 >        ubig32_t;
+  typedef endian_arithmetic< order::big, uint_least64_t, 40 >        ubig40_t;
+  typedef endian_arithmetic< order::big, uint_least64_t, 48 >        ubig48_t;
+  typedef endian_arithmetic< order::big, uint_least64_t, 56 >        ubig56_t;
+  typedef endian_arithmetic< order::big, uint_least64_t, 64 >        ubig64_t;
+
+  // unaligned little endian_arithmetic signed integer types
+  typedef endian_arithmetic< order::little, int_least8_t, 8 >        little8_t;
+  typedef endian_arithmetic< order::little, int_least16_t, 16 >      little16_t;
+  typedef endian_arithmetic< order::little, int_least32_t, 24 >      little24_t;
+  typedef endian_arithmetic< order::little, int_least32_t, 32 >      little32_t;
+  typedef endian_arithmetic< order::little, int_least64_t, 40 >      little40_t;
+  typedef endian_arithmetic< order::little, int_least64_t, 48 >      little48_t;
+  typedef endian_arithmetic< order::little, int_least64_t, 56 >      little56_t;
+  typedef endian_arithmetic< order::little, int_least64_t, 64 >      little64_t;
+
+  // unaligned little endian_arithmetic unsigned integer types
+  typedef endian_arithmetic< order::little, uint_least8_t, 8 >       ulittle8_t;
+  typedef endian_arithmetic< order::little, uint_least16_t, 16 >     ulittle16_t;
+  typedef endian_arithmetic< order::little, uint_least32_t, 24 >     ulittle24_t;
+  typedef endian_arithmetic< order::little, uint_least32_t, 32 >     ulittle32_t;
+  typedef endian_arithmetic< order::little, uint_least64_t, 40 >     ulittle40_t;
+  typedef endian_arithmetic< order::little, uint_least64_t, 48 >     ulittle48_t;
+  typedef endian_arithmetic< order::little, uint_least64_t, 56 >     ulittle56_t;
+  typedef endian_arithmetic< order::little, uint_least64_t, 64 >     ulittle64_t;
+
+  // unaligned native endian_arithmetic signed integer types
+  typedef endian_arithmetic< order::native, int_least8_t, 8 >        native8_t;
+  typedef endian_arithmetic< order::native, int_least16_t, 16 >      native16_t;
+  typedef endian_arithmetic< order::native, int_least32_t, 24 >      native24_t;
+  typedef endian_arithmetic< order::native, int_least32_t, 32 >      native32_t;
+  typedef endian_arithmetic< order::native, int_least64_t, 40 >      native40_t;
+  typedef endian_arithmetic< order::native, int_least64_t, 48 >      native48_t;
+  typedef endian_arithmetic< order::native, int_least64_t, 56 >      native56_t;
+  typedef endian_arithmetic< order::native, int_least64_t, 64 >      native64_t;
+
+  // unaligned native endian_arithmetic unsigned integer types
+  typedef endian_arithmetic< order::native, uint_least8_t, 8 >       unative8_t;
+  typedef endian_arithmetic< order::native, uint_least16_t, 16 >     unative16_t;
+  typedef endian_arithmetic< order::native, uint_least32_t, 24 >     unative24_t;
+  typedef endian_arithmetic< order::native, uint_least32_t, 32 >     unative32_t;
+  typedef endian_arithmetic< order::native, uint_least64_t, 40 >     unative40_t;
+  typedef endian_arithmetic< order::native, uint_least64_t, 48 >     unative48_t;
+  typedef endian_arithmetic< order::native, uint_least64_t, 56 >     unative56_t;
+  typedef endian_arithmetic< order::native, uint_least64_t, 64 >     unative64_t;
+
+  //     aligned native endian_arithmetic typedefs are not provided because
+  //     <cstdint> types are superior for this use case
+
+  typedef endian_arithmetic< order::big, int16_t, 16, align::yes >      aligned_big16_t;
+  typedef endian_arithmetic< order::big, uint16_t, 16, align::yes >     aligned_ubig16_t;
+  typedef endian_arithmetic< order::little, int16_t, 16, align::yes >   aligned_little16_t;
+  typedef endian_arithmetic< order::little, uint16_t, 16, align::yes >  aligned_ulittle16_t;
+
+  typedef endian_arithmetic< order::big, int32_t, 32, align::yes >      aligned_big32_t;
+  typedef endian_arithmetic< order::big, uint32_t, 32, align::yes >     aligned_ubig32_t;
+  typedef endian_arithmetic< order::little, int32_t, 32, align::yes >   aligned_little32_t;
+  typedef endian_arithmetic< order::little, uint32_t, 32, align::yes >  aligned_ulittle32_t;
+
+  typedef endian_arithmetic< order::big, int64_t, 64, align::yes >      aligned_big64_t;
+  typedef endian_arithmetic< order::big, uint64_t, 64, align::yes >     aligned_ubig64_t;
+  typedef endian_arithmetic< order::little, int64_t, 64, align::yes >   aligned_little64_t;
+  typedef endian_arithmetic< order::little, uint64_t, 64, align::yes >  aligned_ulittle64_t;
+
+# endif
+
+//----------------------------------  end synopsis  ------------------------------------//
+
+//  endian class template specializations  ---------------------------------------------//
+
+    //  Specializations that represent unaligned bytes.
+    //  Taking an integer type as a parameter provides a nice way to pass both
+    //  the size and signness of the desired integer and get the appropriate
+    //  corresponding integer type for the interface.
+
+    //  unaligned integer big endian specialization
+    template <typename T, std::size_t n_bits>
+    class endian_arithmetic< order::big, T, n_bits, align::no >
+      : public endian_buffer< order::big, T, n_bits, align::no >,
+        cover_operators<endian_arithmetic<order::big, T, n_bits>, T>
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_arithmetic() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        BOOST_ENDIAN_EXPLICIT_OPT endian_arithmetic(T val) BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, unaligned, " << n_bits << "-bits, construct(" << val << ")\n";
+#       endif
+          detail::store_big_endian<T, n_bits/8>(this->m_value, val);
+        }
+#     endif
+        endian_arithmetic& operator=(T val) BOOST_NOEXCEPT
+          { detail::store_big_endian<T, n_bits/8>(this->m_value, val); return *this; }
+        operator value_type() const BOOST_NOEXCEPT { return this->value(); }
+    };
+
+    //  unaligned little endian specialization
+    template <typename T, std::size_t n_bits>
+    class endian_arithmetic< order::little, T, n_bits, align::no >
+      : public endian_buffer< order::little, T, n_bits, align::no >,
+        cover_operators< endian_arithmetic< order::little, T, n_bits >, T >
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_arithmetic() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        BOOST_ENDIAN_EXPLICIT_OPT endian_arithmetic(T val) BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, unaligned, " << n_bits << "-bits, construct(" << val << ")\n";
+#       endif
+          detail::store_little_endian<T, n_bits/8>(this->m_value, val);
+        }
+#     endif
+        endian_arithmetic& operator=(T val) BOOST_NOEXCEPT
+          { detail::store_little_endian<T, n_bits/8>(this->m_value, val); return *this; }
+        operator value_type() const BOOST_NOEXCEPT { return this->value(); }
+    };
+
+  //  align::yes specializations; only n_bits == 16/32/64 supported
+
+    //  aligned big endian specialization
+    template <typename T, std::size_t n_bits>
+    class endian_arithmetic<order::big, T, n_bits, align::yes>
+      : public endian_buffer< order::big, T, n_bits, align::yes >,
+        cover_operators<endian_arithmetic<order::big, T, n_bits, align::yes>, T>
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+        BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_arithmetic() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        BOOST_ENDIAN_EXPLICIT_OPT endian_arithmetic(T val) BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, aligned, " << n_bits << "-bits, construct(" << val << ")\n";
+#       endif
+          this->m_value = ::boost::endian::native_to_big(val);
+        }
+
+#     endif  
+        endian_arithmetic& operator=(T val) BOOST_NOEXCEPT
+        {
+          this->m_value = ::boost::endian::native_to_big(val);
+          return *this;
+        }
+        operator value_type() const BOOST_NOEXCEPT { return this->value(); }
+    };
+
+    //  aligned little endian specialization
+    template <typename T, std::size_t n_bits>
+    class endian_arithmetic<order::little, T, n_bits, align::yes>
+      : public endian_buffer< order::little, T, n_bits, align::yes >,
+        cover_operators<endian_arithmetic<order::little, T, n_bits, align::yes>, T>
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+        BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_arithmetic() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        BOOST_ENDIAN_EXPLICIT_OPT endian_arithmetic(T val) BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, aligned, " << n_bits << "-bits, construct(" << val << ")\n";
+#       endif
+          this->m_value = ::boost::endian::native_to_little(val);
+        }
+#     endif  
+        endian_arithmetic& operator=(T val) BOOST_NOEXCEPT
+        {
+          this->m_value = ::boost::endian::native_to_little(val);
+          return *this;
+        }
+        operator value_type() const BOOST_NOEXCEPT { return this->value(); }
+    };
+
+} // namespace endian
+} // namespace boost
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(pop)
+#endif
+
+#if defined(_MSC_VER)  
+# pragma warning(pop)  
+#endif 
+
+#endif // BOOST_ENDIAN_ARITHMETIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/buffers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,515 @@
+//  boost/endian/buffers.hpp  ----------------------------------------------------------//
+
+//  (C) Copyright Darin Adler 2000
+//  (C) Copyright Beman Dawes 2006, 2009, 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See library home page at http://www.boost.org/libs/endian
+
+//--------------------------------------------------------------------------------------//
+
+//  Original design developed by Darin Adler based on classes developed by Mark
+//  Borgerding. Four original class templates were combined into a single endian
+//  class template by Beman Dawes, who also added the unrolled_byte_loops sign
+//  partial specialization to correctly extend the sign when cover integer size
+//  differs from endian representation size.
+
+// TODO: When a compiler supporting constexpr becomes available, try possible uses.
+
+#ifndef BOOST_ENDIAN_BUFFERS_HPP
+#define BOOST_ENDIAN_BUFFERS_HPP
+
+#if defined(_MSC_VER)  
+# pragma warning(push)  
+# pragma warning(disable:4365)  // conversion ... signed/unsigned mismatch
+#endif
+
+#ifdef BOOST_ENDIAN_LOG
+# include <iostream>
+#endif
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(push, 1)
+#endif
+
+#include <boost/config.hpp>
+#include <boost/predef/detail/endian_compat.h>
+#include <boost/endian/conversion.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/core/scoped_enum.hpp>
+#include <iosfwd>
+#include <climits>
+
+# if CHAR_BIT != 8
+#   error Platforms with CHAR_BIT != 8 are not supported
+# endif
+
+# ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#   define BOOST_ENDIAN_DEFAULT_CONSTRUCT {}          // C++03
+# else
+#   define BOOST_ENDIAN_DEFAULT_CONSTRUCT = default;  // C++0x
+# endif
+
+# if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && defined(BOOST_ENDIAN_FORCE_PODNESS)
+#   define BOOST_ENDIAN_NO_CTORS
+# endif
+
+//----------------------------------  synopsis  ----------------------------------------//
+
+namespace boost
+{
+namespace endian
+{
+
+  BOOST_SCOPED_ENUM_START(align)
+  {no, yes
+#   ifdef BOOST_ENDIAN_DEPRECATED_NAMES
+      , unaligned = no, aligned = yes
+#   endif
+  }; BOOST_SCOPED_ENUM_END
+
+  template <BOOST_SCOPED_ENUM(order) Order, class T, std::size_t n_bits,
+    BOOST_SCOPED_ENUM(align) A = align::no>
+      class endian_buffer;
+
+  // aligned big endian signed integer buffers
+  typedef endian_buffer<order::big, int8_t, 8, align::yes>       big_int8_buf_at;
+  typedef endian_buffer<order::big, int16_t, 16, align::yes>     big_int16_buf_at;
+  typedef endian_buffer<order::big, int32_t, 32, align::yes>     big_int32_buf_at;
+  typedef endian_buffer<order::big, int64_t, 64, align::yes>     big_int64_buf_at;
+
+  // aligned big endian unsigned integer buffers
+  typedef endian_buffer<order::big, uint8_t, 8, align::yes>      big_uint8_buf_at;
+  typedef endian_buffer<order::big, uint16_t, 16, align::yes>    big_uint16_buf_at;
+  typedef endian_buffer<order::big, uint32_t, 32, align::yes>    big_uint32_buf_at;
+  typedef endian_buffer<order::big, uint64_t, 64, align::yes>    big_uint64_buf_at;
+
+  // aligned little endian signed integer buffers
+  typedef endian_buffer<order::little, int8_t, 8, align::yes>    little_int8_buf_at;
+  typedef endian_buffer<order::little, int16_t, 16, align::yes>  little_int16_buf_at;
+  typedef endian_buffer<order::little, int32_t, 32, align::yes>  little_int32_buf_at;
+  typedef endian_buffer<order::little, int64_t, 64, align::yes>  little_int64_buf_at;
+
+  // aligned little endian unsigned integer buffers
+  typedef endian_buffer<order::little, uint8_t, 8, align::yes>   little_uint8_buf_at;
+  typedef endian_buffer<order::little, uint16_t, 16, align::yes> little_uint16_buf_at;
+  typedef endian_buffer<order::little, uint32_t, 32, align::yes> little_uint32_buf_at;
+  typedef endian_buffer<order::little, uint64_t, 64, align::yes> little_uint64_buf_at;
+
+  // aligned native endian typedefs are not provided because
+  // <cstdint> types are superior for this use case
+
+  // unaligned big endian signed integer buffers
+  typedef endian_buffer<order::big, int_least8_t, 8>        big_int8_buf_t;
+  typedef endian_buffer<order::big, int_least16_t, 16>      big_int16_buf_t;
+  typedef endian_buffer<order::big, int_least32_t, 24>      big_int24_buf_t;
+  typedef endian_buffer<order::big, int_least32_t, 32>      big_int32_buf_t;
+  typedef endian_buffer<order::big, int_least64_t, 40>      big_int40_buf_t;
+  typedef endian_buffer<order::big, int_least64_t, 48>      big_int48_buf_t;
+  typedef endian_buffer<order::big, int_least64_t, 56>      big_int56_buf_t;
+  typedef endian_buffer<order::big, int_least64_t, 64>      big_int64_buf_t;
+
+  // unaligned big endian unsigned integer buffers
+  typedef endian_buffer<order::big, uint_least8_t, 8>       big_uint8_buf_t;
+  typedef endian_buffer<order::big, uint_least16_t, 16>     big_uint16_buf_t;
+  typedef endian_buffer<order::big, uint_least32_t, 24>     big_uint24_buf_t;
+  typedef endian_buffer<order::big, uint_least32_t, 32>     big_uint32_buf_t;
+  typedef endian_buffer<order::big, uint_least64_t, 40>     big_uint40_buf_t;
+  typedef endian_buffer<order::big, uint_least64_t, 48>     big_uint48_buf_t;
+  typedef endian_buffer<order::big, uint_least64_t, 56>     big_uint56_buf_t;
+  typedef endian_buffer<order::big, uint_least64_t, 64>     big_uint64_buf_t;
+
+  // unaligned little endian signed integer buffers
+  typedef endian_buffer<order::little, int_least8_t, 8>     little_int8_buf_t;
+  typedef endian_buffer<order::little, int_least16_t, 16>   little_int16_buf_t;
+  typedef endian_buffer<order::little, int_least32_t, 24>   little_int24_buf_t;
+  typedef endian_buffer<order::little, int_least32_t, 32>   little_int32_buf_t;
+  typedef endian_buffer<order::little, int_least64_t, 40>   little_int40_buf_t;
+  typedef endian_buffer<order::little, int_least64_t, 48>   little_int48_buf_t;
+  typedef endian_buffer<order::little, int_least64_t, 56>   little_int56_buf_t;
+  typedef endian_buffer<order::little, int_least64_t, 64>   little_int64_buf_t;
+
+  // unaligned little endian unsigned integer buffers
+  typedef endian_buffer<order::little, uint_least8_t, 8>    little_uint8_buf_t;
+  typedef endian_buffer<order::little, uint_least16_t, 16>  little_uint16_buf_t;
+  typedef endian_buffer<order::little, uint_least32_t, 24>  little_uint24_buf_t;
+  typedef endian_buffer<order::little, uint_least32_t, 32>  little_uint32_buf_t;
+  typedef endian_buffer<order::little, uint_least64_t, 40>  little_uint40_buf_t;
+  typedef endian_buffer<order::little, uint_least64_t, 48>  little_uint48_buf_t;
+  typedef endian_buffer<order::little, uint_least64_t, 56>  little_uint56_buf_t;
+  typedef endian_buffer<order::little, uint_least64_t, 64>  little_uint64_buf_t;
+
+# ifdef BOOST_BIG_ENDIAN
+  // unaligned native endian signed integer buffers
+  typedef big_int8_buf_t   native_int8_buf_t;
+  typedef big_int16_buf_t  native_int16_buf_t;
+  typedef big_int24_buf_t  native_int24_buf_t;
+  typedef big_int32_buf_t  native_int32_buf_t;
+  typedef big_int40_buf_t  native_int40_buf_t;
+  typedef big_int48_buf_t  native_int48_buf_t;
+  typedef big_int56_buf_t  native_int56_buf_t;
+  typedef big_int64_buf_t  native_int64_buf_t;
+
+  // unaligned native endian unsigned integer buffers
+  typedef big_uint8_buf_t   native_uint8_buf_t;
+  typedef big_uint16_buf_t  native_uint16_buf_t;
+  typedef big_uint24_buf_t  native_uint24_buf_t;
+  typedef big_uint32_buf_t  native_uint32_buf_t;
+  typedef big_uint40_buf_t  native_uint40_buf_t;
+  typedef big_uint48_buf_t  native_uint48_buf_t;
+  typedef big_uint56_buf_t  native_uint56_buf_t;
+  typedef big_uint64_buf_t  native_uint64_buf_t;
+# else
+  // unaligned native endian signed integer buffers
+  typedef little_int8_buf_t   native_int8_buf_t;
+  typedef little_int16_buf_t  native_int16_buf_t;
+  typedef little_int24_buf_t  native_int24_buf_t;
+  typedef little_int32_buf_t  native_int32_buf_t;
+  typedef little_int40_buf_t  native_int40_buf_t;
+  typedef little_int48_buf_t  native_int48_buf_t;
+  typedef little_int56_buf_t  native_int56_buf_t;
+  typedef little_int64_buf_t  native_int64_buf_t;
+
+  // unaligned native endian unsigned integer buffers
+  typedef little_uint8_buf_t   native_uint8_buf_t;
+  typedef little_uint16_buf_t  native_uint16_buf_t;
+  typedef little_uint24_buf_t  native_uint24_buf_t;
+  typedef little_uint32_buf_t  native_uint32_buf_t;
+  typedef little_uint40_buf_t  native_uint40_buf_t;
+  typedef little_uint48_buf_t  native_uint48_buf_t;
+  typedef little_uint56_buf_t  native_uint56_buf_t;
+  typedef little_uint64_buf_t  native_uint64_buf_t;
+# endif
+
+  // Stream inserter
+  template <class charT, class traits, BOOST_SCOPED_ENUM(order) Order, class T,
+    std::size_t n_bits, BOOST_SCOPED_ENUM(align) A>
+  std::basic_ostream<charT, traits>&
+    operator<<(std::basic_ostream<charT, traits>& os,
+      const endian_buffer<Order, T, n_bits, A>& x)
+  {
+    return os << x.value();
+  }
+
+  // Stream extractor 
+  template <class charT, class traits, BOOST_SCOPED_ENUM(order) Order, class T,
+    std::size_t n_bits, BOOST_SCOPED_ENUM(align) A>
+  std::basic_istream<charT, traits>&
+    operator>>(std::basic_istream<charT, traits>& is,
+      endian_buffer<Order, T, n_bits, A>& x)
+  {
+    T i;
+    if (is >> i)
+      x = i;
+    return is;
+  }
+
+//----------------------------------  end synopsis  ------------------------------------//
+
+  namespace detail
+  {
+
+    // Unrolled loops for loading and storing streams of bytes.
+
+    template <typename T, std::size_t n_bytes,
+      bool sign=boost::is_signed<T>::value >
+    struct unrolled_byte_loops
+    {
+      typedef unrolled_byte_loops<T, n_bytes - 1, sign> next;
+
+      static T load_big(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return static_cast<T>(*(bytes - 1) | (next::load_big(bytes - 1) << 8)); }
+      static T load_little(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return static_cast<T>(*bytes | (next::load_little(bytes + 1) << 8)); }
+
+      static void store_big(char* bytes, T value) BOOST_NOEXCEPT
+        {
+          *(bytes - 1) = static_cast<char>(value);
+          next::store_big(bytes - 1, static_cast<T>(value >> 8));
+        }
+      static void store_little(char* bytes, T value) BOOST_NOEXCEPT
+        {
+          *bytes = static_cast<char>(value);
+          next::store_little(bytes + 1, static_cast<T>(value >> 8));
+        }
+    };
+
+    template <typename T>
+    struct unrolled_byte_loops<T, 1, false>
+    {
+      static T load_big(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return *(bytes - 1); }
+      static T load_little(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return *bytes; }
+      static void store_big(char* bytes, T value) BOOST_NOEXCEPT
+        { *(bytes - 1) = static_cast<char>(value); }
+      static void store_little(char* bytes, T value) BOOST_NOEXCEPT
+        { *bytes = static_cast<char>(value); }
+
+    };
+
+    template <typename T>
+    struct unrolled_byte_loops<T, 1, true>
+    {
+      static T load_big(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return *reinterpret_cast<const signed char*>(bytes - 1); }
+      static T load_little(const unsigned char* bytes) BOOST_NOEXCEPT
+        { return *reinterpret_cast<const signed char*>(bytes); }
+      static void store_big(char* bytes, T value)  BOOST_NOEXCEPT
+        { *(bytes - 1) = static_cast<char>(value); }
+      static void store_little(char* bytes, T value) BOOST_NOEXCEPT
+        { *bytes = static_cast<char>(value); }
+    };
+
+    template <typename T, std::size_t n_bytes>
+    inline
+    T load_big_endian(const void* bytes) BOOST_NOEXCEPT
+    {
+      return unrolled_byte_loops<T, n_bytes>::load_big
+        (static_cast<const unsigned char*>(bytes) + n_bytes);
+    }
+
+    template <typename T, std::size_t n_bytes>
+    inline
+    T load_little_endian(const void* bytes) BOOST_NOEXCEPT
+    {
+#   if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
+      // On x86 (which is little endian), unaligned loads are permitted
+      if (sizeof(T) == n_bytes)  // GCC 4.9, VC++ 14.0, and probably others, elide this
+                                 // test and generate code only for the applicable return
+                                 // case since sizeof(T) and n_bytes are known at compile
+                                 // time.
+      {
+        return *reinterpret_cast<T const *>(bytes);
+      }
+#   endif
+      return unrolled_byte_loops<T, n_bytes>::load_little
+        (static_cast<const unsigned char*>(bytes));
+    }
+
+    template <typename T, std::size_t n_bytes>
+    inline
+    void store_big_endian(void* bytes, T value) BOOST_NOEXCEPT
+    {
+      unrolled_byte_loops<T, n_bytes>::store_big
+        (static_cast<char*>(bytes) + n_bytes, value);
+    }
+
+    template <typename T, std::size_t n_bytes>
+    inline
+    void store_little_endian(void* bytes, T value) BOOST_NOEXCEPT
+    {
+#     if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
+      // On x86 (which is little endian), unaligned stores are permitted
+      if (sizeof(T) == n_bytes)  // GCC 4.9, VC++ 14.0, and probably others, elide this
+                                 // test and generate code only for the applicable return
+                                 // case since sizeof(T) and n_bytes are known at compile
+                                 // time.
+      {
+        *reinterpret_cast<T *>(bytes) = value;
+        return;
+      }
+#     endif
+      unrolled_byte_loops<T, n_bytes>::store_little
+        (static_cast<char*>(bytes), value);
+    }
+
+  } // namespace detail
+
+# ifdef BOOST_ENDIAN_LOG
+    bool endian_log(true);
+# endif
+
+//  endian_buffer class template specializations  --------------------------------------//
+
+    //  Specializations that represent unaligned bytes.
+    //  Taking an integer type as a parameter provides a nice way to pass both
+    //  the size and signedness of the desired integer and get the appropriate
+    //  corresponding integer type for the interface.
+
+    // Q: Should endian_buffer supply "value_type operator value_type() const noexcept"?
+    // A: No. The rationale for endian_buffers is to prevent high-cost hidden
+    //    conversions. If an implicit conversion operator is supplied, hidden conversions
+    //    can occur.
+
+    //  unaligned big endian_buffer specialization
+    template <typename T, std::size_t n_bits>
+    class endian_buffer< order::big, T, n_bits, align::no >
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_buffer() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        explicit endian_buffer(T val) BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, unaligned, "
+              << n_bits << "-bits, construct(" << val << ")\n";
+#       endif
+          detail::store_big_endian<T, n_bits/8>(m_value, val);
+        }
+#     endif
+        endian_buffer & operator=(T val) BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if (endian_log)
+            std::cout << "big, unaligned, " << n_bits << "-bits, assign(" << val << ")\n";
+#       endif
+          detail::store_big_endian<T, n_bits/8>(m_value, val);
+          return *this;
+        }
+        value_type value() const BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, unaligned, " << n_bits << "-bits, convert("
+              << detail::load_big_endian<T, n_bits/8>(m_value) << ")\n";
+#       endif
+          return detail::load_big_endian<T, n_bits/8>(m_value);
+        }
+        const char* data() const BOOST_NOEXCEPT  { return m_value; }
+      protected:
+        char m_value[n_bits/8];
+    };
+
+    //  unaligned little endian_buffer specialization
+    template <typename T, std::size_t n_bits>
+    class endian_buffer< order::little, T, n_bits, align::no >
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_buffer() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        explicit endian_buffer(T val) BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, unaligned, " << n_bits << "-bits, construct("
+              << val << ")\n";
+#       endif
+          detail::store_little_endian<T, n_bits/8>(m_value, val);
+        }
+#     endif
+        endian_buffer & operator=(T val) BOOST_NOEXCEPT
+          { detail::store_little_endian<T, n_bits/8>(m_value, val); return *this; }
+        value_type value() const BOOST_NOEXCEPT
+        { 
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, unaligned, " << n_bits << "-bits, convert("
+              << detail::load_little_endian<T, n_bits/8>(m_value) << ")\n";
+#       endif
+          return detail::load_little_endian<T, n_bits/8>(m_value);
+        }
+        const char* data() const BOOST_NOEXCEPT  { return m_value; }
+      protected:
+        char m_value[n_bits/8];
+    };
+
+  //  align::yes specializations; only n_bits == 16/32/64 supported
+
+    //  aligned big endian_buffer specialization
+    template <typename T, std::size_t n_bits>
+    class endian_buffer<order::big, T, n_bits, align::yes>
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+        BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_buffer() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        explicit endian_buffer(T val) BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, aligned, " << n_bits
+              << "-bits, construct(" << val << ")\n";
+#       endif
+          m_value = ::boost::endian::native_to_big(val);
+        }
+
+#     endif  
+        endian_buffer& operator=(T val) BOOST_NOEXCEPT
+        {
+          m_value = ::boost::endian::native_to_big(val);
+          return *this;
+        }
+        //operator value_type() const BOOST_NOEXCEPT
+        //{                                                                       
+        //  return ::boost::endian::big_to_native(m_value);
+        //}
+        value_type value() const BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "big, aligned, " << n_bits << "-bits, convert("
+              << ::boost::endian::big_to_native(m_value) << ")\n";
+#       endif
+          return ::boost::endian::big_to_native(m_value);
+        }
+        const char* data() const BOOST_NOEXCEPT
+          {return reinterpret_cast<const char*>(&m_value);}
+      protected:
+        T m_value;
+    };
+
+    //  aligned little endian_buffer specialization
+    template <typename T, std::size_t n_bits>
+    class endian_buffer<order::little, T, n_bits, align::yes>
+    {
+        BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits );
+        BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 );
+      public:
+        typedef T value_type;
+#     ifndef BOOST_ENDIAN_NO_CTORS
+        endian_buffer() BOOST_ENDIAN_DEFAULT_CONSTRUCT
+        explicit endian_buffer(T val) BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, aligned, " << n_bits
+              << "-bits, construct(" << val << ")\n";
+#       endif
+          m_value = ::boost::endian::native_to_little(val);
+        }
+
+#     endif  
+        endian_buffer& operator=(T val) BOOST_NOEXCEPT
+        {
+          m_value = ::boost::endian::native_to_little(val);
+          return *this;
+        }
+        value_type value() const BOOST_NOEXCEPT
+        {
+#       ifdef BOOST_ENDIAN_LOG
+          if ( endian_log )
+            std::cout << "little, aligned, " << n_bits << "-bits, convert("
+              << ::boost::endian::little_to_native(m_value) << ")\n";
+#       endif
+          return ::boost::endian::little_to_native(m_value);
+        }
+        const char* data() const BOOST_NOEXCEPT
+          {return reinterpret_cast<const char*>(&m_value);}
+      protected:
+        T m_value;
+    };
+
+} // namespace endian
+} // namespace boost
+
+#if defined(__BORLANDC__) || defined( __CODEGEARC__)
+# pragma pack(pop)
+#endif
+
+#if defined(_MSC_VER)  
+# pragma warning(pop)  
+#endif 
+
+#endif // BOOST_ENDIAN_BUFFERS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/conversion.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,487 @@
+//  boost/endian/conversion.hpp  -------------------------------------------------------//
+
+//  Copyright Beman Dawes 2010, 2011, 2014
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_ENDIAN_CONVERSION_HPP
+#define BOOST_ENDIAN_CONVERSION_HPP
+
+#include <boost/config.hpp>
+#include <boost/predef/detail/endian_compat.h>
+#include <boost/cstdint.hpp>
+#include <boost/endian/detail/intrinsic.hpp>
+#include <boost/core/scoped_enum.hpp>
+#include <boost/static_assert.hpp>
+#include <algorithm>
+#include <cstring>  // for memcpy
+
+//------------------------------------- synopsis ---------------------------------------//
+
+namespace boost
+{
+namespace endian
+{
+#ifndef BOOST_ENDIAN_ORDER_ENUM_DEFINED
+  BOOST_SCOPED_ENUM_START(order)
+  {
+    big, little,
+# ifdef  BOOST_BIG_ENDIAN
+      native = big
+# else
+      native = little
+# endif
+  }; BOOST_SCOPED_ENUM_END
+# define BOOST_ENDIAN_ORDER_ENUM_DEFINED
+#endif
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//                             return-by-value interfaces                               //
+//                             suggested by Phil Endecott                               //
+//                                                                                      //
+//                             user-defined types (UDTs)                                //
+//                                                                                      //
+//  All return-by-value conversion function templates are required to be implemented in //
+//  terms of an unqualified call to "endian_reverse(x)", a function returning the       //
+//  value of x with endianness reversed. This provides a customization point for any    //
+//  UDT that provides a "endian_reverse" free-function meeting the requirements.        //
+//  It must be defined in the same namespace as the UDT itself so that it will be found //
+//  by argument dependent lookup (ADL).                                                 //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+  
+  //  customization for exact-length arithmetic types. See doc/conversion.html/#FAQ
+  inline int8_t   endian_reverse(int8_t x) BOOST_NOEXCEPT;
+  inline int16_t  endian_reverse(int16_t x) BOOST_NOEXCEPT;
+  inline int32_t  endian_reverse(int32_t x) BOOST_NOEXCEPT;
+  inline int64_t  endian_reverse(int64_t x) BOOST_NOEXCEPT;
+  inline uint8_t  endian_reverse(uint8_t x) BOOST_NOEXCEPT;
+  inline uint16_t endian_reverse(uint16_t x) BOOST_NOEXCEPT;
+  inline uint32_t endian_reverse(uint32_t x) BOOST_NOEXCEPT;
+  inline uint64_t endian_reverse(uint64_t x) BOOST_NOEXCEPT;
+
+  //  reverse byte order unless native endianness is big
+  template <class EndianReversible >
+    inline EndianReversible  big_to_native(EndianReversible  x) BOOST_NOEXCEPT;
+    //  Returns: x if native endian order is big, otherwise endian_reverse(x)
+  template <class EndianReversible >
+    inline EndianReversible  native_to_big(EndianReversible  x) BOOST_NOEXCEPT;
+    //  Returns: x if native endian order is big, otherwise endian_reverse(x)
+
+  //  reverse byte order unless native endianness is little
+  template <class EndianReversible >
+    inline EndianReversible  little_to_native(EndianReversible  x) BOOST_NOEXCEPT;
+    //  Returns: x if native endian order is little, otherwise endian_reverse(x)
+  template <class EndianReversible >
+    inline EndianReversible  native_to_little(EndianReversible  x) BOOST_NOEXCEPT;
+    //  Returns: x if native endian order is little, otherwise endian_reverse(x)
+
+  //  generic conditional reverse byte order
+  template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+    class EndianReversible>
+      inline EndianReversible  conditional_reverse(EndianReversible from) BOOST_NOEXCEPT;
+    //  Returns: If From == To have different values, from.
+    //           Otherwise endian_reverse(from).
+    //  Remarks: The From == To test, and as a consequence which form the return takes, is
+    //           is determined at compile time.
+
+  //  runtime conditional reverse byte order
+  template <class EndianReversible >
+    inline EndianReversible  conditional_reverse(EndianReversible from,
+      BOOST_SCOPED_ENUM(order) from_order, BOOST_SCOPED_ENUM(order) to_order)
+        BOOST_NOEXCEPT;
+      //  Returns: from_order == to_order ? from : endian_reverse(from).
+
+  //------------------------------------------------------------------------------------//
+
+
+  //  Q: What happended to bswap, htobe, and the other synonym functions based on names
+  //     popularized by BSD, OS X, and Linux?
+  //  A: Turned out these may be implemented as macros on some systems. Ditto POSIX names
+  //     for such functionality. Since macros would cause endless problems with functions
+  //     of the same names, and these functions are just synonyms anyhow, they have been
+  //     removed.
+
+
+  //------------------------------------------------------------------------------------//
+  //                                                                                    //
+  //                            reverse in place interfaces                             //
+  //                                                                                    //
+  //                             user-defined types (UDTs)                              //
+  //                                                                                    //
+  //  All reverse in place function templates are required to be implemented in terms   // 
+  //  of an unqualified call to "endian_reverse_inplace(x)", a function reversing       //
+  //  the endianness of x, which is a non-const reference. This provides a              //
+  //  customization point for any UDT that provides a "reverse_inplace" free-function   //
+  //  meeting the requirements. The free-function must be declared in the same          //
+  //  namespace as the UDT itself so that it will be found by argument-dependent        //
+  //   lookup (ADL).                                                                    //
+  //                                                                                    //
+  //------------------------------------------------------------------------------------//
+
+  //  reverse in place
+  template <class EndianReversible>
+    inline void endian_reverse_inplace(EndianReversible& x) BOOST_NOEXCEPT;
+    //  Effects: x = endian_reverse(x)
+
+  //  reverse in place unless native endianness is big
+  template <class EndianReversibleInplace>
+    inline void big_to_native_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT;
+    //  Effects: none if native byte-order is big, otherwise endian_reverse_inplace(x)
+  template <class EndianReversibleInplace>
+    inline void native_to_big_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT;
+    //  Effects: none if native byte-order is big, otherwise endian_reverse_inplace(x)
+
+  //  reverse in place unless native endianness is little
+  template <class EndianReversibleInplace>
+    inline void little_to_native_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT;
+    //  Effects: none if native byte-order is little, otherwise endian_reverse_inplace(x);
+  template <class EndianReversibleInplace>
+    inline void native_to_little_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT;
+    //  Effects: none if native byte-order is little, otherwise endian_reverse_inplace(x);
+
+  //  generic conditional reverse in place
+  template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+    class EndianReversibleInplace>
+  inline void conditional_reverse_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT; 
+
+  //  runtime reverse in place
+  template <class EndianReversibleInplace>
+  inline void conditional_reverse_inplace(EndianReversibleInplace& x,
+    BOOST_SCOPED_ENUM(order) from_order,  BOOST_SCOPED_ENUM(order) to_order)
+    BOOST_NOEXCEPT;
+
+//----------------------------------- end synopsis -------------------------------------//
+
+  namespace detail
+  {
+    //  generic reverse function template implementation approach using std::reverse
+    //  suggested by Mathias Gaunard. Primary motivation for inclusion is to have an
+    //  independent implementation to test against.
+
+    template <class T>
+    inline T std_endian_reverse(T x) BOOST_NOEXCEPT
+    {
+      T tmp(x);
+      std::reverse(
+        reinterpret_cast<unsigned char*>(&tmp),
+        reinterpret_cast<unsigned char*>(&tmp) + sizeof(T));
+      return tmp;
+    }
+
+    //  conditional unaligned reverse copy, patterned after std::reverse_copy
+    template <class T>
+      inline void big_reverse_copy(T from, char* to) BOOST_NOEXCEPT;
+    template <class T>
+      inline void big_reverse_copy(const char* from, T& to) BOOST_NOEXCEPT;
+    template <class T>
+      inline void little_reverse_copy(T from, char* to) BOOST_NOEXCEPT;
+    template <class T>
+      inline void little_reverse_copy(const char* from, T& to) BOOST_NOEXCEPT;
+  }  // namespace detail
+
+//--------------------------------------------------------------------------------------//
+//                                                                                      //
+//                            return-by-value implementation                            //
+//                                                                                      //
+//    -- portable approach suggested by tymofey, with avoidance of undefined behavior   //
+//       as suggested by Giovanni Piero Deretta, with a further refinement suggested    //
+//       by Pyry Jahkola.                                                               //
+//    -- intrinsic approach suggested by reviewers, and by David Stone, who provided    //
+//       his Boost licensed macro implementation (detail/intrinsic.hpp)                 //
+//                                                                                      //
+//--------------------------------------------------------------------------------------//
+
+  inline int8_t endian_reverse(int8_t x) BOOST_NOEXCEPT
+  {
+    return x;
+  }
+                                                
+  inline int16_t endian_reverse(int16_t x) BOOST_NOEXCEPT
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    return (static_cast<uint16_t>(x) << 8)
+      | (static_cast<uint16_t>(x) >> 8);
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(static_cast<uint16_t>(x));
+# endif
+  }
+
+  inline int32_t endian_reverse(int32_t x) BOOST_NOEXCEPT
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    uint32_t step16;
+    step16 = static_cast<uint32_t>(x) << 16 | static_cast<uint32_t>(x) >> 16;
+    return
+        ((static_cast<uint32_t>(step16) << 8) & 0xff00ff00)
+      | ((static_cast<uint32_t>(step16) >> 8) & 0x00ff00ff);
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_4(static_cast<uint32_t>(x));
+# endif
+  }
+
+  inline int64_t endian_reverse(int64_t x) BOOST_NOEXCEPT
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    uint64_t step32, step16;
+    step32 = static_cast<uint64_t>(x) << 32 | static_cast<uint64_t>(x) >> 32;
+    step16 = (step32 & 0x0000FFFF0000FFFFULL) << 16
+           | (step32 & 0xFFFF0000FFFF0000ULL) >> 16;
+    return static_cast<int64_t>((step16 & 0x00FF00FF00FF00FFULL) << 8
+           | (step16 & 0xFF00FF00FF00FF00ULL) >> 8);
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_8(static_cast<uint64_t>(x));
+# endif
+  }
+  
+  inline uint8_t endian_reverse(uint8_t x) BOOST_NOEXCEPT
+  {
+    return x;
+  }
+
+  inline uint16_t endian_reverse(uint16_t x) BOOST_NOEXCEPT
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    return (x << 8)
+      | (x >> 8);
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(x);
+# endif
+  }
+
+  inline uint32_t endian_reverse(uint32_t x) BOOST_NOEXCEPT                           
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    uint32_t step16;
+    step16 = x << 16 | x >> 16;
+    return
+        ((step16 << 8) & 0xff00ff00)
+      | ((step16 >> 8) & 0x00ff00ff);
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_4(x);
+# endif
+  }
+
+  inline uint64_t endian_reverse(uint64_t x) BOOST_NOEXCEPT
+  {
+# ifdef BOOST_ENDIAN_NO_INTRINSICS  
+    uint64_t step32, step16;
+    step32 = x << 32 | x >> 32;
+    step16 = (step32 & 0x0000FFFF0000FFFFULL) << 16
+           | (step32 & 0xFFFF0000FFFF0000ULL) >> 16;
+    return (step16 & 0x00FF00FF00FF00FFULL) << 8
+           | (step16 & 0xFF00FF00FF00FF00ULL) >> 8;
+# else
+    return BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_8(x);
+# endif
+  }
+
+  template <class EndianReversible >
+  inline EndianReversible  big_to_native(EndianReversible  x) BOOST_NOEXCEPT
+  {
+#   ifdef BOOST_BIG_ENDIAN
+    return x;
+#   else
+    return endian_reverse(x);
+#   endif
+  }
+
+  template <class EndianReversible >
+  inline EndianReversible  native_to_big(EndianReversible  x) BOOST_NOEXCEPT
+  {
+#   ifdef BOOST_BIG_ENDIAN
+    return x;
+#   else
+    return endian_reverse(x);
+#   endif
+  }
+
+  template <class EndianReversible >
+  inline EndianReversible  little_to_native(EndianReversible  x) BOOST_NOEXCEPT
+  {
+#   ifdef BOOST_LITTLE_ENDIAN
+    return x;
+#   else
+    return endian_reverse(x);
+#   endif
+  }
+
+  template <class EndianReversible >
+  inline EndianReversible  native_to_little(EndianReversible  x) BOOST_NOEXCEPT
+  {
+#   ifdef BOOST_LITTLE_ENDIAN
+    return x;
+#   else
+    return endian_reverse(x);
+#   endif
+  }
+
+  namespace detail
+  {
+    //  Primary template and specializations to support endian_reverse().
+    //  See rationale in endian_reverse() below.
+    template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+        class EndianReversible>
+      class value_converter ;  // primary template
+    template <class T> class value_converter <order::big, order::big, T>
+      {public: T operator()(T x) BOOST_NOEXCEPT {return x;}};
+    template <class T> class value_converter <order::little, order::little, T>
+      {public: T operator()(T x) BOOST_NOEXCEPT {return x;}};
+    template <class T> class value_converter <order::big, order::little, T>
+      {public: T operator()(T x) BOOST_NOEXCEPT {return endian_reverse(x);}};
+    template <class T> class value_converter <order::little, order::big, T>
+      {public: T operator()(T x) BOOST_NOEXCEPT {return endian_reverse(x);}};
+  }
+
+  //  generic conditional reverse
+  template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+    class EndianReversible>
+  inline EndianReversible  conditional_reverse(EndianReversible from) BOOST_NOEXCEPT  {
+    //  work around lack of function template partial specialization by instantiating
+    //  a function object of a class that is partially specialized on the two order
+    //  template parameters, and then calling its operator().
+    detail::value_converter <From, To, EndianReversible> tmp;
+    return tmp(from);
+  }
+
+  //  runtime conditional reverse
+  template <class EndianReversible >
+  inline EndianReversible  conditional_reverse(EndianReversible  from,
+    BOOST_SCOPED_ENUM(order) from_order, BOOST_SCOPED_ENUM(order) to_order) BOOST_NOEXCEPT
+  {
+    return from_order == to_order ? from : endian_reverse(from);
+  }
+
+//--------------------------------------------------------------------------------------//
+//                           reverse-in-place implementation                            //
+//--------------------------------------------------------------------------------------//
+
+  //  reverse in place
+  template <class EndianReversible>
+  inline void endian_reverse_inplace(EndianReversible& x) BOOST_NOEXCEPT
+  {
+    x = endian_reverse(x);
+  }
+
+  template <class EndianReversibleInplace>
+#   ifdef BOOST_BIG_ENDIAN
+  inline void big_to_native_inplace(EndianReversibleInplace&) BOOST_NOEXCEPT {}
+#   else
+  inline void big_to_native_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT
+    { endian_reverse_inplace(x); }
+#   endif
+  template <class EndianReversibleInplace>
+#   ifdef BOOST_BIG_ENDIAN
+  inline void native_to_big_inplace(EndianReversibleInplace&) BOOST_NOEXCEPT {}
+#   else
+  inline void native_to_big_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT
+  {
+    endian_reverse_inplace(x);
+  }
+#   endif
+
+  template <class EndianReversibleInplace>
+#   ifdef BOOST_LITTLE_ENDIAN
+  inline void little_to_native_inplace(EndianReversibleInplace&) BOOST_NOEXCEPT {}
+#   else
+  inline void little_to_native_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT
+    { endian_reverse_inplace(x); }
+#   endif
+  template <class EndianReversibleInplace>
+#   ifdef BOOST_LITTLE_ENDIAN
+  inline void native_to_little_inplace(EndianReversibleInplace&) BOOST_NOEXCEPT {}
+#   else
+  inline void native_to_little_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT
+  {
+    endian_reverse_inplace(x);
+  }
+#   endif
+
+  namespace detail
+  {
+    //  Primary template and specializations support generic 
+    //  endian_reverse_inplace().
+    //  See rationale in endian_reverse_inplace() below.
+    template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+        class EndianReversibleInplace>
+      class converter;  // primary template
+    template <class T> class converter<order::big, order::big, T>
+      {public: void operator()(T&) BOOST_NOEXCEPT {/*no effect*/}};
+    template <class T> class converter<order::little, order::little, T>
+      {public: void operator()(T&) BOOST_NOEXCEPT {/*no effect*/}};
+    template <class T> class converter<order::big, order::little, T>
+      {public: void operator()(T& x) BOOST_NOEXCEPT { endian_reverse_inplace(x); }};
+    template <class T> class converter<order::little, order::big, T>
+      {public: void operator()(T& x) BOOST_NOEXCEPT { endian_reverse_inplace(x); }};
+  }  // namespace detail
+
+  //  generic conditional reverse in place
+  template <BOOST_SCOPED_ENUM(order) From, BOOST_SCOPED_ENUM(order) To,
+    class EndianReversibleInplace>
+  inline void conditional_reverse_inplace(EndianReversibleInplace& x) BOOST_NOEXCEPT
+  {
+    //  work around lack of function template partial specialization by instantiating
+    //  a function object of a class that is partially specialized on the two order
+    //  template parameters, and then calling its operator().
+    detail::converter<From, To, EndianReversibleInplace> tmp;
+    tmp(x);  // call operator ()
+  }
+
+  //  runtime reverse in place
+  template <class EndianReversibleInplace>
+  inline void conditional_reverse_inplace(EndianReversibleInplace& x,
+    BOOST_SCOPED_ENUM(order) from_order,  BOOST_SCOPED_ENUM(order) to_order)
+    BOOST_NOEXCEPT
+  {
+    if (from_order != to_order)
+      endian_reverse_inplace(x);
+  }
+
+
+  namespace detail
+  {
+    template <class T>
+    inline void big_reverse_copy(T from, char* to) BOOST_NOEXCEPT
+    {
+#     ifdef BOOST_BIG_ENDIAN
+      std::memcpy(to, reinterpret_cast<const char*>(&from), sizeof(T));
+#     else
+      std::reverse_copy(reinterpret_cast<const char*>(&from),
+        reinterpret_cast<const char*>(&from) + sizeof(T), to);
+#     endif
+    }
+    template <class T>
+    inline void big_reverse_copy(const char* from, T& to) BOOST_NOEXCEPT
+    {
+#     ifdef BOOST_BIG_ENDIAN
+      std::memcpy(reinterpret_cast<char*>(&to), from, sizeof(T));
+#     else
+      std::reverse_copy(from, from + sizeof(T), reinterpret_cast<char*>(&to));
+#     endif
+    }
+    template <class T>
+    inline void little_reverse_copy(T from, char* to) BOOST_NOEXCEPT
+    {
+#     ifdef BOOST_LITTLE_ENDIAN
+      std::memcpy(to, reinterpret_cast<const char*>(&from), sizeof(T));
+#     else
+      std::reverse_copy(reinterpret_cast<const char*>(&from),
+        reinterpret_cast<const char*>(&from) + sizeof(T), to);
+#     endif
+    }
+    template <class T>
+    inline void little_reverse_copy(const char* from, T& to) BOOST_NOEXCEPT
+    {
+#     ifdef BOOST_LITTLE_ENDIAN
+      std::memcpy(reinterpret_cast<char*>(&to), from, sizeof(T));
+#     else
+      std::reverse_copy(from, from + sizeof(T), reinterpret_cast<char*>(&to));
+#     endif
+    }
+  }  // namespace detail
+}  // namespace endian
+}  // namespace boost
+
+#endif // BOOST_ENDIAN_CONVERSION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+//  boost/endian/detail/config.hpp  ----------------------------------------------------//
+
+//  Copyright Beman Dawes 2003, 2010
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------// 
+
+#ifndef BOOST_ENDIAN_CONFIG_HPP
+#define BOOST_ENDIAN_CONFIG_HPP
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+#include <boost/config.hpp>
+#include <boost/system/api_config.hpp>  // for BOOST_POSIX_API or BOOST_WINDOWS_API
+
+//  throw an exception  ----------------------------------------------------------------//
+//
+//  Exceptions were originally thrown via boost::throw_exception().
+//  As throw_exception() became more complex, it caused user error reporting
+//  to be harder to interpret, since the exception reported became much more complex.
+//  The immediate fix was to throw directly, wrapped in a macro to make any later change
+//  easier.
+
+#define BOOST_ENDIAN_THROW(EX) throw EX
+
+//  enable dynamic linking -------------------------------------------------------------//
+
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_ENDIAN_DYN_LINK)
+# if defined(BOOST_ENDIAN_SOURCE)
+#   define BOOST_ENDIAN_DECL BOOST_SYMBOL_EXPORT
+# else 
+#   define BOOST_ENDIAN_DECL BOOST_SYMBOL_IMPORT
+# endif
+#else
+# define BOOST_ENDIAN_DECL
+#endif
+
+//  enable automatic library variant selection  ----------------------------------------// 
+
+#if !defined(BOOST_ENDIAN_SOURCE) && !defined(BOOST_ALL_NO_LIB) \
+  && !defined(BOOST_ENDIAN_NO_LIB)
+//
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_endian
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_ENDIAN_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // BOOST_ENDIAN_CONFIG_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/cover_operators.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,142 @@
+//  boost/endian/detail/cover_operators.hpp ----------------------------------//
+
+//  Copyright Darin Adler 2000
+//  Copyright Beman Dawes 2008
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_ENDIAN_COVER_OPERATORS_HPP
+#define BOOST_ENDIAN_COVER_OPERATORS_HPP
+
+#if defined(_MSC_VER)  
+# pragma warning(push)  
+# pragma warning(disable:4365)  // conversion ... signed/unsigned mismatch
+#endif
+
+# ifndef BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+#   include <boost/operators.hpp>
+# endif
+
+#include <boost/config.hpp>
+#include <iosfwd>
+
+namespace boost
+{
+  namespace endian
+  {
+
+//--------------------------------------------------------------------------------------//
+
+//  A class that adds arithmetic operators to an arithmetic cover class
+//
+//  Uses the curiously recurring template pattern (CRTP).
+//
+//  If the class being covered has a non-explicit conversion to an integer type
+//  then a smaller number of cover operations are needed. Define the macro
+//  BOOST_ENDIAN_MINIMAL_COVER_OPERATORS to indicate this.
+//
+//  Define BOOST_NO_IO_COVER_OPERATORS if I/O cover operations are not desired.
+
+//--------------------------------------------------------------------------------------//
+
+    template <class D,   // D is the CRTP derived type, i.e. the cover class
+              class ArithmeticT>
+    class cover_operators
+#    ifndef BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+      : boost::operators<D>
+#    endif
+    {
+      // The other operations take advantage of the type conversion that's
+      // built into unary +.
+
+      // Unary operations.
+      friend ArithmeticT operator+(const D& x) BOOST_NOEXCEPT { return x; }
+#   ifndef BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+      friend ArithmeticT operator-(const D& x) BOOST_NOEXCEPT { return -+x; }
+      friend ArithmeticT operator~(const D& x) BOOST_NOEXCEPT { return ~+x; }
+      friend ArithmeticT operator!(const D& x) BOOST_NOEXCEPT { return !+x; }
+
+      // The basic ordering operations.
+      friend bool operator==(const D& x, ArithmeticT y) BOOST_NOEXCEPT { return +x == y; }
+      friend bool operator<(const D& x, ArithmeticT y) BOOST_NOEXCEPT { return +x < y; }
+#   endif
+      
+      // The basic arithmetic operations.
+      friend D& operator+=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x + y); }
+      friend D& operator-=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x - y); }
+      friend D& operator*=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x * y); }
+      friend D& operator/=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x / y); }
+      friend D& operator%=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x % y); }
+      friend D& operator&=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x & y); }
+      friend D& operator|=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x | y); }
+      friend D& operator^=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x ^ y); }
+      friend D& operator<<=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x << y); }
+      friend D& operator>>=(D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return x = static_cast<ArithmeticT>(+x >> y); }
+      
+      // A few binary arithmetic operations not covered by operators base class.
+      friend ArithmeticT operator<<(const D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return static_cast<ArithmeticT>(+x << y); }
+      friend ArithmeticT operator>>(const D& x, ArithmeticT y) BOOST_NOEXCEPT
+        { return static_cast<ArithmeticT>(+x >> y); }
+      
+      // Auto-increment and auto-decrement can be defined in terms of the
+      // arithmetic operations.
+      friend D& operator++(D& x) BOOST_NOEXCEPT { return x += 1; }
+      friend D& operator--(D& x) BOOST_NOEXCEPT { return x -= 1; }
+
+#   ifdef BOOST_ENDIAN_MINIMAL_COVER_OPERATORS
+      friend D operator++(D& x, int) BOOST_NOEXCEPT
+      { 
+        D tmp(x);
+        x += 1;
+        return tmp;
+      }
+      friend D operator--(D& x, int) BOOST_NOEXCEPT
+      { 
+        D tmp(x);
+        x -= 1;
+        return tmp;
+      }
+#   endif
+
+#   ifndef BOOST_NO_IO_COVER_OPERATORS
+
+      // Stream inserter
+      template <class charT, class traits>
+      friend std::basic_ostream<charT, traits>&
+        operator<<(std::basic_ostream<charT, traits>& os, const D& x)
+      {
+        return os << +x; 
+      }
+
+      // Stream extractor 
+      template <class charT, class traits>
+      friend std::basic_istream<charT, traits>&
+        operator>>(std::basic_istream<charT, traits>& is, D& x)
+      {
+        ArithmeticT i;
+        if (is >> i)
+          x = i;
+        return is;
+      }
+#   endif
+    };
+  } // namespace endian
+} // namespace boost
+
+#if defined(_MSC_VER)  
+# pragma warning(pop)  
+#endif 
+
+#endif // BOOST_ENDIAN_COVER_OPERATORS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/disable_warnings.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+//  disable_warnings.hpp  --------------------------------------------------------------//
+
+//  Copyright Beman Dawes 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+
+#ifdef  _MSC_VER
+
+#ifndef _SCL_SECURE_NO_WARNINGS
+# define _SCL_SECURE_NO_WARNINGS
+#endif
+
+#ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS
+#endif
+
+# pragma warning(push)
+
+// triggered by boost/detail/lightweight_test.hpp
+# pragma warning( disable : 4640 )  // ... construction of local static object is not thread-safe
+
+// triggered by Microsoft's own headers, so disable
+# pragma warning( disable : 4820 )  // padding added after data member
+# pragma warning( disable : 4548 )  // expression before comma has no effect
+# pragma warning( disable : 4668 )  // ... is not defined as a preprocessor macro
+# pragma warning( disable : 4514 )  // ... unreferenced inline function has been removed
+# pragma warning( disable : 4710 )  // ... function not inlined
+# pragma warning( disable : 4986 )  // ... exception specification does not match previous declaration
+# pragma warning( disable : 4711 )  // ... selected for automatic inline expansion
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/disable_warnings_pop.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,12 @@
+//  disable_warnings_pop.hpp  ----------------------------------------------------------//
+
+//  Copyright Beman Dawes 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+
+#ifdef  _MSC_VER
+# pragma warning(push)
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/intrinsic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+//  endian/detail/intrinsic.hpp  -------------------------------------------------------//
+
+//  Copyright (C) 2012 David Stone
+//  Copyright Beman Dawes 2013
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_ENDIAN_INTRINSIC_HPP
+#define BOOST_ENDIAN_INTRINSIC_HPP
+
+//  Allow user to force BOOST_ENDIAN_NO_INTRINSICS in case they aren't available for a
+//  particular platform/compiler combination. Please report such platform/compiler
+//  combinations to the Boost mailing list.
+#ifndef BOOST_ENDIAN_NO_INTRINSICS
+
+#ifndef __has_builtin         // Optional of course
+  #define __has_builtin(x) 0  // Compatibility with non-clang compilers
+#endif
+
+//  GCC and Clang recent versions provide intrinsic byte swaps via builtins
+#if (defined(__clang__) && __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64)) \
+  || (defined(__GNUC__ ) && \
+  (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
+# define BOOST_ENDIAN_INTRINSIC_MSG "__builtin_bswap16, etc."
+// prior to 4.8, gcc did not provide __builtin_bswap16 on some platforms so we emulate it
+// see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624
+// Clang has a similar problem, but their feature test macros make it easier to detect
+# if (defined(__clang__) && __has_builtin(__builtin_bswap16)) \
+  || (defined(__GNUC__) &&(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))
+#   define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(x) __builtin_bswap16(x)
+# else
+#   define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(x) __builtin_bswap32((x) << 16)
+# endif
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_4(x) __builtin_bswap32(x)
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_8(x) __builtin_bswap64(x)
+
+//  Linux systems provide the byteswap.h header, with 
+#elif defined(__linux__)
+//  don't check for obsolete forms defined(linux) and defined(__linux) on the theory that
+//  compilers that predefine only these are so old that byteswap.h probably isn't present.
+# define BOOST_ENDIAN_INTRINSIC_MSG "byteswap.h bswap_16, etc."
+# include <byteswap.h>
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(x) bswap_16(x)
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_4(x) bswap_32(x)
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_8(x) bswap_64(x)
+
+#elif defined(_MSC_VER)
+//  Microsoft documents these as being compatible since Windows 95 and specificly
+//  lists runtime library support since Visual Studio 2003 (aka 7.1).
+# define BOOST_ENDIAN_INTRINSIC_MSG "cstdlib _byteswap_ushort, etc."
+# include <cstdlib>
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_2(x) _byteswap_ushort(x)
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_4(x) _byteswap_ulong(x)
+# define BOOST_ENDIAN_INTRINSIC_BYTE_SWAP_8(x) _byteswap_uint64(x)
+#else
+# define BOOST_ENDIAN_NO_INTRINSICS
+# define BOOST_ENDIAN_INTRINSIC_MSG "no byte swap intrinsics"
+#endif
+
+#elif !defined(BOOST_ENDIAN_INTRINSIC_MSG)
+# define BOOST_ENDIAN_INTRINSIC_MSG "no byte swap intrinsics"
+#endif  // BOOST_ENDIAN_NO_INTRINSICS
+#endif  // BOOST_ENDIAN_INTRINSIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/detail/lightweight_test.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,223 @@
+// boost/endian/detail/lightweight_test.hpp --------------------------------------------//
+
+#ifndef BOOST_ENDIAN_LIGHTWEIGHT_TEST_HPP
+#define BOOST_ENDIAN_LIGHTWEIGHT_TEST_HPP
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+//
+//  Copyright (c) 2002, 2009, 2014 Peter Dimov
+//  Copyright (2) Beman Dawes 2010, 2011, 2015
+//  Copyright (3) Ion Gaztanaga 2013
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/assert.hpp>
+#include <boost/current_function.hpp>
+#include <boost/core/no_exceptions_support.hpp>
+#include <cstring>    // for memcmp
+#include <iostream>
+
+//  IDE's like Visual Studio perform better if output goes to std::cout or
+//  some other stream, so allow user to configure output stream:
+#ifndef BOOST_LIGHTWEIGHT_TEST_OSTREAM
+# define BOOST_LIGHTWEIGHT_TEST_OSTREAM std::cerr
+#endif
+
+namespace boost
+{
+namespace endian
+{
+namespace detail
+{
+
+struct report_errors_reminder
+{
+    bool called_report_errors_function;
+
+    report_errors_reminder() : called_report_errors_function(false) {}
+
+    ~report_errors_reminder()
+    {
+        BOOST_ASSERT(called_report_errors_function);  // verify report_errors() was called  
+    }
+};
+
+inline report_errors_reminder& report_errors_remind()
+{
+    static report_errors_reminder r;
+    return r;
+}
+
+inline int & test_errors()
+{
+    static int x = 0;
+    report_errors_remind();
+    return x;
+}
+
+inline void test_failed_impl(char const * expr, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): test '" << expr << "' failed in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void error_impl(char const * msg, char const * file, int line, char const * function)
+{
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): " << msg << " in function '"
+      << function << "'" << std::endl;
+    ++test_errors();
+}
+
+inline void throw_failed_impl(char const * excep, char const * file, int line, char const * function)
+{
+   BOOST_LIGHTWEIGHT_TEST_OSTREAM
+    << file << "(" << line << "): Exception '" << excep << "' not thrown in function '"
+    << function << "'" << std::endl;
+   ++test_errors();
+}
+
+template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t == u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " == " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' != '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+template<class T, class U> inline void test_ne_impl( char const * expr1, char const * expr2,
+  char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t != u )
+    {
+        report_errors_remind();
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+            << file << "(" << line << "): test '" << expr1 << " != " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' == '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
+template <class T>
+std::string to_hex(const T& x)
+{
+  const char hex[] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
+  std::string tmp;
+  const unsigned char* p = reinterpret_cast<const unsigned char*>(&x);
+  const unsigned char* e = p + sizeof(T);
+
+  for (; p < e; ++p)
+  {
+    tmp += hex[*p >> 4];    // high-order nibble
+    tmp += hex[*p & 0x0f];  // low-order nibble
+  }
+  return tmp;
+}
+
+template<class T, class U> inline bool test_memcmp_eq_impl(char const * expr1,
+  char const * expr2, char const * file, int line, char const * function, T const & t,
+  U const & u)
+{
+  BOOST_ASSERT(sizeof(T) == sizeof(U));
+  if (sizeof(T) == sizeof(U)
+    && std::memcmp(&t, &u, sizeof(T)) == 0)
+  {
+    report_errors_remind();
+    return true;
+  }
+  else
+  {
+    BOOST_LIGHTWEIGHT_TEST_OSTREAM
+      << file << "(" << line << "): test 'std::memcmp(" << expr1 << ", " << expr2
+      << ") == 0' fails in function '" << function << "': "
+      << " with values '" << to_hex(t) << "' and '" << to_hex(u) << "'" << std::endl;
+    ++test_errors();
+    return false;
+  }
+}
+
+} // namespace detail
+
+inline int report_errors()
+{
+    boost::endian::detail::report_errors_remind().called_report_errors_function = true;
+
+    int errors = boost::endian::detail::test_errors();
+
+    if( errors == 0 )
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << "No errors detected." << std::endl;
+        return 0;
+    }
+    else
+    {
+        BOOST_LIGHTWEIGHT_TEST_OSTREAM
+          << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl;
+        return 1;
+    }
+}
+
+} // namespace endian
+} // namespace boost
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//  TODO: Should all test macros return bool?  See BOOST_TEST_MEM_EQ usage in fp_exaustive_test,cpp
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+#define BOOST_TEST(expr) \
+  ((expr)? (void)0: ::boost::endian::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
+
+#define BOOST_ERROR(msg) \
+  ( ::boost::endian::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
+
+#define BOOST_TEST_EQ(expr1,expr2) \
+  ( ::boost::endian::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+#define BOOST_TEST_NE(expr1,expr2) \
+  ( ::boost::endian::detail::test_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
+
+#define BOOST_TEST_MEM_EQ(expr1,expr2) \
+  (::boost::endian::detail::test_memcmp_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2))
+
+#ifndef BOOST_NO_EXCEPTIONS
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )                    \
+      try {                                                    \
+         EXPR;                                                 \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+      catch(EXCEP const&) {                                    \
+      }                                                        \
+      catch(...) {                                             \
+         ::boost::detail::throw_failed_impl                    \
+         (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
+      }                                                        \
+   //
+#else
+   #define BOOST_TEST_THROWS( EXPR, EXCEP )
+#endif
+
+#endif // #ifndef BOOST_ENDIAN_LIGHTWEIGHT_TEST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/endian.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+//  boost/endian/endian.hpp  -----------------------------------------------------------//
+
+//  Copyright Beman Dawes 2015
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See library home page at http://www.boost.org/libs/endian
+
+#ifndef BOOST_ENDIAN_ENDIAN_HPP
+#define BOOST_ENDIAN_ENDIAN_HPP
+
+#ifndef BOOST_ENDIAN_DEPRECATED_NAMES
+# error "<boost/endian/endian.hpp> is deprecated. Define BOOST_ENDIAN_DEPRECATED_NAMES to use."
+#endif
+
+#include <boost/endian/arithmetic.hpp>
+
+#endif  //BOOST_ENDIAN_ENDIAN_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/endian/std_pair.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+//  boost/endian/std_pair.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes 2013
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  http://www.boost.org/LICENSE_1_0.txt
+
+//--------------------------------------------------------------------------------------//
+
+#ifndef BOOST_ENDIAN_STD_PAIR_HPP
+#define BOOST_ENDIAN_STD_PAIR_HPP
+
+#include <boost/endian/conversion.hpp>
+#include <utility>
+
+namespace boost
+{
+namespace endian
+{
+  template <class ReversibleValueT, class ReversibleValueU>
+  std::pair<ReversibleValueT, ReversibleValueU>
+    reverse_value(std::pair<ReversibleValueT, ReversibleValueU> x)
+  {
+    return std::pair<ReversibleValueT, ReversibleValueU>(reverse_value(x.first),
+      reverse_value(x.second));
+  }
+
+  template <class ReversibleT, class ReversibleU>
+  void reverse(std::pair<ReversibleT, ReversibleU>& x)
+  {
+    reverse(x.first);
+    reverse(x.second);
+  }
+
+}
+}
+
+#endif  // BOOST_ENDIAN_STD_PAIR_HPP
--- a/DEPENDENCIES/generic/include/boost/exception.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
-
-//Distributed under the Boost Software License, Version 1.0. (See accompanying
-//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef UUID_1D94A7C6054E11DB9804B622A1EF5492
-#define UUID_1D94A7C6054E11DB9804B622A1EF5492
-
-#error The header <boost/exception.hpp> has been deprecated. Please #include <boost/exception/all.hpp> instead.
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/exception/N3757.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+//Copyright (c) 2006-2013 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_9011016A11A711E3B46CD9FA6088709B
+#define UUID_9011016A11A711E3B46CD9FA6088709B
+#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma GCC system_header
+#endif
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(push,1)
+#endif
+
+#include <boost/exception/info.hpp>
+#include <boost/exception/get_error_info.hpp>
+
+namespace
+boost
+    {
+    //Here we're using the boost::error_info machinery to store the info in the exception
+    //object. Within the context of N3757, this is strictly an implementation detail.
+
+    template <class Tag>
+    inline
+    void
+    exception::
+    set( typename Tag::type const & v )
+        {
+        exception_detail::set_info(*this,error_info<Tag,typename Tag::type>(v));
+        }
+
+    template <class Tag>
+    inline
+    typename Tag::type const *
+    exception::
+    get() const
+        {
+        return get_error_info<error_info<Tag,typename Tag::type> >(*this);
+        }
+    }
+
+#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
+#pragma warning(pop)
+#endif
+#endif
--- a/DEPENDENCIES/generic/include/boost/exception/detail/attribute_noreturn.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-//Copyright (c) 2009 Emil Dotchevski and Reverge Studios, Inc.
-
-//Distributed under the Boost Software License, Version 1.0. (See accompanying
-//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef UUID_61531AB0680611DEADD5846855D89593
-#define UUID_61531AB0680611DEADD5846855D89593
-
-#if defined(_MSC_VER)
-#define BOOST_ATTRIBUTE_NORETURN __declspec(noreturn)
-#elif defined(__GNUC__)
-#define BOOST_ATTRIBUTE_NORETURN __attribute__((__noreturn__))
-#else
-#define BOOST_ATTRIBUTE_NORETURN
-#endif
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/flyweight/detail/archive_constructed.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/flyweight for library home page.
+ */
+
+#ifndef BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP
+#define BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP
+
+#if defined(_MSC_VER)&&(_MSC_VER>=1200)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/type_traits/aligned_storage.hpp>
+#include <boost/type_traits/alignment_of.hpp> 
+
+namespace boost{
+
+namespace flyweights{
+
+namespace detail{
+
+/* constructs a stack-based object from a serialization archive */
+
+template<typename T>
+struct archive_constructed:private noncopyable
+{
+  template<class Archive>
+  archive_constructed(Archive& ar,const unsigned int version)
+  {
+    serialization::load_construct_data_adl(ar,&get(),version);
+    BOOST_TRY{
+      ar>>get();
+    }
+    BOOST_CATCH(...){
+      (&get())->~T();
+      BOOST_RETHROW;
+    }
+    BOOST_CATCH_END
+  }
+
+  template<class Archive>
+  archive_constructed(const char* name,Archive& ar,const unsigned int version)
+  {
+    serialization::load_construct_data_adl(ar,&get(),version);
+    BOOST_TRY{
+      ar>>serialization::make_nvp(name,get());
+    }
+    BOOST_CATCH(...){
+      (&get())->~T();
+      BOOST_RETHROW;
+    }
+    BOOST_CATCH_END
+  }
+
+  ~archive_constructed()
+  {
+    (&get())->~T();
+  }
+
+  T& get(){return *static_cast<T*>(static_cast<void*>(&space));}
+
+private:
+  typename aligned_storage<sizeof(T),alignment_of<T>::value>::type space;
+};
+
+} /* namespace flyweights::detail */
+
+} /* namespace flyweights */
+
+} /* namespace boost */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/flyweight/detail/serialization_helper.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,99 @@
+/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/flyweight for library home page.
+ */
+
+#ifndef BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
+#define BOOST_FLYWEIGHT_DETAIL_SERIALIZATION_HELPER_HPP
+
+#if defined(_MSC_VER)&&(_MSC_VER>=1200)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#include <boost/multi_index/random_access_index.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <vector>
+
+namespace boost{
+
+namespace flyweights{
+
+namespace detail{
+
+/* The serialization helpers for flyweight<T> map numerical IDs to
+ * flyweight exemplars --an exemplar is the flyweight object
+ * associated to a given value that appears first on the serialization
+ * stream, so that subsequent equivalent flyweight objects will be made
+ * to refer to it during the serialization process.
+ */
+
+template<typename Flyweight>
+struct flyweight_value_address
+{
+  typedef const typename Flyweight::value_type* result_type;
+
+  result_type operator()(const Flyweight& x)const{return &x.get();}
+};
+
+template<typename Flyweight>
+class save_helper:private noncopyable
+{
+  typedef multi_index::multi_index_container<
+    Flyweight,
+    multi_index::indexed_by<
+      multi_index::random_access<>,
+      multi_index::hashed_unique<flyweight_value_address<Flyweight> >
+    >
+  > table;
+
+public:
+
+  typedef typename table::size_type size_type;
+
+  size_type size()const{return t.size();}
+
+  size_type find(const Flyweight& x)const
+  {
+    return multi_index::project<0>(t,multi_index::get<1>(t).find(&x.get()))
+             -t.begin();
+  }
+
+  void push_back(const Flyweight& x){t.push_back(x);}
+  
+private:
+  table t;
+};
+
+template<typename Flyweight>
+class load_helper:private noncopyable
+{
+  typedef std::vector<Flyweight> table;
+
+public:
+
+  typedef typename table::size_type size_type;
+
+  size_type size()const{return t.size();}
+
+  Flyweight operator[](size_type n)const{return t[n];}
+
+  void push_back(const Flyweight& x){t.push_back(x);}
+  
+private:
+  table t;
+};
+
+} /* namespace flyweights::detail */
+
+} /* namespace flyweights */
+
+} /* namespace boost */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/flyweight/serialize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,98 @@
+/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/flyweight for library home page.
+ */
+
+#ifndef BOOST_FLYWEIGHT_SERIALIZE_HPP
+#define BOOST_FLYWEIGHT_SERIALIZE_HPP
+
+#if defined(_MSC_VER)&&(_MSC_VER>=1200)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/flyweight/flyweight_fwd.hpp>
+#include <boost/flyweight/detail/archive_constructed.hpp>
+#include <boost/flyweight/detail/serialization_helper.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/throw_exception.hpp> 
+#include <memory>
+
+/* Serialization routines for flyweight<T>. 
+ */
+
+namespace boost{
+  
+namespace serialization{
+
+template<
+  class Archive,
+  typename T,typename Arg1,typename Arg2,typename Arg3
+>
+inline void serialize(
+  Archive& ar,::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
+  const unsigned int version)
+{
+  split_free(ar,f,version);              
+}                                               
+
+template<
+  class Archive,
+  typename T,typename Arg1,typename Arg2,typename Arg3
+>
+void save(
+  Archive& ar,const ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
+  const unsigned int version)
+{
+  typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>    flyweight;
+  typedef ::boost::flyweights::detail::save_helper<flyweight> helper;
+  typedef typename helper::size_type                          size_type;
+
+  helper& hlp=ar.template get_helper<helper>();
+
+  size_type n=hlp.find(f);
+  ar<<make_nvp("item",n);
+  if(n==hlp.size()){
+    ar<<make_nvp("key",f.get_key());
+    hlp.push_back(f);
+  }
+}
+
+template<
+  class Archive,
+  typename T,typename Arg1,typename Arg2,typename Arg3
+>
+void load(
+  Archive& ar,::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
+  const unsigned int version)
+{
+  typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>    flyweight;
+  typedef typename flyweight::key_type                        key_type;
+  typedef ::boost::flyweights::detail::load_helper<flyweight> helper;
+  typedef typename helper::size_type                          size_type;
+
+  helper& hlp=ar.template get_helper<helper>();
+
+  size_type n=0;
+  ar>>make_nvp("item",n);
+  if(n>hlp.size()){
+    throw_exception(
+      archive::archive_exception(archive::archive_exception::other_exception));
+  }
+  else if(n==hlp.size()){
+    ::boost::flyweights::detail::archive_constructed<key_type> k(
+      "key",ar,version);
+    hlp.push_back(flyweight(k.get()));
+  }
+  f=hlp[n];
+}
+
+} /* namespace serialization */
+
+} /* namespace boost */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/adt/detail/adapt_base_assoc_attr_filler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,61 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTER_ADT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
+#define BOOST_FUSION_ADAPTER_ADT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
+
+#include <boost/config.hpp>
+
+#include <boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp>
+
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(...)                              \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(__VA_ARGS__)                         \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1(...)                              \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(__VA_ARGS__)                         \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(...)                             \
+    ((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
+
+#else // BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(A, B, C, D, E)                    \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E)                       \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1(A, B, C, D, E)                    \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E)                       \
+    BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E)                   \
+    BOOST_PP_IF(BOOST_PP_IS_EMPTY(A),                                           \
+        ((3, (C,D,E))),                                                         \
+        ((5, (A,B,C,D,E)))                                                      \
+    )
+
+#endif // BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0_END
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1_END
+
+
+#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAPPEDATTR_GET_KEY(ATTRIBUTE)             \
+    BOOST_PP_TUPLE_ELEM(                                                        \
+        BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE),                     \
+        BOOST_PP_SUB(BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 1),    \
+        BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE))
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
+#define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
+
+#include <boost/config.hpp>
+#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
+
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/variadic/to_seq.hpp>
+#include <boost/preprocessor/variadic/to_tuple.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+#include <boost/preprocessor/seq/push_front.hpp>
+#include <boost/preprocessor/seq/rest_n.hpp>
+
+#include <boost/preprocessor/tuple/reverse.hpp>
+
+
+#define BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE)                      \
+  BOOST_PP_TUPLE_ELEM(2, 0, ATTRIBUTE)
+
+#define BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE)                           \
+  BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
+
+#if BOOST_PP_VARIADICS
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_0(...)                                  \
+      BOOST_FUSION_ADAPT_ADT_FILLER(__VA_ARGS__)                                \
+      BOOST_FUSION_ADAPT_ADT_FILLER_1
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_1(...)                                  \
+      BOOST_FUSION_ADAPT_ADT_FILLER(__VA_ARGS__)                                \
+      BOOST_FUSION_ADAPT_ADT_FILLER_0
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER(...)                                    \
+      BOOST_PP_IF(                                                              \
+          BOOST_PP_OR(                                                          \
+              BOOST_PP_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__)),        \
+              BOOST_PP_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(1, __VA_ARGS__))),       \
+          BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(                                     \
+              BOOST_PP_VARIADIC_ELEM(2, __VA_ARGS__),                           \
+              BOOST_FUSION_WORKAROUND_VARIADIC_EMPTINESS_LAST_ELEM(__VA_ARGS__) \
+          ),                                                                    \
+          BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(__VA_ARGS__))
+
+#  define BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(...)                                 \
+      ((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
+
+#  define BOOST_FUSION_WORKAROUND_VARIADIC_EMPTINESS_LAST_ELEM(...)             \
+  BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REST_N(                                        \
+            BOOST_PP_SUB(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1),               \
+        BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))
+
+#else // BOOST_PP_VARIADICS
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_0(A, B, C, D)                           \
+      BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A,B,C,D)                                 \
+      BOOST_FUSION_ADAPT_ADT_FILLER_1
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_1(A, B, C, D)                           \
+      BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A,B,C,D)                                 \
+      BOOST_FUSION_ADAPT_ADT_FILLER_0
+
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
+#  define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
+
+#  define BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A, B, C, D)                          \
+      BOOST_PP_IF(BOOST_PP_IS_EMPTY(A),                                         \
+        ((2, (C,D))),                                                           \
+        ((4, (A,B,C,D)))                                                        \
+      )
+
+#endif // BOOST_PP_VARIADICS
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/detail/build_cons.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+/*=============================================================================
+    Copyright (c) 2012-2014 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_BUILD_CONS_10172012_0130)
+#define BOOST_FUSION_BUILD_CONS_10172012_0130
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+
+namespace boost { namespace fusion { namespace detail
+{
+    template <
+        typename First
+      , typename Last
+      , bool is_empty = result_of::equal_to<First, Last>::value>
+    struct build_tuple_cons;
+
+    template <typename First, typename Last>
+    struct build_tuple_cons<First, Last, true>
+    {
+        typedef boost::tuples::null_type type;
+
+        BOOST_FUSION_GPU_ENABLED
+        static type
+        call(First const&, Last const&)
+        {
+            return type();
+        }
+    };
+
+    template <typename First, typename Last>
+    struct build_tuple_cons<First, Last, false>
+    {
+        typedef
+            build_tuple_cons<typename result_of::next<First>::type, Last>
+        next_build_tuple_cons;
+
+        typedef boost::tuples::cons<
+            typename result_of::value_of<First>::type
+          , typename next_build_tuple_cons::type>
+        type;
+
+        BOOST_FUSION_GPU_ENABLED
+        static type
+        call(First const& f, Last const& l)
+        {
+            typename result_of::value_of<First>::type v = *f;
+            return type(v, next_build_tuple_cons::call(fusion::next(f), l));
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/detail/convert_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/*=============================================================================
+    Copyright (c) 2012-2014 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CONVERT_IMPL_10172012_0120)
+#define BOOST_FUSION_CONVERT_IMPL_10172012_0120
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/fusion/adapted/boost_tuple/detail/build_cons.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+
+namespace boost { namespace fusion
+{
+    struct boost_tuple_tag;
+
+    namespace extension
+    {
+        template <typename T>
+        struct convert_impl;
+
+        template <>
+        struct convert_impl<boost_tuple_tag>
+        {
+            template <typename Sequence>
+            struct apply
+            {
+                typedef typename
+                    detail::build_tuple_cons<
+                        typename result_of::begin<Sequence>::type
+                      , typename result_of::end<Sequence>::type
+                    >
+                build_tuple_cons;
+
+                typedef typename build_tuple_cons::type type;
+
+                BOOST_FUSION_GPU_ENABLED
+                static type
+                call(Sequence& seq)
+                {
+                    return build_tuple_cons::call(fusion::begin(seq), fusion::end(seq));
+                }
+            };
+        };
+    }
+}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/boost_tuple/mpl/clear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,23 @@
+/*=============================================================================
+    Copyright (c) 2012 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CLEAR_10172012_0100)
+#define BOOST_FUSION_CLEAR_10172012_0100
+
+#include <boost/mpl/identity.hpp>
+#include <boost/fusion/adapted/boost_tuple/tag_of.hpp>
+
+namespace boost { namespace fusion { namespace detail {
+
+  template <typename Tag>
+  struct clear;
+
+  template <>
+  struct clear<boost_tuple_tag> : mpl::identity<boost::tuple<> > {};
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/detail/build_std_tuple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,105 @@
+/*=============================================================================
+    Copyright (c) 2014 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_BUILD_STD_TUPLE_05292014_0100)
+#define BOOST_FUSION_BUILD_STD_TUPLE_05292014_0100
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <tuple>
+
+namespace boost { namespace fusion { namespace detail
+{
+    template <typename First, typename Last
+      , bool is_empty = result_of::equal_to<First, Last>::value
+    >
+    struct build_std_tuple;
+
+    template <typename First, typename Last>
+    struct build_std_tuple<First, Last, true>
+    {
+        typedef std::tuple<> type;
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static type
+        call(First const&, Last const&)
+        {
+            return type();
+        }
+    };
+
+    template <int ...> struct indexed_tuple { };
+
+    template <int, typename = indexed_tuple<>>
+    struct make_indexed_tuple;
+
+    template <int Head, int ...Tail>
+    struct make_indexed_tuple<Head, indexed_tuple<Tail...>>
+    {
+        typedef typename
+            boost::mpl::eval_if_c<
+                (Head == 0),
+                boost::mpl::identity<indexed_tuple<Tail...>>,
+                make_indexed_tuple<Head - 1, indexed_tuple<Head - 1, Tail...>>
+            >::type
+        type;
+    };
+
+    template <typename T, typename Rest>
+    struct push_front_std_tuple;
+
+    template <typename T, typename ...Rest>
+    struct push_front_std_tuple<T, std::tuple<Rest...>>
+    {
+        typedef std::tuple<T, Rest...> type;
+
+        template <int ...I>
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static type
+        indexed_call(T const& first, std::tuple<Rest...> const& rest, indexed_tuple<I...>)
+        {
+            return type(first, std::get<I>(rest)...);
+        }
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static type
+        call(T const& first, std::tuple<Rest...> const& rest)
+        {
+            typedef typename make_indexed_tuple<sizeof...(Rest)>::type gen;
+            return indexed_call(first, rest, gen());
+        }
+    };
+
+    template <typename First, typename Last>
+    struct build_std_tuple<First, Last, false>
+    {
+        typedef
+            build_std_tuple<typename result_of::next<First>::type, Last>
+        next_build_std_tuple;
+
+        typedef push_front_std_tuple<
+            typename result_of::value_of<First>::type
+          , typename next_build_std_tuple::type>
+        push_front;
+
+        typedef typename push_front::type type;
+
+        BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static type
+        call(First const& f, Last const& l)
+        {
+            typename result_of::value_of<First>::type v = *f;
+            return push_front::call(
+                v, next_build_std_tuple::call(fusion::next(f), l));
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/detail/convert_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2012-2014 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CONVERT_IMPL_10172012_0940)
+#define BOOST_FUSION_CONVERT_IMPL_10172012_0940
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/adapted/std_tuple/detail/build_std_tuple.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+
+namespace boost { namespace fusion
+{
+    struct std_tuple_tag;
+
+    namespace extension
+    {
+        template <typename T>
+        struct convert_impl;
+
+        template <>
+        struct convert_impl<std_tuple_tag>
+        {
+            template <typename Sequence>
+            struct apply
+            {
+                typedef detail::build_std_tuple<
+                    typename result_of::begin<Sequence>::type
+                  , typename result_of::end<Sequence>::type
+                > gen;
+
+                typedef typename gen::type type;
+
+                BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+                static type
+                call(Sequence& seq)
+                {
+                    return gen::call(begin(seq), end(seq));
+                }
+            };
+        };
+    }
+}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/std_tuple/mpl/clear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,23 @@
+/*=============================================================================
+    Copyright (c) 2012 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CLEAR_10172012_0940)
+#define BOOST_FUSION_CLEAR_10172012_0940
+
+#include <boost/mpl/identity.hpp>
+#include <boost/fusion/adapted/std_tuple/tag_of.hpp>
+
+namespace boost { namespace fusion { namespace detail
+{
+  template <typename Tag>
+  struct clear;
+
+  template <>
+  struct clear<std_tuple_tag> : mpl::identity<std::tuple<> > {};
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_auto.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
+#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
+
+#include <boost/preprocessor/empty.hpp>
+
+#define BOOST_FUSION_ADAPT_AUTO BOOST_PP_EMPTY()
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_base_assoc_attr_filler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
+#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
+
+#include <boost/config.hpp>
+
+#include <boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp>
+
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(...)                           \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(__VA_ARGS__)                      \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(...)                           \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(__VA_ARGS__)                      \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(...)                          \
+      ((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
+
+#else // BOOST_PP_VARIADICS
+
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z)                       \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(X, Y, Z)                          \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z)                       \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(X, Y, Z)                          \
+    BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAP_ATTR(X, Y, Z)                      \
+    BOOST_PP_IF(BOOST_PP_IS_EMPTY(X),                                           \
+      ((2, (Y,Z))),                                                             \
+      ((3, (X,Y,Z)))                                                            \
+    )
+
+#endif // BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0_END
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1_END
+
+
+#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAPPEDATTR_GET_KEY(ATTRIBUTE)          \
+    BOOST_PP_TUPLE_ELEM(                                                        \
+        BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE),                  \
+        BOOST_PP_SUB(BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 1), \
+        BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE))
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
+#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
+
+#include <boost/config.hpp>
+#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
+
+#include <boost/preprocessor/empty.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/variadic/to_seq.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+#include <boost/preprocessor/seq/push_front.hpp>
+
+
+#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y)                                \
+    BOOST_FUSION_ADAPT_STRUCT_WRAP_ATTR(X,Y)                                    \
+    BOOST_FUSION_ADAPT_STRUCT_FILLER_1
+
+#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1(X, Y)                                \
+    BOOST_FUSION_ADAPT_STRUCT_WRAP_ATTR(X,Y)                                    \
+    BOOST_FUSION_ADAPT_STRUCT_FILLER_0
+
+#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0_END
+#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1_END
+
+#define BOOST_FUSION_ADAPT_STRUCT_WRAP_ATTR(X, Y)                               \
+    BOOST_PP_IF(BOOST_PP_IS_EMPTY(X),                                           \
+      ((1, (Y))),                                                               \
+      ((2, (X,Y)))                                                              \
+    )
+
+#define BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE)                   \
+  BOOST_PP_TUPLE_ELEM(2, 0, ATTRIBUTE)
+
+#define BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE)                        \
+  BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
+
+
+#if BOOST_PP_VARIADICS
+
+#   define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP(r, unused, elem)      \
+        BOOST_PP_IF(BOOST_FUSION_PP_IS_SEQ(elem),                               \
+            BOOST_PP_CAT( BOOST_FUSION_ADAPT_STRUCT_FILLER_0 elem ,_END),       \
+            BOOST_FUSION_ADAPT_STRUCT_WRAP_ATTR(BOOST_FUSION_ADAPT_AUTO,        \
+                elem))
+
+#   define BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(...)                     \
+        BOOST_PP_SEQ_PUSH_FRONT(                                                \
+            BOOST_PP_SEQ_FOR_EACH(                                              \
+                BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER_OP,                 \
+                unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)),                 \
+            (0,0))
+
+#endif // BOOST_PP_VARIADICS
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,14 @@
+/*=============================================================================
+    Copyright (c) 2013-2014 Damien Buhl
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_IS_TPL_HPP
+#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_IS_TPL_HPP
+
+#define BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ)                          \
+    BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+/*=============================================================================
+    BOOST_PP_VARIADICS version of BOOST_PP_IS_SEQ inspired from 
+    boost/mpl/aux_/preprocessor/is_seq.hpp, original copyrights goes to :
+
+    Copyright Paul Mensonides 2003
+    Copyright Aleksey Gurtovoy 2003-2004
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+==============================================================================*/
+
+#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_PREPROCESSOR_IS_SEQ_HPP
+#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_PREPROCESSOR_IS_SEQ_HPP
+
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/punctuation/paren.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/config/config.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#define BOOST_FUSION_PP_IS_SEQ(seq) BOOST_PP_CAT(BOOST_FUSION_PP_IS_SEQ_,       \
+    BOOST_FUSION_PP_IS_SEQ_0 seq BOOST_PP_RPAREN())
+
+#define BOOST_FUSION_PP_IS_SEQ_0(...)                                           \
+    BOOST_FUSION_PP_IS_SEQ_1(__VA_ARGS__
+
+#define BOOST_FUSION_PP_IS_SEQ_ALWAYS_0(...)                                    \
+    0
+
+#define BOOST_FUSION_PP_IS_SEQ_BOOST_FUSION_PP_IS_SEQ_0                         \
+    BOOST_FUSION_PP_IS_SEQ_ALWAYS_0(
+
+#define BOOST_FUSION_PP_IS_SEQ_BOOST_FUSION_PP_IS_SEQ_1(...)                    \
+    1
+
+#endif // BOOST_PP_VARIADICS
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/algorithm/transformation/flatten.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2013 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_FUSION_ALGORITHM_FLATTEN_HPP_INCLUDED
+#define BOOST_FUSION_ALGORITHM_FLATTEN_HPP_INCLUDED
+
+
+#include <boost/fusion/view/flatten_view.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
+
+
+namespace boost { namespace fusion { namespace result_of
+{
+    template<typename Sequence>
+    struct flatten
+    {
+        typedef flatten_view<Sequence> type;
+    };
+}}}
+
+namespace boost { namespace fusion
+{
+    template <typename Sequence>
+    BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+    inline typename result_of::flatten<Sequence>::type
+    flatten(Sequence& view)
+    {
+        return flatten_view<Sequence>(view);
+    }
+
+    template <typename Sequence>
+    BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+    inline typename result_of::flatten<Sequence const>::type
+    flatten(Sequence const& view)
+    {
+        return flatten_view<Sequence const>(view);
+    }
+}}
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/container/list/nil.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+/*=============================================================================
+    Copyright (c) 2001-2011 Joel de Guzman
+    Copyright (c) 2005, 2014 Eric Niebler
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_NIL_04232014_0843)
+#define FUSION_NIL_04232014_0843
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/list/cons_fwd.hpp>
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace fusion
+{
+    struct void_;
+    struct cons_tag;
+    struct forward_traversal_tag;
+    struct fusion_sequence_tag;
+
+    struct nil_ : sequence_base<nil_>
+    {
+        typedef mpl::int_<0> size;
+        typedef cons_tag fusion_tag;
+        typedef fusion_sequence_tag tag; // this gets picked up by MPL
+        typedef mpl::false_ is_view;
+        typedef forward_traversal_tag category;
+        typedef void_ car_type;
+        typedef void_ cdr_type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        nil_() BOOST_NOEXCEPT {}
+
+        template <typename Iterator>
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        nil_(Iterator const& /*iter*/, mpl::true_ /*this_is_an_iterator*/) BOOST_NOEXCEPT
+        {}
+
+        template <typename Iterator>
+        BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        void assign_from_iter(Iterator const& /*iter*/) BOOST_NOEXCEPT
+        {
+        }
+    };
+}}
+
+#endif
+
--- a/DEPENDENCIES/generic/include/boost/fusion/include/adapt_assoc_class.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2010 Christopher Schmidt
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef BOOST_FUSION_INCLUDE_ADAPT_ASSOC_CLASS_HPP
-#define BOOST_FUSION_INCLUDE_ADAPT_ASSOC_CLASS_HPP
-
-#include <boost/fusion/adapted/class/adapt_assoc_class.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/fusion/include/adapt_assoc_class_named.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2010 Christopher Schmidt
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef BOOST_FUSION_INCLUDE_ADAPT_ASSOC_CLASS_NAMED_HPP
-#define BOOST_FUSION_INCLUDE_ADAPT_ASSOC_CLASS_NAMED_HPP
-
-#include <boost/fusion/adapted/class/adapt_assoc_class_named.hpp>
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/include/flatten.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,14 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2014 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef FUSION_INCLUDE_FLATTEN
+#define FUSION_INCLUDE_FLATTEN
+
+
+#include <boost/fusion/algorithm/transformation/flatten.hpp>
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/include/flatten_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,14 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2014 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef FUSION_INCLUDE_FLATTEN_VIEW
+#define FUSION_INCLUDE_FLATTEN_VIEW
+
+
+#include <boost/fusion/view/flatten_view.hpp>
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/include/hash.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,12 @@
+/*=============================================================================
+    Copyright (c) 2014 Christoph Weiss
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_INCLUDE_HASH)
+#define FUSION_INCLUDE_HASH
+
+#include <boost/fusion/sequence/hash.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/include/nil.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,13 @@
+/*=============================================================================
+    Copyright (c) 2014 Eric Niebler
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_INCLUDE_NIL)
+#define FUSION_INCLUDE_NIL
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/list/nil.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/include/std_tuple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,12 @@
+/*=============================================================================
+    Copyright (c) 2014 Kohei Takahashi
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef FUSION_INCLUDE_STD_TUPLE
+#define FUSION_INCLUDE_STD_TUPLE
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/adapted/std_tuple.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/sequence/hash.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+/*=============================================================================
+    Copyright (c) 2014 Christoph Weiss
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_HASH_23072014_1017)
+#define FUSION_HASH_23072014_1017
+
+#include <boost/functional/hash.hpp>
+#include <boost/fusion/algorithm/iteration/fold.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace fusion
+{
+    namespace hashing
+    {
+        struct hash_combine_fold
+        {
+            typedef std::size_t result_type;
+            template<typename T>
+            inline std::size_t operator()(std::size_t seed, T const& v)
+            {
+                boost::hash_combine(seed, v);
+                return seed;
+            }
+        };
+
+        template <typename Seq>
+        inline typename
+        boost::enable_if<traits::is_sequence<Seq>, std::size_t>::type
+        hash_value(Seq const& seq)
+        {
+            return fold(seq, 0, hash_combine_fold());
+        }
+    }
+
+    using hashing::hash_value;
+}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/support/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+/*=============================================================================
+    Copyright (c) 2014 Eric Niebler
+    Copyright (c) 2014 Kohei Takahashi
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_SUPPORT_CONFIG_01092014_1718)
+#define FUSION_SUPPORT_CONFIG_01092014_1718
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#ifndef BOOST_FUSION_GPU_ENABLED
+#define BOOST_FUSION_GPU_ENABLED BOOST_GPU_ENABLED
+#endif
+
+// Enclose with inline namespace because unqualified lookup of GCC < 4.5 is broken.
+//
+//      namespace detail {
+//          struct foo;
+//          struct X { };
+//      }
+//
+//      template <typename T> void foo(T) { }
+//
+//      int main()
+//      {
+//            foo(detail::X());
+//            // prog.cc: In function 'int main()':
+//            // prog.cc:2: error: 'struct detail::foo' is not a function,
+//            // prog.cc:6: error: conflict with 'template<class T> void foo(T)'
+//            // prog.cc:10: error: in call to 'foo'
+//      }
+namespace boost { namespace fusion { namespace detail
+{
+    namespace barrier { }
+    using namespace barrier;
+}}}
+#define BOOST_FUSION_BARRIER_BEGIN namespace barrier {
+#define BOOST_FUSION_BARRIER_END   }
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1900))
+// All of rvalue-reference ready MSVC don't perform implicit conversion from
+// fundamental type to rvalue-reference of another fundamental type [1].
+//
+// Following example doesn't compile
+//
+//   int i;
+//   long &&l = i; // sigh..., std::forward<long&&>(i) also fail.
+//
+// however, following one will work.
+//
+//   int i;
+//   long &&l = static_cast<long &&>(i);
+//
+// OK, now can we replace all usage of std::forward to static_cast? -- I say NO!
+// All of rvalue-reference ready Clang doesn't compile above static_cast usage [2], sigh...
+//
+// References:
+// 1. https://connect.microsoft.com/VisualStudio/feedback/details/1037806/implicit-conversion-doesnt-perform-for-fund
+// 2. http://llvm.org/bugs/show_bug.cgi?id=19917
+//
+// Tentatively, we use static_cast to forward if run under MSVC.
+#   define BOOST_FUSION_FWD_ELEM(type, value) static_cast<type&&>(value)
+#else
+#   define BOOST_FUSION_FWD_ELEM(type, value) std::forward<type>(value)
+#endif
+
+
+// Workaround for LWG 2408: C++17 SFINAE-friendly std::iterator_traits.
+// http://cplusplus.github.io/LWG/lwg-defects.html#2408
+//
+// - GCC 4.5 enables the feature under C++11.
+//   https://gcc.gnu.org/ml/gcc-patches/2014-11/msg01105.html
+//
+// - MSVC 10.0 implements iterator intrinsics; MSVC 13.0 implements LWG2408.
+#if (defined(BOOST_LIBSTDCXX_VERSION) && (BOOST_LIBSTDCXX_VERSION < 40500) && \
+     defined(BOOST_LIBSTDCXX11)) || \
+    (defined(BOOST_MSVC) && (1600 <= BOOST_MSVC || BOOST_MSVC < 1900))
+#   define BOOST_FUSION_WORKAROUND_FOR_LWG_2408
+namespace std
+{
+    template <typename>
+    struct iterator_traits;
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/support/detail/enabler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,18 @@
+/*=============================================================================
+    Copyright (c) 2015 Kohei Takahashi
+
+    Use modification and distribution are subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+#ifndef FUSION_DETAIL_ENABLER_02082015_163810
+#define FUSION_DETAIL_ENABLER_02082015_163810
+
+namespace boost { namespace fusion { namespace detail
+{
+    template <typename, typename T = void>
+    struct enabler { typedef T type; };
+}}}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/support/detail/result_of.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,53 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_RESULT_OF_10272014_0654)
+#define FUSION_RESULT_OF_10272014_0654
+
+#include <boost/config.hpp>
+#include <boost/utility/result_of.hpp>
+
+#if !defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#define BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF
+#endif
+
+#if !defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#endif
+
+namespace boost { namespace fusion { namespace detail
+{
+    // This is a temporary workaround for result_of before we make fusion fully
+    // sfinae result_of friendy, which will require some heavy lifting for some
+    // low level code. So far this is used only in the fold algorithm. This will
+    // be removed once we overhaul fold.
+
+#if defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+
+    template <typename Sig>
+    struct result_of_with_decltype : boost::tr1_result_of<Sig> {};
+
+#else // defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+
+    BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
+    BOOST_MPL_HAS_XXX_TEMPLATE_DEF(result)
+
+    template <typename Sig>
+    struct result_of_with_decltype;
+
+    template <typename F, typename... Args>
+    struct result_of_with_decltype<F(Args...)>
+        : mpl::if_<mpl::or_<has_result_type<F>, detail::has_result<F> >,
+            boost::tr1_result_of<F(Args...)>,
+            boost::detail::cpp0x_result_of<F(Args...)> >::type {};
+
+#endif // defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/view/flatten_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2013 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_FUSION_SEQUENCE_FLATTEN_VIEW_HPP_INCLUDED
+#define BOOST_FUSION_SEQUENCE_FLATTEN_VIEW_HPP_INCLUDED
+
+
+#include <boost/fusion/view/flatten_view/flatten_view.hpp>
+#include <boost/fusion/view/flatten_view/flatten_view_iterator.hpp>
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/view/flatten_view/flatten_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,133 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2013 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED
+#define BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED
+
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/single_view.hpp>
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/fusion/support/is_view.hpp>
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/view/flatten_view/flatten_view_iterator.hpp>
+
+
+namespace boost { namespace fusion
+{
+    struct forward_traversal_tag;
+    struct flatten_view_tag;
+
+    template <typename Sequence>
+    struct flatten_view
+      : sequence_base<flatten_view<Sequence> >
+    {
+        typedef flatten_view_tag fusion_tag;
+        typedef fusion_sequence_tag tag; // this gets picked up by MPL
+        typedef mpl::true_ is_view;
+        typedef forward_traversal_tag category;
+
+        typedef Sequence sequence_type;
+        typedef typename result_of::begin<Sequence>::type first_type;
+        typedef typename result_of::end<Sequence>::type last_type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        explicit flatten_view(Sequence& seq)
+          : seq(seq)
+        {}
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        first_type first() const { return fusion::begin(seq); }
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        last_type last() const { return fusion::end(seq); }
+
+        typename mpl::if_<traits::is_view<Sequence>, Sequence, Sequence&>::type seq;
+    };
+}}
+
+namespace boost { namespace fusion { namespace extension
+{
+    template<>
+    struct begin_impl<flatten_view_tag>
+    {
+        template<typename Sequence>
+        struct apply
+        {
+            typedef typename Sequence::first_type first_type;
+
+            typedef typename
+                    result_of::begin<
+                        mpl::single_view<
+                            typename Sequence::sequence_type> >::type
+            root_iterator;
+
+            typedef
+                detail::seek_descent<root_iterator, first_type>
+            seek_descent;
+
+            typedef typename seek_descent::type type;
+
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+            static inline
+            type call(Sequence& seq)
+            {
+                return seek_descent::apply(root_iterator(), seq.first());
+            }
+        };
+    };
+
+    template<>
+    struct end_impl<flatten_view_tag>
+    {
+        template<typename Sequence>
+        struct apply
+        {
+            typedef typename Sequence::last_type last_type;
+
+            typedef typename
+                    result_of::end<
+                        mpl::single_view<
+                            typename Sequence::sequence_type> >::type
+            type;
+
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+            static inline
+            type call(Sequence&)
+            {
+                return type();
+            }
+        };
+    };
+
+    template<>
+    struct size_impl<flatten_view_tag>
+    {
+        template <typename Sequence>
+        struct apply
+          : result_of::distance
+            <
+                typename result_of::begin<Sequence>::type
+              , typename result_of::end<Sequence>::type
+            >
+        {};
+    };
+
+    template<>
+    struct empty_impl<flatten_view_tag>
+    {
+        template <typename Sequence>
+        struct apply
+          : result_of::empty<typename Sequence::sequence_type>
+        {};
+    };
+}}}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/fusion/view/flatten_view/flatten_view_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,218 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2013 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_FUSION_FLATTEN_VIEW_ITERATOR_HPP_INCLUDED
+#define BOOST_FUSION_FLATTEN_VIEW_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/fusion/support/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/fusion/container/list/cons.hpp>
+#include <boost/fusion/support/unused.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+
+
+namespace boost { namespace fusion
+{
+    struct forward_traversal_tag;
+    struct flatten_view_iterator_tag;
+
+    template<class First, class Base>
+    struct flatten_view_iterator
+      : iterator_base<flatten_view_iterator<First, Base> >
+    {
+        typedef flatten_view_iterator_tag fusion_tag;
+        typedef forward_traversal_tag category;
+
+        typedef convert_iterator<First> first_converter;
+        typedef typename first_converter::type first_type;
+        typedef Base base_type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        flatten_view_iterator(First const& first, Base const& base)
+          : first(first), base(base)
+        {}
+
+        first_type first;
+        base_type base;
+    };
+}}
+
+namespace boost { namespace fusion { namespace detail
+{
+    template<class Iterator, class = void>
+    struct make_descent_cons
+    {
+        typedef cons<Iterator> type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(Iterator const& it)
+        {
+            return type(it);
+        }
+    };
+
+    template<class Iterator>
+    struct make_descent_cons<Iterator,
+        typename enable_if<traits::is_sequence<
+            typename result_of::value_of<Iterator>::type> >::type>
+    {
+        // we use 'value_of' above for convenience, assuming the value won't be reference,
+        // while we must use the regular 'deref' here for const issues...
+        typedef typename
+            remove_reference<typename result_of::deref<Iterator>::type>::type
+        sub_sequence;
+
+        typedef typename
+            result_of::begin<sub_sequence>::type
+        sub_begin;
+
+        typedef cons<Iterator, typename make_descent_cons<sub_begin>::type> type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(Iterator const& it)
+        {
+            return type(it, make_descent_cons<sub_begin>::apply(
+                fusion::begin(*it)));
+        }
+    };
+
+    template<class Cons, class Base>
+    struct build_flatten_view_iterator;
+
+    template<class Car, class Base>
+    struct build_flatten_view_iterator<cons<Car>, Base>
+    {
+        typedef flatten_view_iterator<Car, Base> type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(cons<Car> const& cons, Base const& base)
+        {
+            return type(cons.car, base);
+        }
+    };
+
+    template<class Car, class Cdr, class Base>
+    struct build_flatten_view_iterator<cons<Car, Cdr>, Base>
+    {
+        typedef flatten_view_iterator<Car, Base> next_base;
+        typedef build_flatten_view_iterator<Cdr, next_base> next;
+        typedef typename next::type type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(cons<Car, Cdr> const& cons, Base const& base)
+        {
+            return next::apply(cons.cdr, next_base(cons.car, base));
+        }
+    };
+
+    template<class Base, class Iterator, class = void>
+    struct seek_descent
+    {
+        typedef make_descent_cons<Iterator> make_descent_cons_;
+        typedef typename make_descent_cons_::type cons_type;
+        typedef
+            build_flatten_view_iterator<cons_type, Base>
+        build_flatten_view_iterator_;
+        typedef typename build_flatten_view_iterator_::type type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(Base const& base, Iterator const& it)
+        {
+            return build_flatten_view_iterator_::apply(
+                make_descent_cons_::apply(it), base);
+        }
+    };
+
+    template<class Base, class Iterator>
+    struct seek_descent<Base, Iterator,
+        typename enable_if<
+            result_of::equal_to<Iterator, typename result_of::end<
+                    typename result_of::value_of<Base>::type>::type> >::type>
+    {
+        typedef typename result_of::next<Base>::type type;
+
+        BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+        static inline type apply(Base const& base, Iterator const&)
+        {
+            return fusion::next(base);
+        }
+    };
+}}}
+
+namespace boost { namespace fusion { namespace extension
+{
+    template<>
+    struct next_impl<flatten_view_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply
+        {
+            typedef typename Iterator::first_type first_type;
+            typedef typename Iterator::base_type base_type;
+            typedef typename result_of::next<first_type>::type next_type;
+
+            typedef detail::seek_descent<base_type, next_type> seek_descent;
+            typedef typename seek_descent::type type;
+
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+            static inline
+            type call(Iterator const& it)
+            {
+                return seek_descent::apply(it.base, fusion::next(it.first));
+            }
+        };
+    };
+
+    template<>
+    struct deref_impl<flatten_view_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply
+        {
+            typedef typename
+                result_of::deref<typename Iterator::first_type>::type
+            type;
+
+            BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+            static inline
+            type call(Iterator const& it)
+            {
+                return *it.first;
+            }
+        };
+    };
+
+    template<>
+    struct value_of_impl<flatten_view_iterator_tag>
+    {
+        template<typename Iterator>
+        struct apply
+        {
+            typedef typename
+                result_of::value_of<typename Iterator::first_type>::type
+            type;
+        };
+    };
+}}}
+
+#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
+namespace std
+{
+    template <typename First, typename Base>
+    struct iterator_traits< ::boost::fusion::flatten_view_iterator<First, Base> >
+    { };
+}
+#endif
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/crosses.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,197 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Samuel Debionne, Grenoble, France.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_CROSSES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_CROSSES_HPP
+
+#include <cstddef>
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/core/access.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/relate.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename Tag1 = typename tag<Geometry1>::type,
+    typename Tag2 = typename tag<Geometry2>::type
+>
+struct crosses
+    : detail::relate::relate_base
+        <
+            detail::relate::static_mask_crosses_type,
+            Geometry1,
+            Geometry2
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+namespace resolve_variant
+{
+    template <typename Geometry1, typename Geometry2>
+    struct crosses
+    {
+        static inline bool
+        apply(
+              const Geometry1& geometry1,
+              const Geometry2& geometry2)
+        {
+            concept::check<Geometry1 const>();
+            concept::check<Geometry2 const>();
+            
+            return dispatch::crosses<Geometry1, Geometry2>::apply(geometry1, geometry2);
+        }
+    };
+    
+    
+    template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
+    struct crosses<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
+    {
+        struct visitor: static_visitor<bool>
+        {
+            Geometry2 const& m_geometry2;
+            
+            visitor(Geometry2 const& geometry2)
+            : m_geometry2(geometry2)
+            {}
+            
+            template <typename Geometry1>
+            result_type operator()(Geometry1 const& geometry1) const
+            {
+                return crosses
+                <
+                    Geometry1,
+                    Geometry2
+                >::apply
+                (geometry1, m_geometry2);
+            }
+        };
+        
+        static inline bool
+        apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
+              Geometry2 const& geometry2)
+        {
+            return apply_visitor(visitor(geometry2), geometry1);
+        }
+    };
+    
+    
+    template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+    struct crosses<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+    {
+        struct visitor: static_visitor<bool>
+        {
+            Geometry1 const& m_geometry1;
+            
+            visitor(Geometry1 const& geometry1)
+            : m_geometry1(geometry1)
+            {}
+            
+            template <typename Geometry2>
+            result_type operator()(Geometry2 const& geometry2) const
+            {
+                return crosses
+                <
+                    Geometry1,
+                    Geometry2
+                >::apply
+                (m_geometry1, geometry2);
+            }
+        };
+        
+        static inline bool
+        apply(
+              Geometry1 const& geometry1,
+              const variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry2)
+        {
+            return apply_visitor(visitor(geometry1), geometry2);
+        }
+    };
+    
+    
+    template <BOOST_VARIANT_ENUM_PARAMS(typename T1), BOOST_VARIANT_ENUM_PARAMS(typename T2)>
+    struct crosses<variant<BOOST_VARIANT_ENUM_PARAMS(T1)>, variant<BOOST_VARIANT_ENUM_PARAMS(T2)> >
+    {
+        struct visitor: static_visitor<bool>
+        {
+            template <typename Geometry1, typename Geometry2>
+            result_type operator()(
+                                   Geometry1 const& geometry1,
+                                   Geometry2 const& geometry2) const
+            {
+                return crosses
+                <
+                Geometry1,
+                Geometry2
+                >::apply
+                (geometry1, geometry2);
+            }
+        };
+        
+        static inline bool
+        apply(
+              const variant<BOOST_VARIANT_ENUM_PARAMS(T1)>& geometry1,
+              const variant<BOOST_VARIANT_ENUM_PARAMS(T2)>& geometry2)
+        {
+            return apply_visitor(visitor(), geometry1, geometry2);
+        }
+    };
+    
+} // namespace resolve_variant
+    
+    
+/*!
+\brief \brief_check2{crosses}
+\ingroup crosses
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\return \return_check2{crosses}
+
+\qbk{[include reference/algorithms/crosses.qbk]}
+*/
+template <typename Geometry1, typename Geometry2>
+inline bool crosses(Geometry1 const& geometry1, Geometry2 const& geometry2)
+{
+    return resolve_variant::crosses<Geometry1, Geometry2>::apply(geometry1, geometry2);
+}
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_CROSSES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/azimuth.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,158 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_AZIMUTH_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_AZIMUTH_HPP
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/radian_access.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+#include <boost/geometry/algorithms/detail/vincenty_inverse.hpp>
+
+namespace boost { namespace geometry
+{
+
+// An azimuth is an angle between a vector/segment from origin to a point of
+// interest and a reference vector. Typically north-based azimuth is used.
+// North direction is used as a reference, angle is measured clockwise
+// (North - 0deg, East - 90deg). For consistency in 2d cartesian CS
+// the reference vector is Y axis, angle is measured clockwise.
+// http://en.wikipedia.org/wiki/Azimuth
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch
+{
+
+template <typename ReturnType, typename Tag>
+struct azimuth
+    : not_implemented<Tag>
+{};
+
+template <typename ReturnType>
+struct azimuth<ReturnType, geographic_tag>
+{
+    template <typename P1, typename P2, typename Spheroid>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2, Spheroid const& spheroid)
+    {
+        return geometry::detail::vincenty_inverse<ReturnType>
+                    ( get_as_radian<0>(p1), get_as_radian<1>(p1),
+                      get_as_radian<0>(p2), get_as_radian<1>(p2),
+                      spheroid ).azimuth12();
+    }
+
+    template <typename P1, typename P2>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2)
+    {
+        return apply(p1, p2, srs::spheroid<ReturnType>());
+    }
+};
+
+template <typename ReturnType>
+struct azimuth<ReturnType, spherical_equatorial_tag>
+{
+    template <typename P1, typename P2, typename Sphere>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2, Sphere const& /*unused*/)
+    {
+        // http://williams.best.vwh.net/avform.htm#Crs
+        ReturnType dlon = get_as_radian<0>(p2) - get_as_radian<0>(p1);
+        ReturnType cos_p2lat = cos(get_as_radian<1>(p2));
+
+        // An optimization which should kick in often for Boxes
+        //if ( math::equals(dlon, ReturnType(0)) )
+        //if ( get<0>(p1) == get<0>(p2) )
+        //{
+        //    return - sin(get_as_radian<1>(p1)) * cos_p2lat);
+        //}
+
+        // "An alternative formula, not requiring the pre-computation of d"
+        // In the formula below dlon is used as "d"
+        return atan2(sin(dlon) * cos_p2lat,
+            cos(get_as_radian<1>(p1)) * sin(get_as_radian<1>(p2))
+            - sin(get_as_radian<1>(p1)) * cos_p2lat * cos(dlon));
+    }
+
+    template <typename P1, typename P2>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2)
+    {
+        return apply(p1, p2, 0); // dummy model
+    }
+};
+
+template <typename ReturnType>
+struct azimuth<ReturnType, spherical_polar_tag>
+    : azimuth<ReturnType, spherical_equatorial_tag>
+{};
+
+template <typename ReturnType>
+struct azimuth<ReturnType, cartesian_tag>
+{
+    template <typename P1, typename P2, typename Plane>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2, Plane const& /*unused*/)
+    {
+        ReturnType x = get<0>(p2) - get<0>(p1);
+        ReturnType y = get<1>(p2) - get<1>(p1);
+
+        // NOTE: azimuth 0 is at Y axis, increasing right
+        // as in spherical/geographic where 0 is at North axis
+        return atan2(x, y);
+    }
+
+    template <typename P1, typename P2>
+    static inline ReturnType apply(P1 const& p1, P2 const& p2)
+    {
+        return apply(p1, p2, 0); // dummy model
+    }
+};
+
+} // detail_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+/// Calculate azimuth between two points.
+/// The result is in radians.
+template <typename ReturnType, typename Point1, typename Point2>
+inline ReturnType azimuth(Point1 const& p1, Point2 const& p2)
+{
+    return detail_dispatch::azimuth
+            <
+                ReturnType,
+                typename geometry::cs_tag<Point1>::type
+            >::apply(p1, p2);
+}
+
+/// Calculate azimuth between two points.
+/// The result is in radians.
+template <typename ReturnType, typename Point1, typename Point2, typename Model>
+inline ReturnType azimuth(Point1 const& p1, Point2 const& p2, Model const& model)
+{
+    return detail_dispatch::azimuth
+            <
+                ReturnType,
+                typename geometry::cs_tag<Point1>::type
+            >::apply(p1, p2, model);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_AZIMUTH_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,957 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_INSERTER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_INSERTER_HPP
+
+#include <cstddef>
+#include <iterator>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/strategies/side.hpp>
+#include <boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp>
+#include <boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp>
+#include <boost/geometry/algorithms/detail/buffer/parallel_continue.hpp>
+
+#include <boost/geometry/algorithms/num_interior_rings.hpp>
+#include <boost/geometry/algorithms/simplify.hpp>
+
+#include <boost/geometry/views/detail/normalized_view.hpp>
+
+#if defined(BOOST_GEOMETRY_BUFFER_SIMPLIFY_WITH_AX)
+#include <boost/geometry/strategies/cartesian/distance_projected_point_ax.hpp>
+#endif
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+template <typename Range, typename DistanceStrategy>
+inline void simplify_input(Range const& range,
+        DistanceStrategy const& distance,
+        Range& simplified)
+{
+    // We have to simplify the ring before to avoid very small-scaled
+    // features in the original (convex/concave/convex) being enlarged
+    // in a very large scale and causing issues (IP's within pieces).
+    // This might be reconsidered later. Simplifying with a very small
+    // distance (1%% of the buffer) will never be visible in the result,
+    // if it is using round joins. For miter joins they are even more
+    // sensitive to small scale input features, however the result will
+    // look better.
+    // It also gets rid of duplicate points
+#if ! defined(BOOST_GEOMETRY_BUFFER_SIMPLIFY_WITH_AX)
+    geometry::simplify(range, simplified, distance.simplify_distance());
+#else
+
+    typedef typename boost::range_value<Range>::type point_type;
+    typedef strategy::distance::detail::projected_point_ax<> ax_type;
+    typedef typename strategy::distance::services::return_type
+    <
+        strategy::distance::detail::projected_point_ax<>,
+        point_type,
+        point_type
+    >::type return_type;
+
+    typedef strategy::distance::detail::projected_point_ax_less
+    <
+        return_type
+    > comparator_type;
+
+    typedef strategy::simplify::detail::douglas_peucker
+    <
+        point_type,
+        strategy::distance::detail::projected_point_ax<>,
+        comparator_type
+    > dp_ax;
+
+    return_type max_distance(distance.simplify_distance() * 2.0,
+                             distance.simplify_distance());
+    comparator_type comparator(max_distance);
+    dp_ax strategy(comparator);
+
+    geometry::simplify(range, simplified, max_distance, strategy);
+#endif
+
+    if (boost::size(simplified) == 2
+        && geometry::equals(geometry::range::front(simplified),
+                geometry::range::back(simplified)))
+    {
+        traits::resize<Range>::apply(simplified, 1);
+    }
+}
+
+
+template <typename RingOutput>
+struct buffer_range
+{
+    typedef typename point_type<RingOutput>::type output_point_type;
+    typedef typename coordinate_type<RingOutput>::type coordinate_type;
+
+    template
+    <
+        typename Collection,
+        typename Point,
+        typename DistanceStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename RobustPolicy
+    >
+    static inline
+    void add_join(Collection& collection,
+            Point const& penultimate_input,
+            Point const& previous_input,
+            output_point_type const& prev_perp1,
+            output_point_type const& prev_perp2,
+            Point const& input,
+            output_point_type const& perp1,
+            output_point_type const& perp2,
+            strategy::buffer::buffer_side_selector side,
+            DistanceStrategy const& distance,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            RobustPolicy const& )
+    {
+        output_point_type intersection_point;
+
+        strategy::buffer::join_selector join
+                = get_join_type(penultimate_input, previous_input, input);
+        if (join == strategy::buffer::join_convex)
+        {
+            // Calculate the intersection-point formed by the two sides.
+            // It might be that the two sides are not convex, but continue
+            // or spikey, we then change the join-type
+            join = line_line_intersection::apply(
+                        perp1, perp2, prev_perp1, prev_perp2,
+                        intersection_point);
+
+        }
+
+        switch(join)
+        {
+            case strategy::buffer::join_continue :
+                // No join, we get two consecutive sides
+                break;
+            case strategy::buffer::join_concave :
+                {
+                    std::vector<output_point_type> range_out;
+                    range_out.push_back(prev_perp2);
+                    range_out.push_back(previous_input);
+                    collection.add_piece(strategy::buffer::buffered_concave, previous_input, range_out);
+
+                    range_out.clear();
+                    range_out.push_back(previous_input);
+                    range_out.push_back(perp1);
+                    collection.add_piece(strategy::buffer::buffered_concave, previous_input, range_out);
+                }
+                break;
+            case strategy::buffer::join_spike :
+                {
+                    // For linestrings, only add spike at one side to avoid
+                    // duplicates
+                    std::vector<output_point_type> range_out;
+                    end_strategy.apply(penultimate_input, prev_perp2, previous_input, perp1, side, distance, range_out);
+                    collection.add_endcap(end_strategy, range_out, previous_input);
+                    collection.set_current_ring_concave();
+                }
+                break;
+            case strategy::buffer::join_convex :
+                {
+                    // The corner is convex, we create a join
+                    // TODO (future) - avoid a separate vector, add the piece directly
+                    std::vector<output_point_type> range_out;
+                    if (join_strategy.apply(intersection_point,
+                                previous_input, prev_perp2, perp1,
+                                distance.apply(previous_input, input, side),
+                                range_out))
+                    {
+                        collection.add_piece(strategy::buffer::buffered_join,
+                                previous_input, range_out);
+                    }
+                }
+                break;
+        }
+    }
+
+    static inline strategy::buffer::join_selector get_join_type(
+            output_point_type const& p0,
+            output_point_type const& p1,
+            output_point_type const& p2)
+    {
+        typedef typename strategy::side::services::default_strategy
+            <
+                typename cs_tag<output_point_type>::type
+            >::type side_strategy;
+
+        int const side = side_strategy::apply(p0, p1, p2);
+        return side == -1 ? strategy::buffer::join_convex
+            :  side == 1  ? strategy::buffer::join_concave
+            :  parallel_continue
+                    (
+                        get<0>(p2) - get<0>(p1),
+                        get<1>(p2) - get<1>(p1),
+                        get<0>(p1) - get<0>(p0),
+                        get<1>(p1) - get<1>(p0)
+                    )  ? strategy::buffer::join_continue
+            : strategy::buffer::join_spike;
+    }
+
+    template
+    <
+        typename Collection,
+        typename Iterator,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename RobustPolicy
+    >
+    static inline bool iterate(Collection& collection,
+                Iterator begin, Iterator end,
+                strategy::buffer::buffer_side_selector side,
+                DistanceStrategy const& distance_strategy,
+                SideStrategy const& side_strategy,
+                JoinStrategy const& join_strategy,
+                EndStrategy const& end_strategy,
+                RobustPolicy const& robust_policy,
+                output_point_type& first_p1,
+                output_point_type& first_p2,
+                output_point_type& last_p1,
+                output_point_type& last_p2)
+    {
+        boost::ignore_unused(side_strategy);
+
+        typedef typename std::iterator_traits
+        <
+            Iterator
+        >::value_type point_type;
+
+        point_type second_point, penultimate_point, ultimate_point; // last two points from begin/end
+
+        /*
+         * last.p1    last.p2  these are the "previous (last) perpendicular points"
+         * --------------
+         * |            |
+         * *------------*____  <- *prev
+         * pup          |    | p1           "current perpendicular point 1"
+         *              |    |
+         *              |    |       this forms a "side", a side is a piece
+         *              |    |
+         *              *____| p2
+         *
+         *              ^
+         *             *it
+         *
+         * pup: penultimate_point
+         */
+
+        bool result = false;
+        bool first = true;
+
+        Iterator it = begin;
+
+        std::vector<output_point_type> generated_side;
+        generated_side.reserve(2);
+
+        for (Iterator prev = it++; it != end; ++it)
+        {
+            generated_side.clear();
+            side_strategy.apply(*prev, *it, side,
+                                distance_strategy, generated_side);
+
+            if (generated_side.empty())
+            {
+                // Because input is simplified, this is improbable,
+                // but it can happen for degenerate geometries
+                // Further handling of this side is skipped
+                continue;
+            }
+
+            result = true;
+
+            if (! first)
+            {
+                 add_join(collection,
+                        penultimate_point,
+                        *prev, last_p1, last_p2,
+                        *it, generated_side.front(), generated_side.back(),
+                        side,
+                        distance_strategy, join_strategy, end_strategy,
+                        robust_policy);
+            }
+
+            collection.add_side_piece(*prev, *it, generated_side, first);
+
+            penultimate_point = *prev;
+            ultimate_point = *it;
+            last_p1 = generated_side.front();
+            last_p2 = generated_side.back();
+            prev = it;
+            if (first)
+            {
+                first = false;
+                second_point = *it;
+                first_p1 = generated_side.front();
+                first_p2 = generated_side.back();
+            }
+        }
+        return result;
+    }
+};
+
+template
+<
+    typename Multi,
+    typename PolygonOutput,
+    typename Policy
+>
+struct buffer_multi
+{
+    template
+    <
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline void apply(Multi const& multi,
+            Collection& collection,
+            DistanceStrategy const& distance_strategy,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy)
+    {
+        for (typename boost::range_iterator<Multi const>::type
+                it = boost::begin(multi);
+            it != boost::end(multi);
+            ++it)
+        {
+            Policy::apply(*it, collection,
+                distance_strategy, side_strategy,
+                join_strategy, end_strategy, point_strategy,
+                robust_policy);
+        }
+    }
+};
+
+struct visit_pieces_default_policy
+{
+    template <typename Collection>
+    static inline void apply(Collection const&, int)
+    {}
+};
+
+template
+<
+    typename OutputPointType,
+    typename Point,
+    typename Collection,
+    typename DistanceStrategy,
+    typename PointStrategy
+>
+inline void buffer_point(Point const& point, Collection& collection,
+        DistanceStrategy const& distance_strategy,
+        PointStrategy const& point_strategy)
+{
+    collection.start_new_ring();
+    std::vector<OutputPointType> range_out;
+    point_strategy.apply(point, distance_strategy, range_out);
+    collection.add_piece(strategy::buffer::buffered_point, range_out, false);
+    collection.finish_ring();
+}
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template
+<
+    typename Tag,
+    typename RingInput,
+    typename RingOutput
+>
+struct buffer_inserter
+{};
+
+
+
+template
+<
+    typename Point,
+    typename RingOutput
+>
+struct buffer_inserter<point_tag, Point, RingOutput>
+{
+    template
+    <
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline void apply(Point const& point, Collection& collection,
+            DistanceStrategy const& distance_strategy,
+            SideStrategy const& ,
+            JoinStrategy const& ,
+            EndStrategy const& ,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& )
+    {
+        detail::buffer::buffer_point
+        <
+            typename point_type<RingOutput>::type
+        >(point, collection, distance_strategy, point_strategy);
+    }
+};
+
+
+template
+<
+    typename RingInput,
+    typename RingOutput
+>
+struct buffer_inserter<ring_tag, RingInput, RingOutput>
+{
+    typedef typename point_type<RingOutput>::type output_point_type;
+
+    template
+    <
+        typename Collection,
+        typename Iterator,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename RobustPolicy
+    >
+    static inline bool iterate(Collection& collection,
+                Iterator begin, Iterator end,
+                strategy::buffer::buffer_side_selector side,
+                DistanceStrategy const& distance_strategy,
+                SideStrategy const& side_strategy,
+                JoinStrategy const& join_strategy,
+                EndStrategy const& end_strategy,
+                RobustPolicy const& robust_policy)
+    {
+        output_point_type first_p1, first_p2, last_p1, last_p2;
+
+        typedef detail::buffer::buffer_range<RingOutput> buffer_range;
+
+        bool result = buffer_range::iterate(collection, begin, end,
+                side,
+                distance_strategy, side_strategy, join_strategy, end_strategy, robust_policy,
+                first_p1, first_p2, last_p1, last_p2);
+
+        // Generate closing join
+        if (result)
+        {
+            buffer_range::add_join(collection,
+                *(end - 2),
+                *(end - 1), last_p1, last_p2,
+                *(begin + 1), first_p1, first_p2,
+                side,
+                distance_strategy, join_strategy, end_strategy,
+                robust_policy);
+        }
+
+        // Buffer is closed automatically by last closing corner
+        return result;
+    }
+
+    template
+    <
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline void apply(RingInput const& ring,
+            Collection& collection,
+            DistanceStrategy const& distance,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy)
+    {
+        RingInput simplified;
+        detail::buffer::simplify_input(ring, distance, simplified);
+
+        bool has_output = false;
+
+        std::size_t n = boost::size(simplified);
+        std::size_t const min_points = core_detail::closure::minimum_ring_size
+            <
+                geometry::closure<RingInput>::value
+            >::value;
+
+        if (n >= min_points)
+        {
+            detail::normalized_view<RingInput const> view(simplified);
+            if (distance.negative())
+            {
+                // Walk backwards (rings will be reversed afterwards)
+                // It might be that this will be changed later.
+                // TODO: decide this.
+                has_output = iterate(collection, boost::rbegin(view), boost::rend(view),
+                        strategy::buffer::buffer_side_right,
+                        distance, side_strategy, join_strategy, end_strategy, robust_policy);
+            }
+            else
+            {
+                has_output = iterate(collection, boost::begin(view), boost::end(view),
+                        strategy::buffer::buffer_side_left,
+                        distance, side_strategy, join_strategy, end_strategy, robust_policy);
+            }
+        }
+
+        if (! has_output && n >= 1)
+        {
+            // Use point_strategy to buffer degenerated ring
+            detail::buffer::buffer_point<output_point_type>
+                (
+                    geometry::range::front(simplified),
+                    collection, distance, point_strategy
+                );
+        }
+    }
+};
+
+
+template
+<
+    typename Linestring,
+    typename Polygon
+>
+struct buffer_inserter<linestring_tag, Linestring, Polygon>
+{
+    typedef typename ring_type<Polygon>::type output_ring_type;
+    typedef typename point_type<output_ring_type>::type output_point_type;
+    typedef typename point_type<Linestring>::type input_point_type;
+
+    template
+    <
+        typename Collection,
+        typename Iterator,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename RobustPolicy
+    >
+    static inline bool iterate(Collection& collection,
+                Iterator begin, Iterator end,
+                strategy::buffer::buffer_side_selector side,
+                DistanceStrategy const& distance_strategy,
+                SideStrategy const& side_strategy,
+                JoinStrategy const& join_strategy,
+                EndStrategy const& end_strategy,
+                RobustPolicy const& robust_policy,
+                output_point_type& first_p1)
+    {
+        input_point_type const& ultimate_point = *(end - 1);
+        input_point_type const& penultimate_point = *(end - 2);
+
+        // For the end-cap, we need to have the last perpendicular point on the
+        // other side of the linestring. If it is the second pass (right),
+        // we have it already from the first phase (left).
+        // But for the first pass, we have to generate it
+        output_point_type reverse_p1;
+        if (side == strategy::buffer::buffer_side_right)
+        {
+            reverse_p1 = first_p1;
+        }
+        else
+        {
+            std::vector<output_point_type> generated_side;
+            side_strategy.apply(ultimate_point, penultimate_point,
+                    strategy::buffer::buffer_side_right,
+                    distance_strategy, generated_side);
+            if (generated_side.empty())
+            {
+                return false;
+            }
+            reverse_p1 = generated_side.front();
+        }
+
+        output_point_type first_p2, last_p1, last_p2;
+
+        detail::buffer::buffer_range<output_ring_type>::iterate(collection,
+                begin, end, side,
+                distance_strategy, side_strategy, join_strategy, end_strategy, robust_policy,
+                first_p1, first_p2, last_p1, last_p2);
+
+        std::vector<output_point_type> range_out;
+        end_strategy.apply(penultimate_point, last_p2, ultimate_point, reverse_p1, side, distance_strategy, range_out);
+        collection.add_endcap(end_strategy, range_out, ultimate_point);
+        return true;
+    }
+
+    template
+    <
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline void apply(Linestring const& linestring, Collection& collection,
+            DistanceStrategy const& distance,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy)
+    {
+        Linestring simplified;
+        detail::buffer::simplify_input(linestring, distance, simplified);
+
+        bool has_output = false;
+        std::size_t n = boost::size(simplified);
+        if (n > 1)
+        {
+            collection.start_new_ring();
+            output_point_type first_p1;
+            has_output = iterate(collection,
+                    boost::begin(simplified), boost::end(simplified),
+                    strategy::buffer::buffer_side_left,
+                    distance, side_strategy, join_strategy, end_strategy, robust_policy,
+                    first_p1);
+
+            if (has_output)
+            {
+                iterate(collection, boost::rbegin(simplified), boost::rend(simplified),
+                        strategy::buffer::buffer_side_right,
+                        distance, side_strategy, join_strategy, end_strategy, robust_policy,
+                        first_p1);
+            }
+            collection.finish_ring();
+        }
+        if (! has_output && n >= 1)
+        {
+            // Use point_strategy to buffer degenerated linestring
+            detail::buffer::buffer_point<output_point_type>
+                (
+                    geometry::range::front(simplified),
+                    collection, distance, point_strategy
+                );
+        }
+    }
+};
+
+
+template
+<
+    typename PolygonInput,
+    typename PolygonOutput
+>
+struct buffer_inserter<polygon_tag, PolygonInput, PolygonOutput>
+{
+private:
+    typedef typename ring_type<PolygonInput>::type input_ring_type;
+    typedef typename ring_type<PolygonOutput>::type output_ring_type;
+
+    typedef buffer_inserter<ring_tag, input_ring_type, output_ring_type> policy;
+
+
+    template
+    <
+        typename Iterator,
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline
+    void iterate(Iterator begin, Iterator end,
+            Collection& collection,
+            DistanceStrategy const& distance,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy,
+            bool is_interior)
+    {
+        for (Iterator it = begin; it != end; ++it)
+        {
+            collection.start_new_ring();
+            policy::apply(*it, collection, distance, side_strategy,
+                    join_strategy, end_strategy, point_strategy,
+                    robust_policy);
+            collection.finish_ring(is_interior);
+        }
+    }
+
+    template
+    <
+        typename InteriorRings,
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline
+    void apply_interior_rings(InteriorRings const& interior_rings,
+            Collection& collection,
+            DistanceStrategy const& distance,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy)
+    {
+        iterate(boost::begin(interior_rings), boost::end(interior_rings),
+            collection, distance, side_strategy,
+            join_strategy, end_strategy, point_strategy,
+            robust_policy, true);
+    }
+
+public:
+    template
+    <
+        typename Collection,
+        typename DistanceStrategy,
+        typename SideStrategy,
+        typename JoinStrategy,
+        typename EndStrategy,
+        typename PointStrategy,
+        typename RobustPolicy
+    >
+    static inline void apply(PolygonInput const& polygon,
+            Collection& collection,
+            DistanceStrategy const& distance,
+            SideStrategy const& side_strategy,
+            JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy,
+            PointStrategy const& point_strategy,
+            RobustPolicy const& robust_policy)
+    {
+        {
+            collection.start_new_ring();
+            policy::apply(exterior_ring(polygon), collection,
+                    distance, side_strategy,
+                    join_strategy, end_strategy, point_strategy,
+                    robust_policy);
+            collection.finish_ring(false, geometry::num_interior_rings(polygon) > 0u);
+        }
+
+        apply_interior_rings(interior_rings(polygon),
+                collection, distance, side_strategy,
+                join_strategy, end_strategy, point_strategy,
+                robust_policy);
+    }
+};
+
+
+template
+<
+    typename Multi,
+    typename PolygonOutput
+>
+struct buffer_inserter<multi_tag, Multi, PolygonOutput>
+    : public detail::buffer::buffer_multi
+             <
+                Multi,
+                PolygonOutput,
+                dispatch::buffer_inserter
+                <
+                    typename single_tag_of
+                                <
+                                    typename tag<Multi>::type
+                                >::type,
+                    typename boost::range_value<Multi const>::type,
+                    typename geometry::ring_type<PolygonOutput>::type
+                >
+            >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+template
+<
+    typename GeometryOutput,
+    typename GeometryInput,
+    typename OutputIterator,
+    typename DistanceStrategy,
+    typename SideStrategy,
+    typename JoinStrategy,
+    typename EndStrategy,
+    typename PointStrategy,
+    typename RobustPolicy,
+    typename VisitPiecesPolicy
+>
+inline void buffer_inserter(GeometryInput const& geometry_input, OutputIterator out,
+        DistanceStrategy const& distance_strategy,
+        SideStrategy const& side_strategy,
+        JoinStrategy const& join_strategy,
+        EndStrategy const& end_strategy,
+        PointStrategy const& point_strategy,
+        RobustPolicy const& robust_policy,
+        VisitPiecesPolicy& visit_pieces_policy
+    )
+{
+    boost::ignore_unused(visit_pieces_policy);
+
+    typedef detail::buffer::buffered_piece_collection
+    <
+        typename geometry::ring_type<GeometryOutput>::type,
+        RobustPolicy
+    > collection_type;
+    collection_type collection(robust_policy);
+    collection_type const& const_collection = collection;
+
+    bool const areal = boost::is_same
+        <
+            typename tag_cast<typename tag<GeometryInput>::type, areal_tag>::type,
+            areal_tag
+        >::type::value;
+    bool const linear = boost::is_same
+        <
+            typename tag_cast<typename tag<GeometryInput>::type, linear_tag>::type,
+            linear_tag
+        >::type::value;
+
+    dispatch::buffer_inserter
+        <
+            typename tag_cast
+                <
+                    typename tag<GeometryInput>::type,
+                    multi_tag
+                >::type,
+            GeometryInput,
+            GeometryOutput
+        >::apply(geometry_input, collection,
+            distance_strategy, side_strategy, join_strategy,
+            end_strategy, point_strategy,
+            robust_policy);
+
+    collection.get_turns();
+    collection.classify_turns(linear);
+    if (BOOST_GEOMETRY_CONDITION(areal))
+    {
+        collection.check_remaining_points(distance_strategy);
+    }
+
+    // Visit the piece collection. This does nothing (by default), but
+    // optionally a debugging tool can be attached (e.g. console or svg),
+    // or the piece collection can be unit-tested
+    // phase 0: turns (before discarded)
+    visit_pieces_policy.apply(const_collection, 0);
+
+    collection.discard_rings();
+    collection.block_turns();
+    collection.enrich();
+    collection.traverse();
+
+    // Reverse all offsetted rings / traversed rings if:
+    // - they were generated on the negative side (deflate) of polygons
+    // - the output is counter clockwise
+    // and avoid reversing twice
+    bool reverse = distance_strategy.negative() && areal;
+    if (BOOST_GEOMETRY_CONDITION(
+            geometry::point_order<GeometryOutput>::value == counterclockwise))
+    {
+        reverse = ! reverse;
+    }
+    if (reverse)
+    {
+        collection.reverse();
+    }
+
+    if (distance_strategy.negative() && areal)
+    {
+        collection.discard_nonintersecting_deflated_rings();
+    }
+
+    collection.template assign<GeometryOutput>(out);
+
+    // Visit collection again
+    // phase 1: rings (after discarding and traversing)
+    visit_pieces_policy.apply(const_collection, 1);
+}
+
+template
+<
+    typename GeometryOutput,
+    typename GeometryInput,
+    typename OutputIterator,
+    typename DistanceStrategy,
+    typename SideStrategy,
+    typename JoinStrategy,
+    typename EndStrategy,
+    typename PointStrategy,
+    typename RobustPolicy
+>
+inline void buffer_inserter(GeometryInput const& geometry_input, OutputIterator out,
+        DistanceStrategy const& distance_strategy,
+        SideStrategy const& side_strategy,
+        JoinStrategy const& join_strategy,
+        EndStrategy const& end_strategy,
+        PointStrategy const& point_strategy,
+        RobustPolicy const& robust_policy)
+{
+    detail::buffer::visit_pieces_default_policy visitor;
+    buffer_inserter<GeometryOutput>(geometry_input, out,
+        distance_strategy, side_strategy, join_strategy,
+        end_strategy, point_strategy,
+        robust_policy, visitor);
+}
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace detail::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_INSERTER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffer_policies.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,178 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_POLICIES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_POLICIES_HPP
+
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+enum intersection_location_type
+{
+    location_ok, inside_buffer, location_discard
+};
+
+class backtrack_for_buffer
+{
+public :
+    typedef detail::overlay::backtrack_state state_type;
+
+    template <typename Operation, typename Rings, typename Turns, typename Geometry, typename RobustPolicy>
+    static inline void apply(std::size_t size_at_start,
+                Rings& rings, typename boost::range_value<Rings>::type& ring,
+                Turns& turns, Operation& operation,
+                std::string const& /*reason*/,
+                Geometry const& ,
+                Geometry const& ,
+                RobustPolicy const& ,
+                state_type& state
+                )
+    {
+#if defined(BOOST_GEOMETRY_COUNT_BACKTRACK_WARNINGS)
+extern int g_backtrack_warning_count;
+g_backtrack_warning_count++;
+#endif
+//std::cout << "!";
+//std::cout << "WARNING " << reason << std::endl;
+
+        state.m_good = false;
+
+        // Make bad output clean
+        rings.resize(size_at_start);
+        ring.clear();
+
+        // Reject this as a starting point
+        operation.visited.set_rejected();
+
+        // And clear all visit info
+        clear_visit_info(turns);
+    }
+};
+
+// Should follow traversal-turn-concept (enrichment, visit structure)
+// and adds index in piece vector to find it back
+template <typename Point, typename SegmentRatio>
+struct buffer_turn_operation
+    : public detail::overlay::traversal_turn_operation<Point, SegmentRatio>
+{
+    int piece_index;
+    int index_in_robust_ring;
+
+    inline buffer_turn_operation()
+        : piece_index(-1)
+        , index_in_robust_ring(-1)
+    {}
+};
+
+// Version for buffer including type of location, is_opposite, and helper variables
+template <typename Point, typename RobustPoint, typename SegmentRatio>
+struct buffer_turn_info
+    : public detail::overlay::turn_info
+        <
+            Point,
+            SegmentRatio,
+            buffer_turn_operation<Point, SegmentRatio>
+        >
+{
+    typedef Point point_type;
+    typedef RobustPoint robust_point_type;
+
+    int turn_index; // TODO: this might go if partition can operate on non-const input
+
+    RobustPoint robust_point;
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+    // Will (most probably) be removed later
+    RobustPoint mapped_robust_point; // alas... we still need to adapt our points, offsetting them 1 integer to be co-located with neighbours
+#endif
+
+
+    inline RobustPoint const& get_robust_point() const
+    {
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+        return mapped_robust_point;
+#endif
+        return robust_point;
+    }
+
+    intersection_location_type location;
+
+    int count_within;
+
+    bool within_original;
+    int count_on_original_boundary;
+    int count_in_original; // increased by +1 for in ext.ring, -1 for int.ring
+
+    int count_on_offsetted;
+    int count_on_helper;
+    int count_within_near_offsetted;
+
+    bool remove_on_multi;
+
+    // Obsolete:
+    int count_on_occupied;
+    int count_on_multi;
+
+    inline buffer_turn_info()
+        : turn_index(-1)
+        , location(location_ok)
+        , count_within(0)
+        , within_original(false)
+        , count_on_original_boundary(0)
+        , count_in_original(0)
+        , count_on_offsetted(0)
+        , count_on_helper(0)
+        , count_within_near_offsetted(0)
+        , remove_on_multi(false)
+        , count_on_occupied(0)
+        , count_on_multi(0)
+    {}
+};
+
+struct buffer_operation_less
+{
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        segment_identifier const& sl = left.seg_id;
+        segment_identifier const& sr = right.seg_id;
+
+        // Sort them descending
+        return sl == sr
+            ? left.fraction < right.fraction
+            : sl < sr;
+    }
+};
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFER_POLICIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1319 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_PIECE_COLLECTION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_PIECE_COLLECTION_HPP
+
+#include <algorithm>
+#include <cstddef>
+#include <set>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/envelope.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+#include <boost/geometry/geometries/ring.hpp>
+
+#include <boost/geometry/algorithms/detail/buffer/buffered_ring.hpp>
+#include <boost/geometry/algorithms/detail/buffer/buffer_policies.hpp>
+#include <boost/geometry/algorithms/detail/buffer/get_piece_turns.hpp>
+#include <boost/geometry/algorithms/detail/buffer/turn_in_piece_visitor.hpp>
+#include <boost/geometry/algorithms/detail/buffer/turn_in_original_visitor.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/point_box.hpp>
+#include <boost/geometry/algorithms/detail/overlay/add_rings.hpp>
+#include <boost/geometry/algorithms/detail/overlay/assign_parents.hpp>
+#include <boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>
+#include <boost/geometry/algorithms/detail/overlay/ring_properties.hpp>
+#include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/traverse.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/occupation_info.hpp>
+#include <boost/geometry/algorithms/detail/partition.hpp>
+#include <boost/geometry/algorithms/detail/sections/sectionalize.hpp>
+#include <boost/geometry/algorithms/detail/sections/section_box_policies.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+enum segment_relation_code
+{
+    segment_relation_on_left,
+    segment_relation_on_right,
+    segment_relation_within,
+    segment_relation_disjoint
+};
+
+/*
+ *  Terminology
+ *
+ *  Suppose we make a buffer (using blocked corners) of this rectangle:
+ *
+ *         +-------+
+ *         |       |
+ *         |  rect |
+ *         |       |
+ *         +-------+
+ *
+ * For the sides we get these four buffered side-pieces (marked with s)
+ * and four buffered corner pieces (marked with c)
+ *
+ *     c---+---s---+---c
+ *     |   | piece |   |     <- see below for details of the middle top-side-piece
+ *     +---+-------+---+
+ *     |   |       |   |
+ *     s   |  rect |   s     <- two side pieces left/right of rect
+ *     |   |       |   |
+ *     +---+-------+---+
+ *     |   | piece |   |     <- one side-piece below, and two corner pieces
+ *     c---+---s---+---c
+ *
+ *  The outer part of the picture above, using all pieces,
+ *    form together the offsetted ring (marked with o below)
+ *  The 8 pieces are part of the piece collection and use for inside-checks
+ *  The inner parts form (using 1 or 2 points per piece, often co-located)
+ *    form together the robust_polygons (marked with r below)
+ *  The remaining piece-segments are helper-segments (marked with h)
+ *
+ *     ooooooooooooooooo
+ *     o   h       h   o
+ *     ohhhrrrrrrrrrhhho
+ *     o   r       r   o
+ *     o   r       r   o
+ *     o   r       r   o
+ *     ohhhrrrrrrrrrhhho
+ *     o   h       h   o
+ *     ooooooooooooooooo
+ *
+ */
+
+
+template <typename Ring, typename RobustPolicy>
+struct buffered_piece_collection
+{
+    typedef buffered_piece_collection<Ring, RobustPolicy> this_type;
+
+    typedef typename geometry::point_type<Ring>::type point_type;
+    typedef typename geometry::coordinate_type<Ring>::type coordinate_type;
+    typedef typename geometry::robust_point_type
+    <
+        point_type,
+        RobustPolicy
+    >::type robust_point_type;
+
+    // Robust ring/polygon type, always clockwise
+    typedef geometry::model::ring<robust_point_type> robust_ring_type;
+    typedef geometry::model::box<robust_point_type> robust_box_type;
+
+    typedef typename strategy::side::services::default_strategy
+        <
+            typename cs_tag<point_type>::type
+        >::type side_strategy;
+
+    typedef typename geometry::rescale_policy_type
+        <
+            typename geometry::point_type<Ring>::type
+        >::type rescale_policy_type;
+
+    typedef typename geometry::segment_ratio_type
+    <
+        point_type,
+        RobustPolicy
+    >::type segment_ratio_type;
+
+    typedef buffer_turn_info
+    <
+        point_type,
+        robust_point_type,
+        segment_ratio_type
+    > buffer_turn_info_type;
+
+    typedef buffer_turn_operation
+    <
+        point_type,
+        segment_ratio_type
+    > buffer_turn_operation_type;
+
+    typedef std::vector<buffer_turn_info_type> turn_vector_type;
+
+    struct robust_turn
+    {
+        int turn_index;
+        int operation_index;
+        robust_point_type point;
+        segment_identifier seg_id;
+        segment_ratio_type fraction;
+    };
+
+    struct piece
+    {
+        typedef robust_ring_type piece_robust_ring_type;
+        typedef geometry::section<robust_box_type, 1> section_type;
+
+        strategy::buffer::piece_type type;
+        int index;
+
+        int left_index; // points to previous piece of same ring
+        int right_index; // points to next piece of same ring
+
+        // The next two members (1, 2) form together a complete clockwise ring
+        // for each piece (with one dupped point)
+        // The complete clockwise ring is also included as a robust ring (3)
+
+        // 1: half, part of offsetted_rings
+        segment_identifier first_seg_id;
+        int last_segment_index; // no segment-identifier - it is the same as first_seg_id
+        int offsetted_count; // part in robust_ring which is part of offsetted ring
+
+#if defined(BOOST_GEOMETRY_BUFFER_USE_HELPER_POINTS)
+        // 2: half, not part of offsetted rings - part of robust ring
+        std::vector<point_type> helper_points; // 4 points for side, 3 points for join - 0 points for flat-end
+#endif
+
+        bool is_monotonic_increasing[2]; // 0=x, 1=y
+        bool is_monotonic_decreasing[2]; // 0=x, 1=y
+
+        // Monotonic sections of pieces around points
+        std::vector<section_type> sections;
+
+
+        // Robust representations
+        // 3: complete ring
+        robust_ring_type robust_ring;
+
+        robust_box_type robust_envelope;
+        robust_box_type robust_offsetted_envelope;
+
+        std::vector<robust_turn> robust_turns; // Used only in insert_rescaled_piece_turns - we might use a map instead
+    };
+
+    struct robust_original
+    {
+        typedef robust_ring_type original_robust_ring_type;
+        typedef geometry::sections<robust_box_type, 1> sections_type;
+
+        inline robust_original()
+            : m_is_interior(false)
+            , m_has_interiors(true)
+        {}
+
+        inline robust_original(robust_ring_type const& ring,
+                bool is_interior, bool has_interiors)
+            : m_ring(ring)
+            , m_is_interior(is_interior)
+            , m_has_interiors(has_interiors)
+        {
+            geometry::envelope(m_ring, m_box);
+
+            // create monotonic sections in y-dimension
+            typedef boost::mpl::vector_c<std::size_t, 1> dimensions;
+            geometry::sectionalize<false, dimensions>(m_ring,
+                    detail::no_rescale_policy(), m_sections);
+        }
+
+        robust_ring_type m_ring;
+        robust_box_type m_box;
+        sections_type m_sections;
+
+        bool m_is_interior;
+        bool m_has_interiors;
+    };
+
+    typedef std::vector<piece> piece_vector_type;
+
+    piece_vector_type m_pieces;
+    turn_vector_type m_turns;
+    int m_first_piece_index;
+
+    buffered_ring_collection<buffered_ring<Ring> > offsetted_rings; // indexed by multi_index
+    std::vector<robust_original> robust_originals; // robust representation of the original(s)
+    robust_ring_type current_robust_ring;
+    buffered_ring_collection<Ring> traversed_rings;
+    segment_identifier current_segment_id;
+
+    // Specificly for offsetted rings around points
+    // but also for large joins with many points
+    typedef geometry::sections<robust_box_type, 2> sections_type;
+    sections_type monotonic_sections;
+
+
+    RobustPolicy const& m_robust_policy;
+
+    struct redundant_turn
+    {
+        inline bool operator()(buffer_turn_info_type const& turn) const
+        {
+            return turn.remove_on_multi;
+        }
+    };
+
+    buffered_piece_collection(RobustPolicy const& robust_policy)
+        : m_first_piece_index(-1)
+        , m_robust_policy(robust_policy)
+    {}
+
+
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+    // Will (most probably) be removed later
+    template <typename OccupationMap>
+    inline void adapt_mapped_robust_point(OccupationMap const& map,
+            buffer_turn_info_type& turn, int distance) const
+    {
+        for (int x = -distance; x <= distance; x++)
+        {
+            for (int y = -distance; y <= distance; y++)
+            {
+                robust_point_type rp = turn.robust_point;
+                geometry::set<0>(rp, geometry::get<0>(rp) + x);
+                geometry::set<1>(rp, geometry::get<1>(rp) + y);
+                if (map.find(rp) != map.end())
+                {
+                    turn.mapped_robust_point = rp;
+                    return;
+                }
+            }
+        }
+    }
+#endif
+
+    inline void get_occupation(
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+        int distance = 0
+#endif
+    )
+    {
+        typedef occupation_info<angle_info<robust_point_type, coordinate_type> >
+                buffer_occupation_info;
+
+        typedef std::map
+        <
+            robust_point_type,
+            buffer_occupation_info,
+            geometry::less<robust_point_type>
+        > occupation_map_type;
+
+        occupation_map_type occupation_map;
+
+        // 1: Add all intersection points to occupation map
+        typedef typename boost::range_iterator<turn_vector_type>::type
+            iterator_type;
+
+        for (iterator_type it = boost::begin(m_turns);
+            it != boost::end(m_turns);
+            ++it)
+        {
+            if (it->location == location_ok)
+            {
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+                if (distance > 0 && ! occupation_map.empty())
+                {
+                    adapt_mapped_robust_point(occupation_map, *it, distance);
+                }
+#endif
+                occupation_map[it->get_robust_point()].count++;
+            }
+        }
+
+        // Remove all points with one or more u/u points from the map
+        // (Alternatively, we could NOT do this here and change all u/u
+        // behaviour in overlay. Currently nothing is done: each polygon is
+        // just followed there. We could also always switch polygons there. For
+        // buffer behaviour, where 3 pieces might meet of which 2 (or more) form
+        // a u/u turn, this last option would have been better, probably).
+        for (iterator_type it = boost::begin(m_turns);
+            it != boost::end(m_turns);
+            ++it)
+        {
+            if (it->both(detail::overlay::operation_union))
+            {
+                typename occupation_map_type::iterator mit =
+                            occupation_map.find(it->get_robust_point());
+
+                if (mit != occupation_map.end())
+                {
+                    occupation_map.erase(mit);
+                }
+            }
+        }
+
+        // 2: Remove all points from map which has only one
+        typename occupation_map_type::iterator it = occupation_map.begin();
+        while (it != occupation_map.end())
+        {
+            if (it->second.count <= 1)
+            {
+                typename occupation_map_type::iterator to_erase = it;
+                ++it;
+                occupation_map.erase(to_erase);
+            }
+            else
+            {
+                ++it;
+            }
+        }
+
+        if (occupation_map.empty())
+        {
+            return;
+        }
+
+        // 3: Add vectors (incoming->intersection-point,
+        //                 intersection-point -> outgoing)
+        //    for all (co-located) points still present in the map
+
+        for (iterator_type it = boost::begin(m_turns);
+            it != boost::end(m_turns);
+            ++it)
+        {
+            typename occupation_map_type::iterator mit =
+                        occupation_map.find(it->get_robust_point());
+
+            if (mit != occupation_map.end())
+            {
+                buffer_occupation_info& info = mit->second;
+                for (int i = 0; i < 2; i++)
+                {
+                    add_incoming_and_outgoing_angles(it->get_robust_point(), *it,
+                                m_pieces,
+                                i, it->operations[i].seg_id,
+                                info);
+                }
+
+                it->count_on_multi++;
+            }
+        }
+
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+        // X: Check rounding issues
+        if (distance == 0)
+        {
+            for (typename occupation_map_type::const_iterator it = occupation_map.begin();
+                it != occupation_map.end(); ++it)
+            {
+                if (it->second.has_rounding_issues(it->first))
+                {
+                    if(distance == 0)
+                    {
+                        get_occupation(distance + 1);
+                        return;
+                    }
+                }
+            }
+        }
+#endif
+
+        // Get left turns from all clusters
+        for (typename occupation_map_type::iterator it = occupation_map.begin();
+            it != occupation_map.end(); ++it)
+        {
+            it->second.get_left_turns(it->first, m_turns);
+        }
+    }
+
+    inline void classify_turns(bool linear)
+    {
+        for (typename boost::range_iterator<turn_vector_type>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it)
+        {
+            if (it->count_within > 0)
+            {
+                it->location = inside_buffer;
+            }
+            if (it->count_on_original_boundary > 0 && ! linear)
+            {
+                it->location = inside_buffer;
+            }
+            if (it->count_within_near_offsetted > 0)
+            {
+                // Within can have in rare cases a rounding issue. We don't discard this
+                // point, so it can be used to continue started rings in traversal. But
+                // will never start a new ring from this type of points.
+                it->selectable_start = false;
+            }
+        }
+    }
+
+    template <typename DistanceStrategy>
+    inline void check_remaining_points(DistanceStrategy const& distance_strategy)
+    {
+        // Check if a turn is inside any of the originals
+
+        turn_in_original_visitor<turn_vector_type> visitor(m_turns);
+        geometry::partition
+            <
+                robust_box_type,
+                turn_get_box, turn_in_original_ovelaps_box,
+                original_get_box, original_ovelaps_box,
+                include_turn_policy, detail::partition::include_all_policy
+            >::apply(m_turns, robust_originals, visitor);
+
+        bool const deflate = distance_strategy.negative();
+
+        for (typename boost::range_iterator<turn_vector_type>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it)
+        {
+            buffer_turn_info_type& turn = *it;
+            if (turn.location == location_ok)
+            {
+                if (deflate && turn.count_in_original <= 0)
+                {
+                    // For deflate: it is not in original, discard
+                    turn.location = location_discard;
+                }
+                else if (! deflate && turn.count_in_original > 0)
+                {
+                    // For inflate: it is in original, discard
+                    turn.location = location_discard;
+                }
+            }
+        }
+    }
+
+    inline bool assert_indices_in_robust_rings() const
+    {
+        geometry::equal_to<robust_point_type> comparator;
+        for (typename boost::range_iterator<turn_vector_type const>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it)
+        {
+            for (int i = 0; i < 2; i++)
+            {
+                robust_point_type const &p1
+                    = m_pieces[it->operations[i].piece_index].robust_ring
+                              [it->operations[i].index_in_robust_ring];
+                robust_point_type const &p2 = it->robust_point;
+                if (! comparator(p1, p2))
+                {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    inline void insert_rescaled_piece_turns()
+    {
+        // Add rescaled turn points to corresponding pieces
+        // (after this, each turn occurs twice)
+        int index = 0;
+        for (typename boost::range_iterator<turn_vector_type>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it, ++index)
+        {
+            geometry::recalculate(it->robust_point, it->point, m_robust_policy);
+#if defined(BOOST_GEOMETRY_BUFFER_ENLARGED_CLUSTERS)
+            it->mapped_robust_point = it->robust_point;
+#endif
+
+            robust_turn turn;
+            it->turn_index = index;
+            turn.turn_index = index;
+            turn.point = it->robust_point;
+            for (int i = 0; i < 2; i++)
+            {
+                turn.operation_index = i;
+                turn.seg_id = it->operations[i].seg_id;
+                turn.fraction = it->operations[i].fraction;
+
+                piece& pc = m_pieces[it->operations[i].piece_index];
+                pc.robust_turns.push_back(turn);
+
+                // Take into account for the box (intersection points should fall inside,
+                // but in theory they can be one off because of rounding
+                geometry::expand(pc.robust_envelope, it->robust_point);
+                geometry::expand(pc.robust_offsetted_envelope, it->robust_point);
+            }
+        }
+
+        // Insert all rescaled turn-points into these rings, to form a
+        // reliable integer-based ring. All turns can be compared (inside) to this
+        // rings to see if they are inside.
+
+        for (typename piece_vector_type::iterator it = boost::begin(m_pieces);
+            it != boost::end(m_pieces);
+            ++it)
+        {
+            piece& pc = *it;
+            int piece_segment_index = pc.first_seg_id.segment_index;
+            if (! pc.robust_turns.empty())
+            {
+                if (pc.robust_turns.size() > 1u)
+                {
+                    std::sort(pc.robust_turns.begin(), pc.robust_turns.end(), buffer_operation_less());
+                }
+                // Walk through them, in reverse to insert at right index
+                int index_offset = pc.robust_turns.size() - 1;
+                for (typename std::vector<robust_turn>::const_reverse_iterator
+                        rit = pc.robust_turns.rbegin();
+                    rit != pc.robust_turns.rend();
+                    ++rit, --index_offset)
+                {
+                    int const index_in_vector = 1 + rit->seg_id.segment_index - piece_segment_index;
+                    BOOST_ASSERT
+                    (
+                        index_in_vector > 0
+                        && index_in_vector < pc.offsetted_count
+                    );
+
+                    pc.robust_ring.insert(boost::begin(pc.robust_ring) + index_in_vector, rit->point);
+                    pc.offsetted_count++;
+
+                    m_turns[rit->turn_index].operations[rit->operation_index].index_in_robust_ring = index_in_vector + index_offset;
+                }
+            }
+        }
+
+        BOOST_ASSERT(assert_indices_in_robust_rings());
+    }
+
+    template <std::size_t Dimension>
+    static inline void determine_monotonicity(piece& pc,
+            robust_point_type const& current,
+            robust_point_type const& next)
+    {
+        if (geometry::get<Dimension>(current) >= geometry::get<Dimension>(next))
+        {
+            pc.is_monotonic_increasing[Dimension] = false;
+        }
+        if (geometry::get<Dimension>(current) <= geometry::get<Dimension>(next))
+        {
+            pc.is_monotonic_decreasing[Dimension] = false;
+        }
+    }
+
+    static inline void determine_properties(piece& pc)
+    {
+        pc.is_monotonic_increasing[0] = true;
+        pc.is_monotonic_increasing[1] = true;
+        pc.is_monotonic_decreasing[0] = true;
+        pc.is_monotonic_decreasing[1] = true;
+
+        if (pc.offsetted_count < 2)
+        {
+            return;
+        }
+
+        typename robust_ring_type::const_iterator current = pc.robust_ring.begin();
+        typename robust_ring_type::const_iterator next = current + 1;
+
+        for (int i = 1; i < pc.offsetted_count; i++)
+        {
+            determine_monotonicity<0>(pc, *current, *next);
+            determine_monotonicity<1>(pc, *current, *next);
+            current = next;
+            ++next;
+        }
+
+    }
+
+    void determine_properties()
+    {
+        for (typename piece_vector_type::iterator it = boost::begin(m_pieces);
+            it != boost::end(m_pieces);
+            ++it)
+        {
+            determine_properties(*it);
+        }
+    }
+
+    inline void reverse_negative_robust_rings()
+    {
+        for (typename piece_vector_type::iterator it = boost::begin(m_pieces);
+            it != boost::end(m_pieces);
+            ++it)
+        {
+            piece& pc = *it;
+            if (geometry::area(pc.robust_ring) < 0)
+            {
+                // Rings can be ccw:
+                // - in a concave piece
+                // - in a line-buffer with a negative buffer-distance
+                std::reverse(pc.robust_ring.begin(), pc.robust_ring.end());
+            }
+        }
+    }
+
+    inline void prepare_buffered_point_piece(piece& pc)
+    {
+        // create monotonic sections in y-dimension
+        typedef boost::mpl::vector_c<std::size_t, 1> dimensions;
+        geometry::sectionalize<false, dimensions>(pc.robust_ring,
+                detail::no_rescale_policy(), pc.sections);
+
+        // TODO (next phase) determine min/max radius
+    }
+
+    inline void prepare_buffered_point_pieces()
+    {
+        for (typename piece_vector_type::iterator it = boost::begin(m_pieces);
+            it != boost::end(m_pieces);
+            ++it)
+        {
+            if (it->type == geometry::strategy::buffer::buffered_point)
+            {
+                prepare_buffered_point_piece(*it);
+            }
+        }
+    }
+
+    inline void get_turns()
+    {
+        for(typename boost::range_iterator<sections_type>::type it
+                = boost::begin(monotonic_sections);
+            it != boost::end(monotonic_sections);
+            ++it)
+        {
+            enlarge_box(it->bounding_box, 1);
+        }
+
+        {
+            // Calculate the turns
+            piece_turn_visitor
+                <
+                    piece_vector_type,
+                    buffered_ring_collection<buffered_ring<Ring> >,
+                    turn_vector_type,
+                    RobustPolicy
+                > visitor(m_pieces, offsetted_rings, m_turns, m_robust_policy);
+
+            geometry::partition
+                <
+                    robust_box_type,
+                    detail::section::get_section_box,
+                    detail::section::overlaps_section_box
+                >::apply(monotonic_sections, visitor);
+        }
+
+        insert_rescaled_piece_turns();
+
+        reverse_negative_robust_rings();
+
+        determine_properties();
+
+        prepare_buffered_point_pieces();
+
+        {
+            // Check if it is inside any of the pieces
+            turn_in_piece_visitor
+                <
+                    turn_vector_type, piece_vector_type
+                > visitor(m_turns, m_pieces);
+
+            geometry::partition
+                <
+                    robust_box_type,
+                    turn_get_box, turn_ovelaps_box,
+                    piece_get_box, piece_ovelaps_box
+                >::apply(m_turns, m_pieces, visitor);
+
+        }
+    }
+
+    inline void start_new_ring()
+    {
+        int const n = offsetted_rings.size();
+        current_segment_id.source_index = 0;
+        current_segment_id.multi_index = n;
+        current_segment_id.ring_index = -1;
+        current_segment_id.segment_index = 0;
+
+        offsetted_rings.resize(n + 1);
+        current_robust_ring.clear();
+
+        m_first_piece_index = boost::size(m_pieces);
+    }
+
+    inline void update_closing_point()
+    {
+        BOOST_ASSERT(! offsetted_rings.empty());
+        buffered_ring<Ring>& added = offsetted_rings.back();
+        if (! boost::empty(added))
+        {
+            range::back(added) = range::front(added);
+        }
+    }
+
+    inline void update_last_point(point_type const& p,
+            buffered_ring<Ring>& ring)
+    {
+        // For the first point of a new piece, and there were already
+        // points in the offsetted ring, for some piece types the first point
+        // is a duplicate of the last point of the previous piece.
+
+        // TODO: disable that, that point should not be added
+
+        // For now, it is made equal because due to numerical instability,
+        // it can be a tiny bit off, possibly causing a self-intersection
+
+        BOOST_ASSERT(boost::size(m_pieces) > 0);
+        if (! ring.empty()
+            && current_segment_id.segment_index
+                == m_pieces.back().first_seg_id.segment_index)
+        {
+            ring.back() = p;
+        }
+    }
+
+    inline void finish_ring(bool is_interior = false, bool has_interiors = false)
+    {
+        if (m_first_piece_index == -1)
+        {
+            return;
+        }
+
+        if (m_first_piece_index < static_cast<int>(boost::size(m_pieces)))
+        {
+            // If piece was added
+            // Reassign left-of-first and right-of-last
+            geometry::range::at(m_pieces, m_first_piece_index).left_index
+                                                    = boost::size(m_pieces) - 1;
+            geometry::range::back(m_pieces).right_index = m_first_piece_index;
+        }
+        m_first_piece_index = -1;
+
+        update_closing_point();
+
+        if (! current_robust_ring.empty())
+        {
+            BOOST_ASSERT
+            (
+                geometry::equals(current_robust_ring.front(),
+                    current_robust_ring.back())
+            );
+
+            robust_originals.push_back(
+                robust_original(current_robust_ring,
+                    is_interior, has_interiors));
+        }
+    }
+
+    inline void set_current_ring_concave()
+    {
+        BOOST_ASSERT(boost::size(offsetted_rings) > 0);
+        offsetted_rings.back().has_concave = true;
+    }
+
+    inline int add_point(point_type const& p)
+    {
+        BOOST_ASSERT(boost::size(offsetted_rings) > 0);
+
+        buffered_ring<Ring>& current_ring = offsetted_rings.back();
+        update_last_point(p, current_ring);
+
+        current_segment_id.segment_index++;
+        current_ring.push_back(p);
+        return current_ring.size();
+    }
+
+    //-------------------------------------------------------------------------
+
+    inline piece& create_piece(strategy::buffer::piece_type type,
+            bool decrease_segment_index_by_one)
+    {
+        if (type == strategy::buffer::buffered_concave)
+        {
+            offsetted_rings.back().has_concave = true;
+        }
+
+        piece pc;
+        pc.type = type;
+        pc.index = boost::size(m_pieces);
+        pc.first_seg_id = current_segment_id;
+
+        // Assign left/right (for first/last piece per ring they will be re-assigned later)
+        pc.left_index = pc.index - 1;
+        pc.right_index = pc.index + 1;
+
+        std::size_t const n = boost::size(offsetted_rings.back());
+        pc.first_seg_id.segment_index = decrease_segment_index_by_one ? n - 1 : n;
+        pc.last_segment_index = pc.first_seg_id.segment_index;
+
+        m_pieces.push_back(pc);
+        return m_pieces.back();
+    }
+
+    inline void init_rescale_piece(piece& pc, std::size_t helper_points_size)
+    {
+        if (pc.first_seg_id.segment_index < 0)
+        {
+            // This indicates an error situation: an earlier piece was empty
+            // It currently does not happen
+            // std::cout << "EMPTY " << pc.type << " " << pc.index << " " << pc.first_seg_id.multi_index << std::endl;
+            pc.offsetted_count = 0;
+            return;
+        }
+
+        BOOST_ASSERT(pc.first_seg_id.multi_index >= 0);
+        BOOST_ASSERT(pc.last_segment_index >= 0);
+
+        pc.offsetted_count = pc.last_segment_index - pc.first_seg_id.segment_index;
+        BOOST_ASSERT(pc.offsetted_count >= 0);
+
+        pc.robust_ring.reserve(pc.offsetted_count + helper_points_size);
+
+        // Add rescaled offsetted segments
+        {
+            buffered_ring<Ring> const& ring = offsetted_rings[pc.first_seg_id.multi_index];
+
+            typedef typename boost::range_iterator<const buffered_ring<Ring> >::type it_type;
+            for (it_type it = boost::begin(ring) + pc.first_seg_id.segment_index;
+                it != boost::begin(ring) + pc.last_segment_index;
+                ++it)
+            {
+                robust_point_type point;
+                geometry::recalculate(point, *it, m_robust_policy);
+                pc.robust_ring.push_back(point);
+            }
+        }
+    }
+
+    inline robust_point_type add_helper_point(piece& pc, const point_type& point)
+    {
+#if defined(BOOST_GEOMETRY_BUFFER_USE_HELPER_POINTS)
+        pc.helper_points.push_back(point);
+#endif
+
+        robust_point_type rob_point;
+        geometry::recalculate(rob_point, point, m_robust_policy);
+        pc.robust_ring.push_back(rob_point);
+        return rob_point;
+    }
+
+    // TODO: this is shared with sectionalize, move to somewhere else (assign?)
+    template <typename Box, typename Value>
+    inline void enlarge_box(Box& box, Value value)
+    {
+        geometry::set<0, 0>(box, geometry::get<0, 0>(box) - value);
+        geometry::set<0, 1>(box, geometry::get<0, 1>(box) - value);
+        geometry::set<1, 0>(box, geometry::get<1, 0>(box) + value);
+        geometry::set<1, 1>(box, geometry::get<1, 1>(box) + value);
+    }
+
+    inline void calculate_robust_envelope(piece& pc)
+    {
+        if (pc.offsetted_count == 0)
+        {
+            return;
+        }
+
+        geometry::detail::envelope::envelope_range::apply(pc.robust_ring,
+                pc.robust_envelope);
+
+        geometry::assign_inverse(pc.robust_offsetted_envelope);
+        for (int i = 0; i < pc.offsetted_count; i++)
+        {
+            geometry::expand(pc.robust_offsetted_envelope, pc.robust_ring[i]);
+        }
+
+        // Take roundings into account, enlarge boxes with 1 integer
+        enlarge_box(pc.robust_envelope, 1);
+        enlarge_box(pc.robust_offsetted_envelope, 1);
+    }
+
+    inline void sectionalize(piece& pc)
+    {
+
+        buffered_ring<Ring> const& ring = offsetted_rings.back();
+
+        typedef geometry::detail::sectionalize::sectionalize_part
+        <
+            point_type,
+            boost::mpl::vector_c<std::size_t, 0, 1> // x,y dimension
+        > sectionalizer;
+
+        // Create a ring-identifier. The source-index is the piece index
+        // The multi_index is as in this collection (the ring), but not used here
+        // The ring_index is not used
+        ring_identifier ring_id(pc.index, pc.first_seg_id.multi_index, -1);
+
+        sectionalizer::apply(monotonic_sections,
+            boost::begin(ring) + pc.first_seg_id.segment_index,
+            boost::begin(ring) + pc.last_segment_index,
+            m_robust_policy,
+            ring_id, 10);
+    }
+
+    inline void finish_piece(piece& pc)
+    {
+        init_rescale_piece(pc, 0u);
+        calculate_robust_envelope(pc);
+        sectionalize(pc);
+    }
+
+    inline void finish_piece(piece& pc,
+                    const point_type& point1,
+                    const point_type& point2,
+                    const point_type& point3)
+    {
+        init_rescale_piece(pc, 3u);
+        if (pc.offsetted_count == 0)
+        {
+            return;
+        }
+
+        add_helper_point(pc, point1);
+        robust_point_type mid_point = add_helper_point(pc, point2);
+        add_helper_point(pc, point3);
+        calculate_robust_envelope(pc);
+        sectionalize(pc);
+
+        current_robust_ring.push_back(mid_point);
+    }
+
+    inline void finish_piece(piece& pc,
+                    const point_type& point1,
+                    const point_type& point2,
+                    const point_type& point3,
+                    const point_type& point4)
+    {
+        init_rescale_piece(pc, 4u);
+        add_helper_point(pc, point1);
+        robust_point_type mid_point2 = add_helper_point(pc, point2);
+        robust_point_type mid_point1 = add_helper_point(pc, point3);
+        add_helper_point(pc, point4);
+        sectionalize(pc);
+        calculate_robust_envelope(pc);
+
+        // Add mid-points in other order to current helper_ring
+        current_robust_ring.push_back(mid_point1);
+        current_robust_ring.push_back(mid_point2);
+    }
+
+    inline void add_piece(strategy::buffer::piece_type type, point_type const& p,
+            point_type const& b1, point_type const& b2)
+    {
+        piece& pc = create_piece(type, false);
+        add_point(b1);
+        pc.last_segment_index = add_point(b2);
+        finish_piece(pc, b2, p, b1);
+    }
+
+    template <typename Range>
+    inline void add_range_to_piece(piece& pc, Range const& range, bool add_front)
+    {
+        BOOST_ASSERT(boost::size(range) != 0u);
+
+        typename Range::const_iterator it = boost::begin(range);
+
+        // If it follows a non-join (so basically the same piece-type) point b1 should be added.
+        // There should be two intersections later and it should be discarded.
+        // But for now we need it to calculate intersections
+        if (add_front)
+        {
+            add_point(*it);
+        }
+
+        for (++it; it != boost::end(range); ++it)
+        {
+            pc.last_segment_index = add_point(*it);
+        }
+    }
+
+
+    template <typename Range>
+    inline void add_piece(strategy::buffer::piece_type type, Range const& range,
+            bool decrease_segment_index_by_one)
+    {
+        piece& pc = create_piece(type, decrease_segment_index_by_one);
+
+        if (boost::size(range) > 0u)
+        {
+            add_range_to_piece(pc, range, offsetted_rings.back().empty());
+        }
+        finish_piece(pc);
+    }
+
+    template <typename Range>
+    inline void add_side_piece(point_type const& p1, point_type const& p2,
+            Range const& range, bool first)
+    {
+        BOOST_ASSERT(boost::size(range) >= 2u);
+
+        piece& pc = create_piece(strategy::buffer::buffered_segment, ! first);
+        add_range_to_piece(pc, range, first);
+        finish_piece(pc, range.back(), p2, p1, range.front());
+    }
+
+    template <typename Range>
+    inline void add_piece(strategy::buffer::piece_type type,
+            point_type const& p, Range const& range)
+    {
+        piece& pc = create_piece(type, true);
+
+        if (boost::size(range) > 0u)
+        {
+            add_range_to_piece(pc, range, offsetted_rings.back().empty());
+            finish_piece(pc, range.back(), p, range.front());
+        }
+        else
+        {
+            finish_piece(pc);
+        }
+    }
+
+    template <typename EndcapStrategy, typename Range>
+    inline void add_endcap(EndcapStrategy const& strategy, Range const& range,
+            point_type const& end_point)
+    {
+        boost::ignore_unused(strategy);
+
+        if (range.empty())
+        {
+            return;
+        }
+        strategy::buffer::piece_type pt = strategy.get_piece_type();
+        if (pt == strategy::buffer::buffered_flat_end)
+        {
+            // It is flat, should just be added, without helper segments
+            add_piece(pt, range, true);
+        }
+        else
+        {
+            // Normal case, it has an "inside", helper segments should be added
+            add_piece(pt, end_point, range);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+
+    inline void enrich()
+    {
+        typedef typename strategy::side::services::default_strategy
+        <
+            typename cs_tag<Ring>::type
+        >::type side_strategy_type;
+
+        enrich_intersection_points<false, false>(m_turns,
+                    detail::overlay::operation_union,
+                    offsetted_rings, offsetted_rings,
+                    m_robust_policy, side_strategy_type());
+    }
+
+    // Discards all rings which do have not-OK intersection points only.
+    // Those can never be traversed and should not be part of the output.
+    inline void discard_rings()
+    {
+        for (typename boost::range_iterator<turn_vector_type const>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it)
+        {
+            if (it->location != location_ok)
+            {
+                offsetted_rings[it->operations[0].seg_id.multi_index].has_discarded_intersections = true;
+                offsetted_rings[it->operations[1].seg_id.multi_index].has_discarded_intersections = true;
+            }
+            else if (! it->both(detail::overlay::operation_union))
+            {
+                offsetted_rings[it->operations[0].seg_id.multi_index].has_accepted_intersections = true;
+                offsetted_rings[it->operations[1].seg_id.multi_index].has_accepted_intersections = true;
+            }
+        }
+    }
+
+    inline bool point_coveredby_original(point_type const& point)
+    {
+        robust_point_type any_point;
+        geometry::recalculate(any_point, point, m_robust_policy);
+
+        int count_in_original = 0;
+
+        // Check of the robust point of this outputted ring is in
+        // any of the robust original rings
+        // This can go quadratic if the input has many rings, and there
+        // are many untouched deflated rings around
+        for (typename std::vector<robust_original>::const_iterator it
+            = robust_originals.begin();
+            it != robust_originals.end();
+            ++it)
+        {
+            robust_original const& original = *it;
+            if (detail::disjoint::disjoint_point_box(any_point,
+                    original.m_box))
+            {
+                continue;
+            }
+
+            int const geometry_code
+                = detail::within::point_in_geometry(any_point,
+                    original.m_ring);
+
+            if (geometry_code == -1)
+            {
+                // Outside, continue
+                continue;
+            }
+
+            // Apply for possibly nested interior rings
+            if (original.m_is_interior)
+            {
+                count_in_original--;
+            }
+            else if (original.m_has_interiors)
+            {
+                count_in_original++;
+            }
+            else
+            {
+                // Exterior ring without interior rings
+                return true;
+            }
+        }
+        return count_in_original > 0;
+    }
+
+    // For a deflate, all rings around inner rings which are untouched
+    // (no intersections/turns) and which are OUTSIDE the original should
+    // be discarded
+    inline void discard_nonintersecting_deflated_rings()
+    {
+        for(typename buffered_ring_collection<buffered_ring<Ring> >::iterator it
+            = boost::begin(offsetted_rings);
+            it != boost::end(offsetted_rings);
+            ++it)
+        {
+            buffered_ring<Ring>& ring = *it;
+            if (! ring.has_intersections()
+                && boost::size(ring) > 0u
+                && geometry::area(ring) < 0)
+            {
+                if (! point_coveredby_original(geometry::range::front(ring)))
+                {
+                    ring.is_untouched_outside_original = true;
+                }
+            }
+        }
+    }
+
+    inline void block_turns()
+    {
+        // To fix left-turn issues like #rt_u13
+        // But currently it causes more other issues than it fixes
+//        m_turns.erase
+//            (
+//                std::remove_if(boost::begin(m_turns), boost::end(m_turns),
+//                                redundant_turn()),
+//                boost::end(m_turns)
+//            );
+
+        for (typename boost::range_iterator<turn_vector_type>::type it =
+            boost::begin(m_turns); it != boost::end(m_turns); ++it)
+        {
+            if (it->location != location_ok)
+            {
+                // Set it to blocked. They should not be discarded, to avoid
+                // generating rings over these turns
+                // Performance goes down a tiny bit from 161 s to 173 because there
+                // are sometimes much more turns.
+                // We might speed it up a bit by keeping only one blocked
+                // intersection per segment, but that is complex to program
+                // because each turn involves two segments
+                it->operations[0].operation = detail::overlay::operation_blocked;
+                it->operations[1].operation = detail::overlay::operation_blocked;
+            }
+        }
+    }
+
+    inline void traverse()
+    {
+        typedef detail::overlay::traverse
+            <
+                false, false,
+                buffered_ring_collection<buffered_ring<Ring> >,
+                buffered_ring_collection<buffered_ring<Ring > >,
+                backtrack_for_buffer
+            > traverser;
+
+        traversed_rings.clear();
+        traverser::apply(offsetted_rings, offsetted_rings,
+                        detail::overlay::operation_union,
+                        m_robust_policy, m_turns, traversed_rings);
+    }
+
+    inline void reverse()
+    {
+        for(typename buffered_ring_collection<buffered_ring<Ring> >::iterator it = boost::begin(offsetted_rings);
+            it != boost::end(offsetted_rings);
+            ++it)
+        {
+            if (! it->has_intersections())
+            {
+                std::reverse(it->begin(), it->end());
+            }
+        }
+        for (typename boost::range_iterator<buffered_ring_collection<Ring> >::type
+                it = boost::begin(traversed_rings);
+                it != boost::end(traversed_rings);
+                ++it)
+        {
+            std::reverse(it->begin(), it->end());
+        }
+
+    }
+
+    template <typename GeometryOutput, typename OutputIterator>
+    inline OutputIterator assign(OutputIterator out) const
+    {
+        typedef detail::overlay::ring_properties<point_type> properties;
+
+        std::map<ring_identifier, properties> selected;
+
+        // Select all rings which do not have any self-intersection
+        // Inner rings, for deflate, which do not have intersections, and
+        // which are outside originals, are skipped
+        // (other ones should be traversed)
+        int index = 0;
+        for(typename buffered_ring_collection<buffered_ring<Ring> >::const_iterator it = boost::begin(offsetted_rings);
+            it != boost::end(offsetted_rings);
+            ++it, ++index)
+        {
+            if (! it->has_intersections()
+                && ! it->is_untouched_outside_original)
+            {
+                ring_identifier id(0, index, -1);
+                selected[id] = properties(*it);
+            }
+        }
+
+        // Select all created rings
+        index = 0;
+        for (typename boost::range_iterator<buffered_ring_collection<Ring> const>::type
+                it = boost::begin(traversed_rings);
+                it != boost::end(traversed_rings);
+                ++it, ++index)
+        {
+            ring_identifier id(2, index, -1);
+            selected[id] = properties(*it);
+        }
+
+        detail::overlay::assign_parents(offsetted_rings, traversed_rings, selected, true);
+        return detail::overlay::add_rings<GeometryOutput>(selected, offsetted_rings, traversed_rings, out);
+    }
+
+};
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_PIECE_COLLECTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,242 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_RING
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_RING
+
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/copy_segments.hpp>
+#include <boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>
+#include <boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_ring.hpp>
+#include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+#include <boost/geometry/multi/algorithms/within.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+struct buffered_ring_collection_tag : polygonal_tag, multi_tag
+{};
+
+
+template <typename Ring>
+struct buffered_ring : public Ring
+{
+    bool has_concave;
+    bool has_accepted_intersections;
+    bool has_discarded_intersections;
+    bool is_untouched_outside_original;
+
+    inline buffered_ring()
+        : has_concave(false)
+        , has_accepted_intersections(false)
+        , has_discarded_intersections(false)
+        , is_untouched_outside_original(false)
+    {}
+
+    inline bool discarded() const
+    {
+        return has_discarded_intersections && ! has_accepted_intersections;
+    }
+    inline bool has_intersections() const
+    {
+        return has_discarded_intersections || has_accepted_intersections;
+    }
+};
+
+// This is a collection now special for overlay (needs vector of rings)
+template <typename Ring>
+struct buffered_ring_collection : public std::vector<Ring>
+{
+};
+
+}} // namespace detail::buffer
+
+
+// Turn off concept checking (for now)
+namespace dispatch
+{
+template <typename Geometry, bool IsConst>
+struct check<Geometry, detail::buffer::buffered_ring_collection_tag, IsConst>
+{
+};
+
+}
+
+
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+// Register the types
+namespace traits
+{
+
+
+template <typename Ring>
+struct tag<detail::buffer::buffered_ring<Ring> >
+{
+    typedef ring_tag type;
+};
+
+
+template <typename Ring>
+struct point_order<detail::buffer::buffered_ring<Ring> >
+{
+    static const order_selector value = geometry::point_order<Ring>::value;
+};
+
+
+template <typename Ring>
+struct closure<detail::buffer::buffered_ring<Ring> >
+{
+    static const closure_selector value = geometry::closure<Ring>::value;
+};
+
+
+template <typename Ring>
+struct point_type<detail::buffer::buffered_ring_collection<Ring> >
+{
+    typedef typename geometry::point_type<Ring>::type type;
+};
+
+template <typename Ring>
+struct tag<detail::buffer::buffered_ring_collection<Ring> >
+{
+    typedef detail::buffer::buffered_ring_collection_tag type;
+};
+
+
+} // namespace traits
+
+
+
+
+namespace core_dispatch
+{
+
+template <typename Ring>
+struct ring_type
+<
+    detail::buffer::buffered_ring_collection_tag,
+    detail::buffer::buffered_ring_collection<Ring>
+>
+{
+    typedef Ring type;
+};
+
+}
+
+namespace dispatch
+{
+
+template
+<
+    typename MultiRing,
+    bool Reverse,
+    typename SegmentIdentifier,
+    typename PointOut
+>
+struct copy_segment_point
+    <
+        detail::buffer::buffered_ring_collection_tag,
+        MultiRing,
+        Reverse,
+        SegmentIdentifier,
+        PointOut
+    >
+    : detail::copy_segments::copy_segment_point_multi
+        <
+            MultiRing,
+            SegmentIdentifier,
+            PointOut,
+            detail::copy_segments::copy_segment_point_range
+                <
+                    typename boost::range_value<MultiRing>::type,
+                    Reverse,
+                    SegmentIdentifier,
+                    PointOut
+                >
+        >
+{};
+
+
+template<bool Reverse>
+struct copy_segments
+    <
+        detail::buffer::buffered_ring_collection_tag,
+        Reverse
+    >
+    : detail::copy_segments::copy_segments_multi
+        <
+            detail::copy_segments::copy_segments_ring<Reverse>
+        >
+{};
+
+template <typename Point, typename MultiGeometry>
+struct within
+<
+    Point,
+    MultiGeometry,
+    point_tag,
+    detail::buffer::buffered_ring_collection_tag
+>
+{
+    template <typename Strategy>
+    static inline bool apply(Point const& point,
+                MultiGeometry const& multi, Strategy const& strategy)
+    {
+        return detail::within::point_in_geometry(point, multi, strategy) == 1;
+    }
+};
+
+
+} // namespace dispatch
+
+namespace detail { namespace overlay
+{
+
+template<>
+struct get_ring<detail::buffer::buffered_ring_collection_tag>
+{
+    template<typename MultiGeometry>
+    static inline typename ring_type<MultiGeometry>::type const& apply(
+                ring_identifier const& id,
+                MultiGeometry const& multi_ring)
+    {
+        BOOST_ASSERT
+            (
+                id.multi_index >= 0
+                && id.multi_index < int(boost::size(multi_ring))
+            );
+        return get_ring<ring_tag>::apply(id, multi_ring[id.multi_index]);
+    }
+};
+
+}}
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_BUFFERED_RING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/get_piece_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,261 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_GET_PIECE_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_GET_PIECE_TURNS_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/expand.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
+#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/algorithms/detail/sections/section_functions.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+template
+<
+    typename Pieces,
+    typename Rings,
+    typename Turns,
+    typename RobustPolicy
+>
+class piece_turn_visitor
+{
+    Pieces const& m_pieces;
+    Rings const& m_rings;
+    Turns& m_turns;
+    RobustPolicy const& m_robust_policy;
+
+    template <typename Piece>
+    inline bool is_adjacent(Piece const& piece1, Piece const& piece2) const
+    {
+        if (piece1.first_seg_id.multi_index != piece2.first_seg_id.multi_index)
+        {
+            return false;
+        }
+
+        return piece1.index == piece2.left_index
+            || piece1.index == piece2.right_index;
+    }
+
+    template <typename Piece>
+    inline bool is_on_same_convex_ring(Piece const& piece1, Piece const& piece2) const
+    {
+        if (piece1.first_seg_id.multi_index != piece2.first_seg_id.multi_index)
+        {
+            return false;
+        }
+
+        return ! m_rings[piece1.first_seg_id.multi_index].has_concave;
+    }
+
+    template <typename Range, typename Iterator>
+    inline void move_to_next_point(Range const& range, Iterator& next) const
+    {
+        ++next;
+        if (next == boost::end(range))
+        {
+            next = boost::begin(range) + 1;
+        }
+    }
+
+    template <typename Range, typename Iterator>
+    inline Iterator next_point(Range const& range, Iterator it) const
+    {
+        Iterator result = it;
+        move_to_next_point(range, result);
+        // TODO: we could use either piece-boundaries, or comparison with
+        // robust points, to check if the point equals the last one
+        while(geometry::equals(*it, *result))
+        {
+            move_to_next_point(range, result);
+        }
+        return result;
+    }
+
+    template <std::size_t Dimension, typename Iterator, typename Box>
+    inline void move_begin_iterator(Iterator& it_begin, Iterator it_beyond,
+            int& index, int dir, Box const& other_bounding_box)
+    {
+        for(; it_begin != it_beyond
+                && it_begin + 1 != it_beyond
+                && detail::section::preceding<Dimension>(dir, *(it_begin + 1),
+                    other_bounding_box, m_robust_policy);
+            ++it_begin, index++)
+        {}
+    }
+
+    template <std::size_t Dimension, typename Iterator, typename Box>
+    inline void move_end_iterator(Iterator it_begin, Iterator& it_beyond,
+            int dir, Box const& other_bounding_box)
+    {
+        while (it_beyond != it_begin
+            && it_beyond - 1 != it_begin
+            && it_beyond - 2 != it_begin)
+        {
+            if (detail::section::exceeding<Dimension>(dir, *(it_beyond - 2),
+                        other_bounding_box, m_robust_policy))
+            {
+                --it_beyond;
+            }
+            else
+            {
+                return;
+            }
+        }
+    }
+
+    template <typename Piece, typename Section>
+    inline void calculate_turns(Piece const& piece1, Piece const& piece2,
+        Section const& section1, Section const& section2)
+    {
+        typedef typename boost::range_value<Rings const>::type ring_type;
+        typedef typename boost::range_value<Turns const>::type turn_type;
+        typedef typename boost::range_iterator<ring_type const>::type iterator;
+
+        int const piece1_first_index = piece1.first_seg_id.segment_index;
+        int const piece2_first_index = piece2.first_seg_id.segment_index;
+        if (piece1_first_index < 0 || piece2_first_index < 0)
+        {
+            return;
+        }
+
+        // Get indices of part of offsetted_rings for this monotonic section:
+        int const sec1_first_index = piece1_first_index + section1.begin_index;
+        int const sec2_first_index = piece2_first_index + section2.begin_index;
+
+        // index of last point in section, beyond-end is one further
+        int const sec1_last_index = piece1_first_index + section1.end_index;
+        int const sec2_last_index = piece2_first_index + section2.end_index;
+
+        // get geometry and iterators over these sections
+        ring_type const& ring1 = m_rings[piece1.first_seg_id.multi_index];
+        iterator it1_first = boost::begin(ring1) + sec1_first_index;
+        iterator it1_beyond = boost::begin(ring1) + sec1_last_index + 1;
+
+        ring_type const& ring2 = m_rings[piece2.first_seg_id.multi_index];
+        iterator it2_first = boost::begin(ring2) + sec2_first_index;
+        iterator it2_beyond = boost::begin(ring2) + sec2_last_index + 1;
+
+        // Set begin/end of monotonic ranges, in both x/y directions
+        int index1 = sec1_first_index;
+        move_begin_iterator<0>(it1_first, it1_beyond, index1,
+                    section1.directions[0], section2.bounding_box);
+        move_end_iterator<0>(it1_first, it1_beyond,
+                    section1.directions[0], section2.bounding_box);
+        move_begin_iterator<1>(it1_first, it1_beyond, index1,
+                    section1.directions[1], section2.bounding_box);
+        move_end_iterator<1>(it1_first, it1_beyond,
+                    section1.directions[1], section2.bounding_box);
+
+        int index2 = sec2_first_index;
+        move_begin_iterator<0>(it2_first, it2_beyond, index2,
+                    section2.directions[0], section1.bounding_box);
+        move_end_iterator<0>(it2_first, it2_beyond,
+                    section2.directions[0], section1.bounding_box);
+        move_begin_iterator<1>(it2_first, it2_beyond, index2,
+                    section2.directions[1], section1.bounding_box);
+        move_end_iterator<1>(it2_first, it2_beyond,
+                    section2.directions[1], section1.bounding_box);
+
+        turn_type the_model;
+        the_model.operations[0].piece_index = piece1.index;
+        the_model.operations[0].seg_id = piece1.first_seg_id;
+        the_model.operations[0].seg_id.segment_index = index1; // override
+
+        iterator it1 = it1_first;
+        for (iterator prev1 = it1++;
+                it1 != it1_beyond;
+                prev1 = it1++, the_model.operations[0].seg_id.segment_index++)
+        {
+            the_model.operations[1].piece_index = piece2.index;
+            the_model.operations[1].seg_id = piece2.first_seg_id;
+            the_model.operations[1].seg_id.segment_index = index2; // override
+
+            iterator next1 = next_point(ring1, it1);
+
+            iterator it2 = it2_first;
+            for (iterator prev2 = it2++;
+                    it2 != it2_beyond;
+                    prev2 = it2++, the_model.operations[1].seg_id.segment_index++)
+            {
+                iterator next2 = next_point(ring2, it2);
+
+                // TODO: internally get_turn_info calculates robust points.
+                // But they are already calculated.
+                // We should be able to use them.
+                // this means passing them to this visitor,
+                // and iterating in sync with them...
+                typedef detail::overlay::get_turn_info
+                    <
+                        detail::overlay::assign_null_policy
+                    > turn_policy;
+
+                turn_policy::apply(*prev1, *it1, *next1,
+                                    *prev2, *it2, *next2,
+                                    false, false, false, false,
+                                    the_model, m_robust_policy,
+                                    std::back_inserter(m_turns));
+            }
+        }
+    }
+
+public:
+
+    piece_turn_visitor(Pieces const& pieces,
+            Rings const& ring_collection,
+            Turns& turns,
+            RobustPolicy const& robust_policy)
+        : m_pieces(pieces)
+        , m_rings(ring_collection)
+        , m_turns(turns)
+        , m_robust_policy(robust_policy)
+    {}
+
+    template <typename Section>
+    inline void apply(Section const& section1, Section const& section2,
+                    bool first = true)
+    {
+        boost::ignore_unused_variable_warning(first);
+
+        typedef typename boost::range_value<Pieces const>::type piece_type;
+        piece_type const& piece1 = m_pieces[section1.ring_id.source_index];
+        piece_type const& piece2 = m_pieces[section2.ring_id.source_index];
+
+        if ( piece1.index == piece2.index
+          || is_adjacent(piece1, piece2)
+          || is_on_same_convex_ring(piece1, piece2)
+          || detail::disjoint::disjoint_box_box(section1.bounding_box,
+                    section2.bounding_box) )
+        {
+            return;
+        }
+
+        calculate_turns(piece1, piece2, section1, section2);
+    }
+};
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_GET_PIECE_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,88 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_LINE_LINE_INTERSECTION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_LINE_LINE_INTERSECTION_HPP
+
+
+#include <boost/geometry/arithmetic/determinant.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/algorithms/detail/buffer/parallel_continue.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+// TODO: once change this to proper strategy
+// It is different from current segment intersection because these are not segments but lines
+// If we have the Line concept, we can create a strategy
+// Assumes a convex corner
+struct line_line_intersection
+{
+
+    template <typename Point>
+    static inline strategy::buffer::join_selector apply(Point const& pi, Point const& pj,
+        Point const& qi, Point const& qj, Point& ip)
+    {
+        // See http://mathworld.wolfram.com/Line-LineIntersection.html
+        typedef typename coordinate_type<Point>::type coordinate_type;
+
+        coordinate_type const denominator
+            = determinant<coordinate_type>(get<0>(pi) - get<0>(pj),
+                get<1>(pi) - get<1>(pj),
+                get<0>(qi) - get<0>(qj),
+                get<1>(qi) - get<1>(qj));
+
+        // Even if the corner was checked before (so it is convex now), that
+        // was done on the original geometry. This function runs on the buffered
+        // geometries, where sides are generated and might be slightly off. In
+        // Floating Point, that slightly might just exceed the limit and we have
+        // to check it again.
+
+        // For round joins, it will not be used at all.
+        // For miter joints, there is a miter limit
+        // If segments are parallel/collinear we must be distinguish two cases:
+        // they continue each other, or they form a spike
+        if (math::equals(denominator, coordinate_type()))
+        {
+            return parallel_continue(get<0>(qj) - get<0>(qi),
+                                get<1>(qj) - get<1>(qi),
+                                get<0>(pj) - get<0>(pi),
+                                get<1>(pj) - get<1>(pi))
+                ? strategy::buffer::join_continue
+                : strategy::buffer::join_spike
+                ;
+        }
+
+        coordinate_type d1 = determinant<coordinate_type>(get<0>(pi), get<1>(pi), get<0>(pj), get<1>(pj));
+        coordinate_type d2 = determinant<coordinate_type>(get<0>(qi), get<1>(qi), get<0>(qj), get<1>(qj));
+
+        double const multiplier = 1.0 / denominator;
+
+        set<0>(ip, determinant<coordinate_type>(d1, get<0>(pi) - get<0>(pj), d2, get<0>(qi) - get<0>(qj)) * multiplier);
+        set<1>(ip, determinant<coordinate_type>(d1, get<1>(pi) - get<1>(pj), d2, get<1>(qi) - get<1>(qj)) * multiplier);
+
+        return strategy::buffer::join_convex;
+    }
+};
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_LINE_LINE_INTERSECTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/parallel_continue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_PARALLEL_CONTINUE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_PARALLEL_CONTINUE_HPP
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+template <typename T>
+inline bool parallel_continue(T dx1, T dy1, T dx2, T dy2)
+{
+    T const dot = dx1 * dx2 + dy1 * dy2;
+    return dot > 0;
+}
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_PARALLEL_CONTINUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/turn_in_original_visitor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,268 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_ORIGINAL_VISITOR
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_ORIGINAL_VISITOR
+
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/algorithms/expand.hpp>
+#include <boost/geometry/strategies/agnostic/point_in_poly_winding.hpp>
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+struct original_get_box
+{
+    template <typename Box, typename Original>
+    static inline void apply(Box& total, Original const& original)
+    {
+        geometry::expand(total, original.m_box);
+    }
+};
+
+struct original_ovelaps_box
+{
+    template <typename Box, typename Original>
+    static inline bool apply(Box const& box, Original const& original)
+    {
+        return ! detail::disjoint::disjoint_box_box(box, original.m_box);
+    }
+};
+
+struct include_turn_policy
+{
+    template <typename Turn>
+    static inline bool apply(Turn const& turn)
+    {
+        return turn.location == location_ok;
+    }
+};
+
+struct turn_in_original_ovelaps_box
+{
+    template <typename Box, typename Turn>
+    static inline bool apply(Box const& box, Turn const& turn)
+    {
+        if (turn.location != location_ok || turn.within_original)
+        {
+            // Skip all points already processed
+            return false;
+        }
+
+        return ! geometry::detail::disjoint::disjoint_point_box(
+                    turn.robust_point, box);
+    }
+};
+
+//! Check if specified is in range of specified iterators
+//! Return value of strategy (true if we can bail out)
+template
+<
+    typename Strategy,
+    typename State,
+    typename Point,
+    typename Iterator
+>
+inline bool point_in_range(Strategy& strategy, State& state,
+        Point const& point, Iterator begin, Iterator end)
+{
+    boost::ignore_unused(strategy);
+
+    Iterator it = begin;
+    for (Iterator previous = it++; it != end; ++previous, ++it)
+    {
+        if (! strategy.apply(point, *previous, *it, state))
+        {
+            // We're probably on the boundary
+            return false;
+        }
+    }
+    return true;
+}
+
+template
+<
+    typename Strategy,
+    typename State,
+    typename Point,
+    typename CoordinateType,
+    typename Iterator
+>
+inline bool point_in_section(Strategy& strategy, State& state,
+        Point const& point, CoordinateType const& point_y,
+        Iterator begin, Iterator end,
+        int direction)
+{
+    if (direction == 0)
+    {
+        // Not a monotonic section, or no change in Y-direction
+        return point_in_range(strategy, state, point, begin, end);
+    }
+
+    // We're in a monotonic section in y-direction
+    Iterator it = begin;
+
+    for (Iterator previous = it++; it != end; ++previous, ++it)
+    {
+        // Depending on sections.direction we can quit for this section
+        CoordinateType const previous_y = geometry::get<1>(*previous);
+
+        if (direction == 1 && point_y < previous_y)
+        {
+            // Section goes upwards, y increases, point is is below section
+            return true;
+        }
+        else if (direction == -1 && point_y > previous_y)
+        {
+            // Section goes downwards, y decreases, point is above section
+            return true;
+        }
+
+        if (! strategy.apply(point, *previous, *it, state))
+        {
+            // We're probably on the boundary
+            return false;
+        }
+    }
+    return true;
+}
+
+
+template <typename Point, typename Original>
+inline int point_in_original(Point const& point, Original const& original)
+{
+    typedef strategy::within::winding<Point> strategy_type;
+
+    typename strategy_type::state_type state;
+    strategy_type strategy;
+
+    if (boost::size(original.m_sections) == 0
+        || boost::size(original.m_ring) - boost::size(original.m_sections) < 16)
+    {
+        // There are no sections, or it does not profit to walk over sections
+        // instead of over points. Boundary of 16 is arbitrary but can influence
+        // performance
+        point_in_range(strategy, state, point,
+                original.m_ring.begin(), original.m_ring.end());
+        return strategy.result(state);
+    }
+
+    typedef typename Original::sections_type sections_type;
+    typedef typename boost::range_iterator<sections_type const>::type iterator_type;
+    typedef typename boost::range_value<sections_type const>::type section_type;
+    typedef typename geometry::coordinate_type<Point>::type coordinate_type;
+
+    coordinate_type const point_y = geometry::get<1>(point);
+
+    // Walk through all monotonic sections of this original
+    for (iterator_type it = boost::begin(original.m_sections);
+        it != boost::end(original.m_sections);
+        ++it)
+    {
+        section_type const& section = *it;
+
+        if (! section.duplicate
+            && section.begin_index < section.end_index
+            && point_y >= geometry::get<min_corner, 1>(section.bounding_box)
+            && point_y <= geometry::get<max_corner, 1>(section.bounding_box))
+        {
+            // y-coordinate of point overlaps with section
+            if (! point_in_section(strategy, state, point, point_y,
+                    boost::begin(original.m_ring) + section.begin_index,
+                    boost::begin(original.m_ring) + section.end_index + 1,
+                    section.directions[0]))
+            {
+                // We're probably on the boundary
+                break;
+            }
+        }
+    }
+
+    return strategy.result(state);
+}
+
+
+template <typename Turns>
+class turn_in_original_visitor
+{
+public:
+    turn_in_original_visitor(Turns& turns)
+        : m_mutable_turns(turns)
+    {}
+
+    template <typename Turn, typename Original>
+    inline void apply(Turn const& turn, Original const& original, bool first = true)
+    {
+        boost::ignore_unused_variable_warning(first);
+
+        if (turn.location != location_ok || turn.within_original)
+        {
+            // Skip all points already processed
+            return;
+        }
+
+        if (geometry::disjoint(turn.robust_point, original.m_box))
+        {
+            // Skip all disjoint
+            return;
+        }
+
+        int const code = point_in_original(turn.robust_point, original);
+
+        if (code == -1)
+        {
+            return;
+        }
+
+        Turn& mutable_turn = m_mutable_turns[turn.turn_index];
+
+        if (code == 0)
+        {
+            // On border of original: always discard
+            mutable_turn.location = location_discard;
+        }
+
+        // Point is inside an original ring
+        if (original.m_is_interior)
+        {
+            mutable_turn.count_in_original--;
+        }
+        else if (original.m_has_interiors)
+        {
+            mutable_turn.count_in_original++;
+        }
+        else
+        {
+            // It is an exterior ring and there are no interior rings.
+            // Then we are completely ready with this turn
+            mutable_turn.within_original = true;
+            mutable_turn.count_in_original = 1;
+        }
+    }
+
+private :
+    Turns& m_mutable_turns;
+};
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_ORIGINAL_VISITOR
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/buffer/turn_in_piece_visitor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,577 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_PIECE_VISITOR
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_PIECE_VISITOR
+
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/arithmetic/dot_product.hpp>
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/algorithms/comparable_distance.hpp>
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/expand.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
+#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+struct piece_get_box
+{
+    template <typename Box, typename Piece>
+    static inline void apply(Box& total, Piece const& piece)
+    {
+        geometry::expand(total, piece.robust_envelope);
+    }
+};
+
+struct piece_ovelaps_box
+{
+    template <typename Box, typename Piece>
+    static inline bool apply(Box const& box, Piece const& piece)
+    {
+        if (piece.type == strategy::buffer::buffered_flat_end
+            || piece.type == strategy::buffer::buffered_concave)
+        {
+            // Turns cannot be inside a flat end (though they can be on border)
+            // Neither we need to check if they are inside concave helper pieces
+
+            // Skip all pieces not used as soon as possible
+            return false;
+        }
+
+        return ! geometry::detail::disjoint::disjoint_box_box(box, piece.robust_envelope);
+    }
+};
+
+struct turn_get_box
+{
+    template <typename Box, typename Turn>
+    static inline void apply(Box& total, Turn const& turn)
+    {
+        geometry::expand(total, turn.robust_point);
+    }
+};
+
+struct turn_ovelaps_box
+{
+    template <typename Box, typename Turn>
+    static inline bool apply(Box const& box, Turn const& turn)
+    {
+        return ! geometry::detail::disjoint::disjoint_point_box(turn.robust_point, box);
+    }
+};
+
+
+enum analyse_result
+{
+    analyse_unknown,
+    analyse_continue,
+    analyse_disjoint,
+    analyse_within,
+    analyse_on_original_boundary,
+    analyse_on_offsetted,
+    analyse_near_offsetted
+};
+
+template <typename Point>
+inline bool in_box(Point const& previous,
+        Point const& current, Point const& point)
+{
+    // Get its box (TODO: this can be prepared-on-demand later)
+    typedef geometry::model::box<Point> box_type;
+    box_type box;
+    geometry::assign_inverse(box);
+    geometry::expand(box, previous);
+    geometry::expand(box, current);
+
+    return geometry::covered_by(point, box);
+}
+
+template <typename Point, typename Turn>
+inline analyse_result check_segment(Point const& previous,
+        Point const& current, Turn const& turn,
+        bool from_monotonic)
+{
+    typedef typename strategy::side::services::default_strategy
+        <
+            typename cs_tag<Point>::type
+        >::type side_strategy;
+    typedef typename geometry::coordinate_type<Point>::type coordinate_type;
+
+    coordinate_type const twice_area
+        = side_strategy::template side_value
+            <
+                coordinate_type,
+                coordinate_type
+            >(previous, current, turn.robust_point);
+
+    if (twice_area == 0)
+    {
+        // Collinear, only on segment if it is covered by its bbox
+        if (in_box(previous, current, turn.robust_point))
+        {
+            return analyse_on_offsetted;
+        }
+    }
+    else if (twice_area < 0)
+    {
+        // It is in the triangle right-of the segment where the
+        // segment is the hypothenusa. Check if it is close
+        // (within rounding-area)
+        if (twice_area * twice_area < geometry::comparable_distance(previous, current)
+            && in_box(previous, current, turn.robust_point))
+        {
+            return analyse_near_offsetted;
+        }
+        else if (from_monotonic)
+        {
+            return analyse_within;
+        }
+    }
+    else if (twice_area > 0 && from_monotonic)
+    {
+        // Left of segment
+        return analyse_disjoint;
+    }
+
+    // Not monotonic, on left or right side: continue analysing
+    return analyse_continue;
+}
+
+
+class analyse_turn_wrt_point_piece
+{
+public :
+    template <typename Turn, typename Piece>
+    static inline analyse_result apply(Turn const& turn, Piece const& piece)
+    {
+        typedef typename Piece::section_type section_type;
+        typedef typename Turn::robust_point_type point_type;
+        typedef typename geometry::coordinate_type<point_type>::type coordinate_type;
+
+        coordinate_type const point_y = geometry::get<1>(turn.robust_point);
+
+        typedef strategy::within::winding<point_type> strategy_type;
+
+        typename strategy_type::state_type state;
+        strategy_type strategy;
+        boost::ignore_unused(strategy);
+        
+        for (std::size_t s = 0; s < piece.sections.size(); s++)
+        {
+            section_type const& section = piece.sections[s];
+            // If point within vertical range of monotonic section:
+            if (! section.duplicate
+                && section.begin_index < section.end_index
+                && point_y >= geometry::get<min_corner, 1>(section.bounding_box) - 1
+                && point_y <= geometry::get<max_corner, 1>(section.bounding_box) + 1)
+            {
+                for (int i = section.begin_index + 1; i <= section.end_index; i++)
+                {
+                    point_type const& previous = piece.robust_ring[i - 1];
+                    point_type const& current = piece.robust_ring[i];
+
+                    analyse_result code = check_segment(previous, current, turn, false);
+                    if (code != analyse_continue)
+                    {
+                        return code;
+                    }
+
+                    // Get the state (to determine it is within), we don't have
+                    // to cover the on-segment case (covered above)
+                    strategy.apply(turn.robust_point, previous, current, state);
+                }
+            }
+        }
+
+        int const code = strategy.result(state);
+        if (code == 1)
+        {
+            return analyse_within;
+        }
+        else if (code == -1)
+        {
+            return analyse_disjoint;
+        }
+
+        // Should normally not occur - on-segment is covered
+        return analyse_unknown;
+    }
+
+};
+
+class analyse_turn_wrt_piece
+{
+    template <typename Point, typename Turn>
+    static inline analyse_result check_helper_segment(Point const& s1,
+                Point const& s2, Turn const& turn,
+                bool is_original,
+                Point const& offsetted)
+    {
+        typedef typename strategy::side::services::default_strategy
+            <
+                typename cs_tag<Point>::type
+            >::type side_strategy;
+
+        switch(side_strategy::apply(s1, s2, turn.robust_point))
+        {
+            case 1 :
+                return analyse_disjoint; // left of segment
+            case 0 :
+                {
+                    // If is collinear, either on segment or before/after
+                    typedef geometry::model::box<Point> box_type;
+
+                    box_type box;
+                    geometry::assign_inverse(box);
+                    geometry::expand(box, s1);
+                    geometry::expand(box, s2);
+
+                    if (geometry::covered_by(turn.robust_point, box))
+                    {
+                        // It is on the segment
+                        if (! is_original
+                            && geometry::comparable_distance(turn.robust_point, offsetted) <= 1)
+                        {
+                            // It is close to the offsetted-boundary, take
+                            // any rounding-issues into account
+                            return analyse_near_offsetted;
+                        }
+
+                        // Points on helper-segments are considered as within
+                        // Points on original boundary are processed differently
+                        return is_original
+                            ? analyse_on_original_boundary
+                            : analyse_within;
+                    }
+
+                    // It is collinear but not on the segment. Because these
+                    // segments are convex, it is outside
+                    // Unless the offsetted ring is collinear or concave w.r.t.
+                    // helper-segment but that scenario is not yet supported
+                    return analyse_disjoint;
+                }
+                break;
+        }
+
+        // right of segment
+        return analyse_continue;
+    }
+
+    template <typename Turn, typename Piece>
+    static inline analyse_result check_helper_segments(Turn const& turn, Piece const& piece)
+    {
+        typedef typename Turn::robust_point_type point_type;
+        geometry::equal_to<point_type> comparator;
+
+        point_type points[4];
+
+        int helper_count = piece.robust_ring.size() - piece.offsetted_count;
+        if (helper_count == 4)
+        {
+            for (int i = 0; i < 4; i++)
+            {
+                points[i] = piece.robust_ring[piece.offsetted_count + i];
+            }
+        }
+        else if (helper_count == 3)
+        {
+            // Triangular piece, assign points but assign second twice
+            for (int i = 0; i < 4; i++)
+            {
+                int index = i < 2 ? i : i - 1;
+                points[i] = piece.robust_ring[piece.offsetted_count + index];
+            }
+        }
+        else
+        {
+            // Some pieces (e.g. around points) do not have helper segments.
+            // Others should have 3 (join) or 4 (side)
+            return analyse_continue;
+        }
+
+        // First check point-equality
+        point_type const& point = turn.robust_point;
+        if (comparator(point, points[0]) || comparator(point, points[3]))
+        {
+            return analyse_on_offsetted;
+        }
+        if (comparator(point, points[1]) || comparator(point, points[2]))
+        {
+            return analyse_on_original_boundary;
+        }
+
+        // Right side of the piece
+        analyse_result result
+            = check_helper_segment(points[0], points[1], turn,
+                    false, points[0]);
+        if (result != analyse_continue)
+        {
+            return result;
+        }
+
+        // Left side of the piece
+        result = check_helper_segment(points[2], points[3], turn,
+                    false, points[3]);
+        if (result != analyse_continue)
+        {
+            return result;
+        }
+
+        if (! comparator(points[1], points[2]))
+        {
+            // Side of the piece at side of original geometry
+            result = check_helper_segment(points[1], points[2], turn,
+                        true, point);
+            if (result != analyse_continue)
+            {
+                return result;
+            }
+        }
+
+        // We are within the \/ or |_| shaped piece, where the top is the
+        // offsetted ring.
+        if (! geometry::covered_by(point, piece.robust_offsetted_envelope))
+        {
+            // Not in offsetted-area. This makes a cheap check possible
+            typedef typename strategy::side::services::default_strategy
+                <
+                    typename cs_tag<point_type>::type
+                >::type side_strategy;
+
+            switch(side_strategy::apply(points[3], points[0], point))
+            {
+                case 1 : return analyse_disjoint;
+                case -1 : return analyse_within;
+                case 0 : return analyse_disjoint;
+            }
+        }
+
+        return analyse_continue;
+    }
+
+    template <typename Turn, typename Piece, typename Compare>
+    static inline analyse_result check_monotonic(Turn const& turn, Piece const& piece, Compare const& compare)
+    {
+        typedef typename Piece::piece_robust_ring_type ring_type;
+        typedef typename ring_type::const_iterator it_type;
+        it_type end = piece.robust_ring.begin() + piece.offsetted_count;
+        it_type it = std::lower_bound(piece.robust_ring.begin(),
+                    end,
+                    turn.robust_point,
+                    compare);
+
+        if (it != end
+            && it != piece.robust_ring.begin())
+        {
+            // iterator points to point larger than point
+            // w.r.t. specified direction, and prev points to a point smaller
+            // We now know if it is inside/outside
+            it_type prev = it - 1;
+            return check_segment(*prev, *it, turn, true);
+        }
+        return analyse_continue;
+    }
+
+public :
+    template <typename Turn, typename Piece>
+    static inline analyse_result apply(Turn const& turn, Piece const& piece)
+    {
+        typedef typename Turn::robust_point_type point_type;
+        analyse_result code = check_helper_segments(turn, piece);
+        if (code != analyse_continue)
+        {
+            return code;
+        }
+
+        geometry::equal_to<point_type> comparator;
+
+        if (piece.offsetted_count > 8)
+        {
+            // If the offset contains some points and is monotonic, we try
+            // to avoid walking all points linearly.
+            // We try it only once.
+            if (piece.is_monotonic_increasing[0])
+            {
+                code = check_monotonic(turn, piece, geometry::less<point_type, 0>());
+                if (code != analyse_continue) return code;
+            }
+            else if (piece.is_monotonic_increasing[1])
+            {
+                code = check_monotonic(turn, piece, geometry::less<point_type, 1>());
+                if (code != analyse_continue) return code;
+            }
+            else if (piece.is_monotonic_decreasing[0])
+            {
+                code = check_monotonic(turn, piece, geometry::greater<point_type, 0>());
+                if (code != analyse_continue) return code;
+            }
+            else if (piece.is_monotonic_decreasing[1])
+            {
+                code = check_monotonic(turn, piece, geometry::greater<point_type, 1>());
+                if (code != analyse_continue) return code;
+            }
+        }
+
+        // It is small or not monotonic, walk linearly through offset
+        // TODO: this will be combined with winding strategy
+
+        for (int i = 1; i < piece.offsetted_count; i++)
+        {
+            point_type const& previous = piece.robust_ring[i - 1];
+            point_type const& current = piece.robust_ring[i];
+
+            // The robust ring can contain duplicates
+            // (on which any side or side-value would return 0)
+            if (! comparator(previous, current))
+            {
+                code = check_segment(previous, current, turn, false);
+                if (code != analyse_continue)
+                {
+                    return code;
+                }
+            }
+        }
+
+        return analyse_unknown;
+    }
+
+};
+
+
+template <typename Turns, typename Pieces>
+class turn_in_piece_visitor
+{
+    Turns& m_turns; // because partition is currently operating on const input only
+    Pieces const& m_pieces; // to check for piece-type
+
+    template <typename Operation, typename Piece>
+    inline bool skip(Operation const& op, Piece const& piece) const
+    {
+        if (op.piece_index == piece.index)
+        {
+            return true;
+        }
+        Piece const& pc = m_pieces[op.piece_index];
+        if (pc.left_index == piece.index || pc.right_index == piece.index)
+        {
+            if (pc.type == strategy::buffer::buffered_flat_end)
+            {
+                // If it is a flat end, don't compare against its neighbor:
+                // it will always be located on one of the helper segments
+                return true;
+            }
+            if (pc.type == strategy::buffer::buffered_concave)
+            {
+                // If it is concave, the same applies: the IP will be
+                // located on one of the helper segments
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+public:
+
+    inline turn_in_piece_visitor(Turns& turns, Pieces const& pieces)
+        : m_turns(turns)
+        , m_pieces(pieces)
+    {}
+
+    template <typename Turn, typename Piece>
+    inline void apply(Turn const& turn, Piece const& piece, bool first = true)
+    {
+        boost::ignore_unused_variable_warning(first);
+
+        if (turn.count_within > 0)
+        {
+            // Already inside - no need to check again
+            return;
+        }
+
+        if (piece.type == strategy::buffer::buffered_flat_end
+            || piece.type == strategy::buffer::buffered_concave)
+        {
+            // Turns cannot be located within flat-end or concave pieces
+            return;
+        }
+
+        if (! geometry::covered_by(turn.robust_point, piece.robust_envelope))
+        {
+            // Easy check: if the turn is not in the envelope, we can safely return
+            return;
+        }
+
+        if (skip(turn.operations[0], piece) || skip(turn.operations[1], piece))
+        {
+            return;
+        }
+
+        // TODO: mutable_piece to make some on-demand preparations in analyse
+        analyse_result analyse_code =
+            piece.type == geometry::strategy::buffer::buffered_point
+                ? analyse_turn_wrt_point_piece::apply(turn, piece)
+                : analyse_turn_wrt_piece::apply(turn, piece);
+
+        Turn& mutable_turn = m_turns[turn.turn_index];
+        switch(analyse_code)
+        {
+            case analyse_disjoint :
+                return;
+            case analyse_on_offsetted :
+                mutable_turn.count_on_offsetted++; // value is not used anymore
+                return;
+            case analyse_on_original_boundary :
+                mutable_turn.count_on_original_boundary++;
+                return;
+            case analyse_within :
+                mutable_turn.count_within++;
+                return;
+            case analyse_near_offsetted :
+                mutable_turn.count_within_near_offsetted++;
+                return;
+            default :
+                break;
+        }
+
+        // TODO: this point_in_geometry is a performance-bottleneck here and
+        // will be replaced completely by extending analyse_piece functionality
+        int geometry_code = detail::within::point_in_geometry(turn.robust_point, piece.robust_ring);
+
+        if (geometry_code == 1)
+        {
+            mutable_turn.count_within++;
+        }
+    }
+};
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TURN_IN_PIECE_VISITOR
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/centroid/translating_transformer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,119 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP
+
+
+#include <cstddef>
+
+#include <boost/core/addressof.hpp>
+#include <boost/core/ref.hpp>
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/arithmetic/arithmetic.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace centroid
+{
+
+
+// NOTE: There is no need to translate in other coordinate systems than
+// cartesian. But if it was needed then one should translate using
+// CS-specific technique, e.g. in spherical/geographic a translation
+// vector should contain coordinates being multiplies of 2PI or 360 deg.
+template <typename Geometry,
+          typename CastedTag = typename tag_cast
+                                <
+                                    typename tag<Geometry>::type,
+                                    areal_tag
+                                >::type,
+    typename CSTag = typename cs_tag<Geometry>::type>
+struct translating_transformer
+{
+    typedef typename geometry::point_type<Geometry>::type point_type;
+    typedef boost::reference_wrapper<point_type const> result_type;
+
+    explicit translating_transformer(Geometry const&) {}
+    explicit translating_transformer(point_type const&) {}
+
+    result_type apply(point_type const& pt) const
+    {
+        return result_type(pt);
+    }
+
+    template <typename ResPt>
+    void apply_reverse(ResPt &) const {}
+};
+
+// Specialization for Areal Geometries in cartesian CS
+template <typename Geometry>
+struct translating_transformer<Geometry, areal_tag, cartesian_tag>
+{
+    typedef typename geometry::point_type<Geometry>::type point_type;
+    typedef point_type result_type;
+    
+    explicit translating_transformer(Geometry const& geom)
+        : m_origin(NULL)
+    {
+        geometry::point_iterator<Geometry const>
+            pt_it = geometry::points_begin(geom);
+        if ( pt_it != geometry::points_end(geom) )
+        {
+            m_origin = boost::addressof(*pt_it);
+        }
+    }
+
+    explicit translating_transformer(point_type const& origin)
+        : m_origin(boost::addressof(origin))
+    {}
+
+    result_type apply(point_type const& pt) const
+    {
+        point_type res = pt;
+        if ( m_origin )
+            geometry::subtract_point(res, *m_origin);
+        return res;
+    }
+
+    template <typename ResPt>
+    void apply_reverse(ResPt & res_pt) const
+    {
+        if ( m_origin )
+            geometry::add_point(res_pt, *m_origin);
+    }
+
+    const point_type * m_origin;
+};
+
+
+}} // namespace detail::centroid
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CENTROID_TRANSLATING_TRANSFORMER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/check_iterator_range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,71 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP
+
+#include <boost/core/ignore_unused.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+// Check whether (each element of) an iterator range satisfies a given
+// predicate.
+// The predicate must be implemented as having a static apply unary
+// method that returns a bool.
+// By default an empty range is accepted
+template <typename Predicate, bool AllowEmptyRange = true>
+struct check_iterator_range
+{
+    template <typename InputIterator>
+    static inline bool apply(InputIterator first, InputIterator beyond)
+    {
+        for (InputIterator it = first; it != beyond; ++it)
+        {
+            if ( !Predicate::apply(*it) )
+            {
+                return false;
+            }
+        }
+        return AllowEmptyRange || first != beyond;
+    }
+
+
+    // version where we can pass a predicate object
+    template <typename InputIterator>
+    static inline bool apply(InputIterator first,
+                             InputIterator beyond,
+                             Predicate const& predicate)
+    {
+        // in case predicate's apply method is static, MSVC will
+        // complain that predicate is not used
+        boost::ignore_unused(predicate);
+
+        for (InputIterator it = first; it != beyond; ++it)
+        {
+            if ( !predicate.apply(*it) )
+            {
+                return false;
+            }
+        }
+        return AllowEmptyRange || first != beyond;
+    }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/geometry_to_range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,146 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_GEOMETRY_TO_RANGE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_GEOMETRY_TO_RANGE_HPP
+
+#include <iterator>
+
+#include <boost/assert.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace closest_feature
+{
+
+
+
+// returns the range iterator the realizes the closest
+// distance between the geometry and the element of the range
+class geometry_to_range
+{
+private:
+    template
+    <
+        typename Geometry,
+        typename RangeIterator,
+        typename Strategy,
+        typename Distance
+    >
+    static inline void apply(Geometry const& geometry,
+                             RangeIterator first,
+                             RangeIterator last,
+                             Strategy const& strategy,
+                             RangeIterator& it_min,
+                             Distance& dist_min)
+    {
+        BOOST_ASSERT( first != last );
+
+        Distance const zero = Distance(0);
+
+        // start with first distance
+        it_min = first;
+        dist_min = dispatch::distance
+            <
+                Geometry,
+                typename std::iterator_traits<RangeIterator>::value_type,
+                Strategy
+            >::apply(geometry, *it_min, strategy);
+
+        // check if other elements in the range are closer
+        for (RangeIterator it = ++first; it != last; ++it)
+        {
+            Distance dist = dispatch::distance
+                <
+                    Geometry,
+                    typename std::iterator_traits<RangeIterator>::value_type,
+                    Strategy
+                >::apply(geometry, *it, strategy);
+
+            if (geometry::math::equals(dist, zero))
+            {
+                dist_min = dist;
+                it_min = it;
+                return;
+            }
+            else if (dist < dist_min)
+            {
+                dist_min = dist;
+                it_min = it;
+            }
+        }
+    }
+
+public:
+    template
+    <
+        typename Geometry,
+        typename RangeIterator,
+        typename Strategy,
+        typename Distance
+    >    
+    static inline RangeIterator apply(Geometry const& geometry,
+                                      RangeIterator first,
+                                      RangeIterator last,
+                                      Strategy const& strategy,
+                                      Distance& dist_min)
+    {
+        RangeIterator it_min;
+        apply(geometry, first, last, strategy, it_min, dist_min);
+
+        return it_min;
+    }
+
+
+    template
+    <
+        typename Geometry,
+        typename RangeIterator,
+        typename Strategy
+    >    
+    static inline RangeIterator apply(Geometry const& geometry,
+                                      RangeIterator first,
+                                      RangeIterator last,
+                                      Strategy const& strategy)
+    {
+        typename strategy::distance::services::return_type
+            <
+                Strategy,
+                typename point_type<Geometry>::type,
+                typename point_type
+                    <
+                        typename std::iterator_traits
+                            <
+                                RangeIterator
+                            >::value_type
+                    >::type
+            >::type dist_min;
+
+        return apply(geometry, first, last, strategy, dist_min);
+    }
+};
+
+
+
+}} // namespace detail::closest_feature
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_GEOMETRY_TO_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/point_to_range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,250 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_POINT_TO_RANGE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_POINT_TO_RANGE_HPP
+
+#include <utility>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace closest_feature
+{
+
+
+// returns the segment (pair of iterators) that realizes the closest
+// distance of the point to the range
+template
+<
+    typename Point,
+    typename Range,
+    closure_selector Closure,
+    typename Strategy
+>
+class point_to_point_range
+{
+protected:
+    typedef typename boost::range_iterator<Range const>::type iterator_type;
+
+    template <typename Distance>
+    static inline void apply(Point const& point,
+                             iterator_type first,
+                             iterator_type last,
+                             Strategy const& strategy,
+                             iterator_type& it_min1,
+                             iterator_type& it_min2,
+                             Distance& dist_min)
+    {
+        BOOST_ASSERT( first != last );
+
+        Distance const zero = Distance(0);
+
+        iterator_type it = first;
+        iterator_type prev = it++;
+        if (it == last)
+        {
+            it_min1 = it_min2 = first;
+            dist_min = strategy.apply(point, *first, *first);
+            return;
+        }
+
+        // start with first segment distance
+        dist_min = strategy.apply(point, *prev, *it);
+        iterator_type prev_min_dist = prev;
+
+        // check if other segments are closer
+        for (++prev, ++it; it != last; ++prev, ++it)
+        {
+            Distance dist = strategy.apply(point, *prev, *it);
+            if (geometry::math::equals(dist, zero))
+            {
+                dist_min = zero;
+                it_min1 = prev;
+                it_min2 = it;
+                return;
+            }
+            else if (dist < dist_min)
+            {
+                dist_min = dist;
+                prev_min_dist = prev;
+            }
+        }
+
+        it_min1 = it_min2 = prev_min_dist;
+        ++it_min2;
+    }
+
+public:
+    typedef typename std::pair<iterator_type, iterator_type> return_type;
+
+    template <typename Distance>
+    static inline return_type apply(Point const& point,
+                                    iterator_type first,
+                                    iterator_type last,
+                                    Strategy const& strategy,
+                                    Distance& dist_min)
+    {
+        iterator_type it_min1, it_min2;
+        apply(point, first, last, strategy, it_min1, it_min2, dist_min);
+
+        return std::make_pair(it_min1, it_min2);
+    }
+
+    static inline return_type apply(Point const& point,
+                                    iterator_type first,
+                                    iterator_type last,
+                                    Strategy const& strategy)
+    {
+        typename strategy::distance::services::return_type
+            <
+                Strategy,
+                Point,
+                typename boost::range_value<Range>::type
+            >::type dist_min;
+
+        return apply(point, first, last, strategy, dist_min);
+    }
+
+    template <typename Distance>
+    static inline return_type apply(Point const& point,
+                                    Range const& range,
+                                    Strategy const& strategy,
+                                    Distance& dist_min)
+    {
+        return apply(point,
+                     boost::begin(range),
+                     boost::end(range),
+                     strategy,
+                     dist_min);
+    }
+
+    static inline return_type apply(Point const& point,
+                                    Range const& range,
+                                    Strategy const& strategy)
+    {
+        return apply(point, boost::begin(range), boost::end(range), strategy);
+    }
+};
+
+
+
+// specialization for open ranges
+template <typename Point, typename Range, typename Strategy>
+class point_to_point_range<Point, Range, open, Strategy>
+    : point_to_point_range<Point, Range, closed, Strategy>
+{
+private:
+    typedef point_to_point_range<Point, Range, closed, Strategy> base_type;
+    typedef typename base_type::iterator_type iterator_type;
+
+    template <typename Distance>
+    static inline void apply(Point const& point,
+                             iterator_type first,
+                             iterator_type last,
+                             Strategy const& strategy,
+                             iterator_type& it_min1,
+                             iterator_type& it_min2,
+                             Distance& dist_min)
+    {
+        BOOST_ASSERT( first != last );
+
+        base_type::apply(point, first, last, strategy,
+                         it_min1, it_min2, dist_min);
+
+        iterator_type it_back = --last;
+        Distance const zero = Distance(0);
+        Distance dist = strategy.apply(point, *it_back, *first);
+
+        if (geometry::math::equals(dist, zero))
+        {
+            dist_min = zero;
+            it_min1 = it_back;
+            it_min2 = first;
+        }
+        else if (dist < dist_min)
+        {
+            dist_min = dist;
+            it_min1 = it_back;
+            it_min2 = first;
+        }
+    }    
+
+public:
+    typedef typename std::pair<iterator_type, iterator_type> return_type;
+
+    template <typename Distance>
+    static inline return_type apply(Point const& point,
+                                    iterator_type first,
+                                    iterator_type last,
+                                    Strategy const& strategy,
+                                    Distance& dist_min)
+    {
+        iterator_type it_min1, it_min2;
+
+        apply(point, first, last, strategy, it_min1, it_min2, dist_min);
+
+        return std::make_pair(it_min1, it_min2);
+    }
+
+    static inline return_type apply(Point const& point,
+                                    iterator_type first,
+                                    iterator_type last,
+                                    Strategy const& strategy)
+    {
+        typedef typename strategy::distance::services::return_type
+            <
+                Strategy,
+                Point,
+                typename boost::range_value<Range>::type
+            >::type distance_return_type;
+
+        distance_return_type dist_min;
+
+        return apply(point, first, last, strategy, dist_min);
+    }
+
+    template <typename Distance>
+    static inline return_type apply(Point const& point,
+                                    Range const& range,
+                                    Strategy const& strategy,
+                                    Distance& dist_min)
+    {
+        return apply(point,
+                     boost::begin(range),
+                     boost::end(range),
+                     strategy,
+                     dist_min);
+    }
+
+    static inline return_type apply(Point const& point,
+                                    Range const& range,
+                                    Strategy const& strategy)
+    {
+        return apply(point, boost::begin(range), boost::end(range), strategy);
+    }
+};
+
+
+}} // namespace detail::closest_feature
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_POINT_TO_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/closest_feature/range_to_range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,197 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_RANGE_TO_RANGE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_RANGE_TO_RANGE_HPP
+
+#include <cstddef>
+
+#include <iterator>
+#include <utility>
+
+#include <boost/assert.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+#include <boost/geometry/index/rtree.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace closest_feature
+{
+
+
+// returns a pair of a objects where the first is an object of the
+// r-tree range and the second an object of the query range that
+// realizes the closest feature of the two ranges
+class range_to_range_rtree
+{
+private:
+    template
+    <
+        typename RTreeRangeIterator,
+        typename QueryRangeIterator,
+        typename Strategy,
+        typename RTreeValueType,
+        typename Distance
+    >
+    static inline void apply(RTreeRangeIterator rtree_first,
+                             RTreeRangeIterator rtree_last,
+                             QueryRangeIterator queries_first,
+                             QueryRangeIterator queries_last,
+                             Strategy const& strategy,
+                             RTreeValueType& rtree_min,
+                             QueryRangeIterator& qit_min,
+                             Distance& dist_min)
+    {
+        typedef index::rtree<RTreeValueType, index::linear<8> > rtree_type;
+
+        BOOST_ASSERT( rtree_first != rtree_last );
+        BOOST_ASSERT( queries_first != queries_last );
+
+        Distance const zero = Distance(0);
+        dist_min = zero;
+
+        // create -- packing algorithm
+        rtree_type rt(rtree_first, rtree_last);
+
+        RTreeValueType t_v;
+        bool first = true;
+
+        for (QueryRangeIterator qit = queries_first;
+             qit != queries_last; ++qit, first = false)
+        {
+            std::size_t n = rt.query(index::nearest(*qit, 1), &t_v);
+
+            BOOST_ASSERT( n > 0 );
+            // n above is unused outside BOOST_ASSERT, hence the call
+            // to boost::ignore_unused below
+            //
+            // however, t_v (initialized by the call to rt.query(...))
+            // is used below, which is why we cannot put the call to
+            // rt.query(...) inside BOOST_ASSERT
+            boost::ignore_unused(n);
+
+            Distance dist = dispatch::distance
+                <
+                    RTreeValueType,
+                    typename std::iterator_traits
+                        <
+                            QueryRangeIterator
+                        >::value_type,
+                    Strategy
+                >::apply(t_v, *qit, strategy);
+
+            if (first || dist < dist_min)
+            {
+                dist_min = dist;
+                rtree_min = t_v;
+                qit_min = qit;
+                if ( math::equals(dist_min, zero) )
+                {
+                    return;
+                }
+            }
+        }
+    }
+
+public:
+    template <typename RTreeRangeIterator, typename QueryRangeIterator>
+    struct return_type
+    {
+        typedef std::pair
+            <
+                typename std::iterator_traits<RTreeRangeIterator>::value_type,
+                QueryRangeIterator
+            > type;
+    };
+
+
+    template
+    <
+        typename RTreeRangeIterator,
+        typename QueryRangeIterator,
+        typename Strategy,
+        typename Distance
+    >
+    static inline typename return_type
+        <
+            RTreeRangeIterator, QueryRangeIterator
+        >::type apply(RTreeRangeIterator rtree_first,
+                      RTreeRangeIterator rtree_last,
+                      QueryRangeIterator queries_first,
+                      QueryRangeIterator queries_last,
+                      Strategy const& strategy,
+                      Distance& dist_min)
+    {
+        typedef typename std::iterator_traits
+            <
+                RTreeRangeIterator
+            >::value_type rtree_value_type;
+
+        rtree_value_type rtree_min;
+        QueryRangeIterator qit_min;
+
+        apply(rtree_first, rtree_last, queries_first, queries_last,
+              strategy, rtree_min, qit_min, dist_min);
+
+        return std::make_pair(rtree_min, qit_min);        
+    }
+
+
+    template
+    <
+        typename RTreeRangeIterator,
+        typename QueryRangeIterator,
+        typename Strategy
+    >
+    static inline typename return_type
+        <
+            RTreeRangeIterator, QueryRangeIterator
+        >::type apply(RTreeRangeIterator rtree_first,
+                      RTreeRangeIterator rtree_last,
+                      QueryRangeIterator queries_first,
+                      QueryRangeIterator queries_last,
+                      Strategy const& strategy)
+    {
+        typedef typename std::iterator_traits
+            <
+                RTreeRangeIterator
+            >::value_type rtree_value_type;
+
+        typename strategy::distance::services::return_type
+            <
+                Strategy,
+                typename point_type<rtree_value_type>::type,
+                typename point_type
+                    <
+                        typename std::iterator_traits
+                            <
+                                QueryRangeIterator
+                            >::value_type
+                    >::type
+            >::type dist_min;
+
+        return apply(rtree_first, rtree_last, queries_first, queries_last,
+                     strategy, dist_min);
+    }
+};
+
+
+}} // namespace detail::closest_feature
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CLOSEST_FEATURE_RANGE_TO_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/comparable_distance/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_IMPLEMENTATION_HPP
+
+#include <boost/geometry/algorithms/detail/distance/implementation.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/comparable_distance/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,363 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_INTERFACE_HPP
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/strategies/comparable_distance_result.hpp>
+#include <boost/geometry/strategies/default_comparable_distance_result.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/interface.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace resolve_strategy
+{
+
+struct comparable_distance
+{
+    template <typename Geometry1, typename Geometry2, typename Strategy>
+    static inline
+    typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        typedef typename strategy::distance::services::comparable_type
+            <
+                Strategy
+            >::type comparable_strategy_type;
+
+        return dispatch::distance
+            <
+                Geometry1, Geometry2, comparable_strategy_type
+            >::apply(geometry1,
+                     geometry2,
+                     strategy::distance::services::get_comparable
+                         <
+                             Strategy
+                         >::apply(strategy));
+    }
+
+    template <typename Geometry1, typename Geometry2>
+    static inline typename comparable_distance_result
+        <
+            Geometry1, Geometry2, default_strategy
+        >::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          default_strategy)
+    {
+        typedef typename strategy::distance::services::comparable_type
+            <
+                typename detail::distance::default_strategy
+                    <
+                        Geometry1, Geometry2
+                    >::type
+            >::type comparable_strategy_type;
+
+        return dispatch::distance
+            <
+                Geometry1, Geometry2, comparable_strategy_type
+            >::apply(geometry1, geometry2, comparable_strategy_type());
+    }
+};
+
+} // namespace resolve_strategy
+
+
+namespace resolve_variant
+{
+
+
+template <typename Geometry1, typename Geometry2>
+struct comparable_distance
+{
+    template <typename Strategy>
+    static inline
+    typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        return resolve_strategy::comparable_distance::apply(geometry1,
+                                                            geometry2,
+                                                            strategy);
+    }
+};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
+struct comparable_distance
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        Geometry2
+    >
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename comparable_distance_result
+                <
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+                    Geometry2,
+                    Strategy
+                >::type
+        >
+    {
+        Geometry2 const& m_geometry2;
+        Strategy const& m_strategy;
+
+        visitor(Geometry2 const& geometry2,
+                Strategy const& strategy)
+            : m_geometry2(geometry2),
+              m_strategy(strategy)
+        {}
+
+        template <typename Geometry1>
+        typename comparable_distance_result
+            <
+                Geometry1, Geometry2, Strategy
+            >::type
+        operator()(Geometry1 const& geometry1) const
+        {
+            return comparable_distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                    <
+                        Strategy
+                    >(geometry1, m_geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename comparable_distance_result
+        <
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+            Geometry2,
+            Strategy
+        >::type
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(geometry2, strategy), geometry1);
+    }
+};
+
+
+template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct comparable_distance
+    <
+        Geometry1,
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>
+    >
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename comparable_distance_result
+                <
+                    Geometry1,
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+                    Strategy
+                >::type
+        >
+    {
+        Geometry1 const& m_geometry1;
+        Strategy const& m_strategy;
+
+        visitor(Geometry1 const& geometry1,
+                Strategy const& strategy)
+            : m_geometry1(geometry1),
+              m_strategy(strategy)
+        {}
+
+        template <typename Geometry2>
+        typename comparable_distance_result
+            <
+                Geometry1, Geometry2, Strategy
+            >::type
+        operator()(Geometry2 const& geometry2) const
+        {
+            return comparable_distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                    <
+                        Strategy
+                    >(m_geometry1, geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename comparable_distance_result
+        <
+            Geometry1,
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+            Strategy
+        >::type
+    apply(Geometry1 const& geometry1,
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,
+          Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(geometry1, strategy), geometry2);
+    }
+};
+
+
+template
+<
+    BOOST_VARIANT_ENUM_PARAMS(typename T1),
+    BOOST_VARIANT_ENUM_PARAMS(typename T2)
+>
+struct comparable_distance
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
+    >
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename comparable_distance_result
+                <
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
+                    Strategy
+                >::type
+        >
+    {
+        Strategy const& m_strategy;
+
+        visitor(Strategy const& strategy)
+            : m_strategy(strategy)
+        {}
+
+        template <typename Geometry1, typename Geometry2>
+        typename comparable_distance_result
+            <
+                Geometry1, Geometry2, Strategy
+            >::type
+        operator()(Geometry1 const& geometry1, Geometry2 const& geometry2) const
+        {
+            return comparable_distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                    <
+                        Strategy
+                    >(geometry1, geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename comparable_distance_result
+        <
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
+            Strategy
+        >::type
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
+          Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(strategy), geometry1, geometry2);
+    }
+};
+
+} // namespace resolve_variant
+
+
+
+/*!
+\brief \brief_calc2{comparable distance measurement} \brief_strategy
+\ingroup distance
+\details The free function comparable_distance does not necessarily calculate the distance,
+    but it calculates a distance measure such that two distances are comparable to each other.
+    For example: for the Cartesian coordinate system, Pythagoras is used but the square root
+    is not taken, which makes it faster and the results of two point pairs can still be
+    compared to each other.
+\tparam Geometry1 first geometry type
+\tparam Geometry2 second geometry type
+\tparam Strategy \tparam_strategy{Distance}
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param strategy \param_strategy{distance}
+\return \return_calc{comparable distance}
+
+\qbk{distinguish,with strategy}
+ */
+template <typename Geometry1, typename Geometry2, typename Strategy>
+inline typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
+comparable_distance(Geometry1 const& geometry1, Geometry2 const& geometry2,
+                    Strategy const& strategy)
+{
+    concept::check<Geometry1 const>();
+    concept::check<Geometry2 const>();
+
+    return resolve_variant::comparable_distance
+        <
+            Geometry1,
+            Geometry2
+        >::apply(geometry1, geometry2, strategy);
+}
+
+
+
+/*!
+\brief \brief_calc2{comparable distance measurement}
+\ingroup distance
+\details The free function comparable_distance does not necessarily calculate the distance,
+    but it calculates a distance measure such that two distances are comparable to each other.
+    For example: for the Cartesian coordinate system, Pythagoras is used but the square root
+    is not taken, which makes it faster and the results of two point pairs can still be
+    compared to each other.
+\tparam Geometry1 first geometry type
+\tparam Geometry2 second geometry type
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\return \return_calc{comparable distance}
+
+\qbk{[include reference/algorithms/comparable_distance.qbk]}
+ */
+template <typename Geometry1, typename Geometry2>
+inline typename default_comparable_distance_result<Geometry1, Geometry2>::type
+comparable_distance(Geometry1 const& geometry1, Geometry2 const& geometry2)
+{
+    concept::check<Geometry1 const>();
+    concept::check<Geometry2 const>();
+
+    return comparable_distance(geometry1, geometry2, default_strategy());
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_COMPARABLE_DISTANCE_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/counting.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_COUNTING_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_COUNTING_HPP
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/detail/interior_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace counting
+{
+
+
+template <std::size_t D>
+struct other_count
+{
+    template <typename Geometry>
+    static inline std::size_t apply(Geometry const&)
+    {
+        return D;
+    }
+
+    template <typename Geometry>
+    static inline std::size_t apply(Geometry const&, bool)
+    {
+        return D;
+    }
+};
+
+
+template <typename RangeCount>
+struct polygon_count
+{
+    template <typename Polygon>
+    static inline std::size_t apply(Polygon const& poly)
+    {
+        std::size_t n = RangeCount::apply(exterior_ring(poly));
+
+        typename interior_return_type<Polygon const>::type
+            rings = interior_rings(poly);
+        for (typename detail::interior_iterator<Polygon const>::type
+                it = boost::begin(rings); it != boost::end(rings); ++it)
+        {
+            n += RangeCount::apply(*it);
+        }
+
+        return n;
+    }
+};
+
+
+template <typename SingleCount>
+struct multi_count
+{
+    template <typename MultiGeometry>
+    static inline std::size_t apply(MultiGeometry const& geometry)
+    {
+        std::size_t n = 0;
+        for (typename boost::range_iterator<MultiGeometry const>::type
+                 it = boost::begin(geometry);
+             it != boost::end(geometry);
+             ++it)
+        {
+            n += SingleCount::apply(*it);
+        }
+        return n;
+    }
+};
+
+
+}} // namespace detail::counting
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_COUNTING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/course.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_COURSE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_COURSE_HPP
+
+#include <boost/geometry/algorithms/detail/azimuth.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+/// Calculate course (bearing) between two points.
+///
+/// NOTE: left for convenience and temporary backward compatibility
+template <typename ReturnType, typename Point1, typename Point2>
+inline ReturnType course(Point1 const& p1, Point2 const& p2)
+{
+    return azimuth<ReturnType>(p1, p2);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_COURSE_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,361 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
-
-// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
-// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
-
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_HPP
-#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_HPP
-
-// Note: contrary to most files, the geometry::detail::disjoint namespace
-// is partly implemented in a separate file, to avoid circular references
-// disjoint -> get_turns -> disjoint
-
-#include <cstddef>
-
-#include <boost/range.hpp>
-
-#include <boost/geometry/core/access.hpp>
-#include <boost/geometry/core/coordinate_dimension.hpp>
-#include <boost/geometry/core/reverse_dispatch.hpp>
-
-#include <boost/geometry/algorithms/covered_by.hpp>
-
-#include <boost/geometry/util/math.hpp>
-
-
-
-namespace boost { namespace geometry
-{
-
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace disjoint
-{
-
-
-struct disjoint_interrupt_policy
-{
-    static bool const enabled = true;
-    bool has_intersections;
-
-    inline disjoint_interrupt_policy()
-        : has_intersections(false)
-    {}
-
-    template <typename Range>
-    inline bool apply(Range const& range)
-    {
-        // If there is any IP in the range, it is NOT disjoint
-        if (boost::size(range) > 0)
-        {
-            has_intersections = true;
-            return true;
-        }
-        return false;
-    }
-};
-
-
-
-template
-<
-    typename Point1, typename Point2,
-    std::size_t Dimension, std::size_t DimensionCount
->
-struct point_point
-{
-    static inline bool apply(Point1 const& p1, Point2 const& p2)
-    {
-        if (! geometry::math::equals(get<Dimension>(p1), get<Dimension>(p2)))
-        {
-            return true;
-        }
-        return point_point
-            <
-                Point1, Point2,
-                Dimension + 1, DimensionCount
-            >::apply(p1, p2);
-    }
-};
-
-
-template <typename Point1, typename Point2, std::size_t DimensionCount>
-struct point_point<Point1, Point2, DimensionCount, DimensionCount>
-{
-    static inline bool apply(Point1 const& , Point2 const& )
-    {
-        return false;
-    }
-};
-
-
-template
-<
-    typename Point, typename Box,
-    std::size_t Dimension, std::size_t DimensionCount
->
-struct point_box
-{
-    static inline bool apply(Point const& point, Box const& box)
-    {
-        if (get<Dimension>(point) < get<min_corner, Dimension>(box)
-            || get<Dimension>(point) > get<max_corner, Dimension>(box))
-        {
-            return true;
-        }
-        return point_box
-            <
-                Point, Box,
-                Dimension + 1, DimensionCount
-            >::apply(point, box);
-    }
-};
-
-
-template <typename Point, typename Box, std::size_t DimensionCount>
-struct point_box<Point, Box, DimensionCount, DimensionCount>
-{
-    static inline bool apply(Point const& , Box const& )
-    {
-        return false;
-    }
-};
-
-
-template
-<
-    typename Box1, typename Box2,
-    std::size_t Dimension, std::size_t DimensionCount
->
-struct box_box
-{
-    static inline bool apply(Box1 const& box1, Box2 const& box2)
-    {
-        if (get<max_corner, Dimension>(box1) < get<min_corner, Dimension>(box2))
-        {
-            return true;
-        }
-        if (get<min_corner, Dimension>(box1) > get<max_corner, Dimension>(box2))
-        {
-            return true;
-        }
-        return box_box
-            <
-                Box1, Box2,
-                Dimension + 1, DimensionCount
-            >::apply(box1, box2);
-    }
-};
-
-
-template <typename Box1, typename Box2, std::size_t DimensionCount>
-struct box_box<Box1, Box2, DimensionCount, DimensionCount>
-{
-    static inline bool apply(Box1 const& , Box2 const& )
-    {
-        return false;
-    }
-};
-
-// Segment - Box intersection
-// Based on Ray-AABB intersection
-// http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm
-
-// TODO - later maybe move to strategy::intersects and add a policy to conditionally extract intersection points
-
-template <typename Point, typename Box, size_t I>
-struct segment_box_intersection_dim
-{
-    //BOOST_STATIC_ASSERT(I < dimension<Box>::value);
-    //BOOST_STATIC_ASSERT(I < dimension<Point>::value);
-    //BOOST_STATIC_ASSERT(dimension<Point>::value == dimension<Box>::value);
-
-    typedef typename coordinate_type<Point>::type point_coordinate;
-
-    template <typename RelativeDistance> static inline
-    bool apply(Point const& p0, Point const& p1, Box const& b, RelativeDistance & t_near, RelativeDistance & t_far)
-    {
-        //// WARNING! - RelativeDistance must be IEEE float for this to work (division by 0)
-        //BOOST_STATIC_ASSERT(boost::is_float<RelativeDistance>::value);
-        //// Ray origin is in segment point 0
-        //RelativeDistance ray_d = geometry::get<I>(p1) - geometry::get<I>(p0);
-        //RelativeDistance tn = ( geometry::get<min_corner, I>(b) - geometry::get<I>(p0) ) / ray_d;
-        //RelativeDistance tf = ( geometry::get<max_corner, I>(b) - geometry::get<I>(p0) ) / ray_d;
-
-        // TODO - should we support also unsigned integers?
-        BOOST_STATIC_ASSERT(!boost::is_unsigned<point_coordinate>::value);
-        point_coordinate ray_d = geometry::get<I>(p1) - geometry::get<I>(p0);
-        RelativeDistance tn, tf;
-        if ( is_zero(ray_d) )
-        {
-            tn = dist_div_by_zero<RelativeDistance>(geometry::get<min_corner, I>(b) - geometry::get<I>(p0));
-            tf = dist_div_by_zero<RelativeDistance>(geometry::get<max_corner, I>(b) - geometry::get<I>(p0));
-        }
-        else
-        {
-            tn = static_cast<RelativeDistance>(geometry::get<min_corner, I>(b) - geometry::get<I>(p0)) / ray_d;
-            tf = static_cast<RelativeDistance>(geometry::get<max_corner, I>(b) - geometry::get<I>(p0)) / ray_d;
-        }
-
-        if ( tf < tn )
-            ::std::swap(tn, tf);
-
-        if ( t_near < tn )
-            t_near = tn;
-        if ( tf < t_far )
-            t_far = tf;
-
-        return 0 <= t_far && t_near <= t_far && t_near <= 1;
-    }
-
-    template <typename R, typename T> static inline
-    R dist_div_by_zero(T const& val)
-    {
-        if ( is_zero(val) )
-            return 0;
-        else if ( val < 0 )
-            return -(::std::numeric_limits<R>::max)();
-        else
-            return (::std::numeric_limits<R>::max)();
-    }
-
-    template <typename T> static inline
-    bool is_zero(T const& val)
-    {
-        // ray_d == 0 is here because eps of rational<int> is 0 which isn't < than 0
-        return val == 0 || math::abs(val) < ::std::numeric_limits<T>::epsilon();
-    }
-};
-
-template <typename Point, typename Box, size_t CurrentDimension>
-struct segment_box_intersection_impl
-{
-    BOOST_STATIC_ASSERT(0 < CurrentDimension);
-
-    typedef segment_box_intersection_dim<Point, Box, CurrentDimension - 1> for_dim;
-
-    template <typename RelativeDistance>
-    static inline bool apply(Point const& p0, Point const& p1, Box const& b,
-                             RelativeDistance & t_near, RelativeDistance & t_far)
-    {
-        return segment_box_intersection_impl<Point, Box, CurrentDimension - 1>::apply(p0, p1, b, t_near, t_far)
-            && for_dim::apply(p0, p1, b, t_near, t_far);
-    }
-};
-
-template <typename Point, typename Box>
-struct segment_box_intersection_impl<Point, Box, 1>
-{
-    typedef segment_box_intersection_dim<Point, Box, 0> for_dim;
-
-    template <typename RelativeDistance>
-    static inline bool apply(Point const& p0, Point const& p1, Box const& b,
-                             RelativeDistance & t_near, RelativeDistance & t_far)
-    {
-        return for_dim::apply(p0, p1, b, t_near, t_far);
-    }
-};
-
-template <typename Point, typename Box>
-struct segment_box_intersection
-{
-    typedef segment_box_intersection_impl<Point, Box, dimension<Box>::value> impl;
-
-    static inline bool apply(Point const& p0, Point const& p1, Box const& b)
-    {
-        typedef
-        typename geometry::promote_floating_point<
-            typename geometry::select_most_precise<
-                typename coordinate_type<Point>::type,
-                typename coordinate_type<Box>::type
-            >::type
-        >::type relative_distance_type;
-
-        relative_distance_type t_near = -(::std::numeric_limits<relative_distance_type>::max)();
-        relative_distance_type t_far = (::std::numeric_limits<relative_distance_type>::max)();
-
-        // relative_distance = 0 < t_near ? t_near : 0;
-
-        return impl::apply(p0, p1, b, t_near, t_far);
-    }
-};
-
-template
-<
-    typename Geometry1, typename Geometry2
->
-struct reverse_covered_by
-{
-    static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
-    {
-        return ! geometry::covered_by(geometry1, geometry2);
-    }
-};
-
-
-
-/*!
-    \brief Internal utility function to detect of boxes are disjoint
-    \note Is used from other algorithms, declared separately
-        to avoid circular references
- */
-template <typename Box1, typename Box2>
-inline bool disjoint_box_box(Box1 const& box1, Box2 const& box2)
-{
-    return box_box
-        <
-            Box1, Box2,
-            0, dimension<Box1>::type::value
-        >::apply(box1, box2);
-}
-
-
-
-/*!
-    \brief Internal utility function to detect of points are disjoint
-    \note To avoid circular references
- */
-template <typename Point1, typename Point2>
-inline bool disjoint_point_point(Point1 const& point1, Point2 const& point2)
-{
-    return point_point
-        <
-            Point1, Point2,
-            0, dimension<Point1>::type::value
-        >::apply(point1, point2);
-}
-
-
-}} // namespace detail::disjoint
-#endif // DOXYGEN_NO_DETAIL
-
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace equals
-{
-
-/*!
-    \brief Internal utility function to detect of points are disjoint
-    \note To avoid circular references
- */
-template <typename Point1, typename Point2>
-inline bool equals_point_point(Point1 const& point1, Point2 const& point2)
-{
-    return ! detail::disjoint::disjoint_point_point(point1, point2);
-}
-
-
-}} // namespace detail::equals
-#endif // DOXYGEN_NO_DETAIL
-
-}} // namespace boost::geometry
-
-#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/areal_areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,134 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_AREAL_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_AREAL_AREAL_HPP
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/detail/for_each_range.hpp>
+#include <boost/geometry/algorithms/detail/point_on_border.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/linear_linear.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template<typename Geometry>
+struct check_each_ring_for_within
+{
+    bool not_disjoint;
+    Geometry const& m_geometry;
+
+    inline check_each_ring_for_within(Geometry const& g)
+        : not_disjoint(false)
+        , m_geometry(g)
+    {}
+
+    template <typename Range>
+    inline void apply(Range const& range)
+    {
+        typename point_type<Range>::type pt;
+        not_disjoint = not_disjoint
+                || ( geometry::point_on_border(pt, range)
+                  && geometry::covered_by(pt, m_geometry) );
+    }
+};
+
+
+
+template <typename FirstGeometry, typename SecondGeometry>
+inline bool rings_containing(FirstGeometry const& geometry1,
+                                 SecondGeometry const& geometry2)
+{
+    check_each_ring_for_within<FirstGeometry> checker(geometry1);
+    geometry::detail::for_each_range(geometry2, checker);
+    return checker.not_disjoint;
+}
+
+
+
+template <typename Geometry1, typename Geometry2>
+struct general_areal
+{
+    static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        if ( ! disjoint_linear<Geometry1, Geometry2>::apply(geometry1, geometry2) )
+        {
+            return false;
+        }
+
+        // If there is no intersection of segments, they might located
+        // inside each other
+
+        // We check that using a point on the border (external boundary),
+        // and see if that is contained in the other geometry. And vice versa.
+
+        if ( rings_containing(geometry1, geometry2)
+          || rings_containing(geometry2, geometry1) )
+        {
+            return false;
+        }
+
+        return true;
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Areal1, typename Areal2>
+struct disjoint<Areal1, Areal2, 2, areal_tag, areal_tag, false>
+    : detail::disjoint::general_areal<Areal1, Areal2>
+{};
+
+
+template <typename Areal, typename Box>
+struct disjoint<Areal, Box, 2, areal_tag, box_tag, false>
+    : detail::disjoint::general_areal<Areal, Box>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_AREAL_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/box_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,114 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_BOX_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_BOX_BOX_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template
+<
+    typename Box1, typename Box2,
+    std::size_t Dimension, std::size_t DimensionCount
+>
+struct box_box
+{
+    static inline bool apply(Box1 const& box1, Box2 const& box2)
+    {
+        if (get<max_corner, Dimension>(box1) < get<min_corner, Dimension>(box2))
+        {
+            return true;
+        }
+        if (get<min_corner, Dimension>(box1) > get<max_corner, Dimension>(box2))
+        {
+            return true;
+        }
+        return box_box
+            <
+                Box1, Box2,
+                Dimension + 1, DimensionCount
+            >::apply(box1, box2);
+    }
+};
+
+
+template <typename Box1, typename Box2, std::size_t DimensionCount>
+struct box_box<Box1, Box2, DimensionCount, DimensionCount>
+{
+    static inline bool apply(Box1 const& , Box2 const& )
+    {
+        return false;
+    }
+};
+
+
+/*!
+    \brief Internal utility function to detect if boxes are disjoint
+    \note Is used from other algorithms, declared separately
+        to avoid circular references
+ */
+template <typename Box1, typename Box2>
+inline bool disjoint_box_box(Box1 const& box1, Box2 const& box2)
+{
+    return box_box
+        <
+            Box1, Box2,
+            0, dimension<Box1>::type::value
+        >::apply(box1, box2);
+}
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Box1, typename Box2, std::size_t DimensionCount>
+struct disjoint<Box1, Box2, DimensionCount, box_tag, box_tag, false>
+    : detail::disjoint::box_box<Box1, Box2, 0, DimensionCount>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_BOX_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,37 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_IMPLEMENTATION_HPP
+
+
+#include <boost/geometry/algorithms/detail/disjoint/areal_areal.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/linear_areal.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/linear_linear.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/multipoint_geometry.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_point.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/segment_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/linear_segment_or_box.hpp>
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,187 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_INTERFACE_HPP
+
+#include <cstddef>
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// If reversal is needed, perform it
+template
+<
+    typename Geometry1, typename Geometry2,
+    std::size_t DimensionCount,
+    typename Tag1, typename Tag2
+>
+struct disjoint<Geometry1, Geometry2, DimensionCount, Tag1, Tag2, true>
+{
+    static inline bool apply(Geometry1 const& g1, Geometry2 const& g2)
+    {
+        return disjoint
+            <
+                Geometry2, Geometry1,
+                DimensionCount,
+                Tag2, Tag1
+            >::apply(g2, g1);
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+namespace resolve_variant {
+
+template <typename Geometry1, typename Geometry2>
+struct disjoint
+{
+    static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        concept::check_concepts_and_equal_dimensions
+            <
+                Geometry1 const,
+                Geometry2 const
+            >();
+
+        return dispatch::disjoint<Geometry1, Geometry2>::apply(geometry1, geometry2);
+    }
+};
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
+struct disjoint<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
+{
+    struct visitor: boost::static_visitor<bool>
+    {
+        Geometry2 const& m_geometry2;
+
+        visitor(Geometry2 const& geometry2): m_geometry2(geometry2) {}
+
+        template <typename Geometry1>
+        bool operator()(Geometry1 const& geometry1) const
+        {
+            return disjoint<Geometry1, Geometry2>::apply(geometry1, m_geometry2);
+        }
+    };
+
+    static inline bool
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
+          Geometry2 const& geometry2)
+    {
+        return boost::apply_visitor(visitor(geometry2), geometry1);
+    }
+};
+
+template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct disjoint<Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    struct visitor: boost::static_visitor<bool>
+    {
+        Geometry1 const& m_geometry1;
+
+        visitor(Geometry1 const& geometry1): m_geometry1(geometry1) {}
+
+        template <typename Geometry2>
+        bool operator()(Geometry2 const& geometry2) const
+        {
+            return disjoint<Geometry1, Geometry2>::apply(m_geometry1, geometry2);
+        }
+    };
+
+    static inline bool
+    apply(Geometry1 const& geometry1,
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2)
+    {
+        return boost::apply_visitor(visitor(geometry1), geometry2);
+    }
+};
+
+template <
+    BOOST_VARIANT_ENUM_PARAMS(typename T1),
+    BOOST_VARIANT_ENUM_PARAMS(typename T2)
+>
+struct disjoint<
+    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
+>
+{
+    struct visitor: boost::static_visitor<bool>
+    {
+        template <typename Geometry1, typename Geometry2>
+        bool operator()(Geometry1 const& geometry1,
+                        Geometry2 const& geometry2) const
+        {
+            return disjoint<Geometry1, Geometry2>::apply(geometry1, geometry2);
+        }
+    };
+
+    static inline bool
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2)
+    {
+        return boost::apply_visitor(visitor(), geometry1, geometry2);
+    }
+};
+
+} // namespace resolve_variant
+
+
+
+/*!
+\brief \brief_check2{are disjoint}
+\ingroup disjoint
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\return \return_check2{are disjoint}
+
+\qbk{[include reference/algorithms/disjoint.qbk]}
+*/
+template <typename Geometry1, typename Geometry2>
+inline bool disjoint(Geometry1 const& geometry1,
+            Geometry2 const& geometry2)
+{
+    return resolve_variant::disjoint<Geometry1, Geometry2>::apply(geometry1, geometry2);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,272 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2015.
+// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_AREAL_HPP
+
+#include <iterator>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/algorithms/detail/assign_indexed_point.hpp>
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/point_on_border.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/multirange_geometry.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/linear_segment_or_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_box.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/segment_box.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+template <typename Geometry1, typename Geometry2,
+          typename Tag1 = typename tag<Geometry1>::type,
+          typename Tag1OrMulti = typename tag_cast<Tag1, multi_tag>::type>
+struct disjoint_no_intersections_policy
+{
+    static inline bool apply(Geometry1 const& g1, Geometry2 const& g2)
+    {
+        typedef typename point_type<Geometry1>::type point1_type;
+        point1_type p;
+        geometry::point_on_border(p, g1);
+        return !geometry::covered_by(p, g2);
+    }
+};
+
+template <typename Geometry1, typename Geometry2, typename Tag1>
+struct disjoint_no_intersections_policy<Geometry1, Geometry2, Tag1, multi_tag>
+{
+    static inline bool apply(Geometry1 const& g1, Geometry2 const& g2)
+    {
+        // TODO: use partition or rtree on g2
+        typedef typename boost::range_iterator<Geometry1 const>::type iterator;
+        for ( iterator it = boost::begin(g1) ; it != boost::end(g1) ; ++it )
+        {
+            typedef typename boost::range_value<Geometry1 const>::type value_type;
+            if ( ! disjoint_no_intersections_policy<value_type const, Geometry2>
+                    ::apply(*it, g2) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+
+template<typename Geometry1, typename Geometry2,
+         typename NoIntersectionsPolicy
+                    = disjoint_no_intersections_policy<Geometry1, Geometry2> >
+struct disjoint_linear_areal
+{
+    static inline bool apply(Geometry1 const& g1, Geometry2 const& g2)
+    {
+        // if there are intersections - return false
+        if ( !disjoint_linear<Geometry1, Geometry2>::apply(g1, g2) )
+        {
+            return false;
+        }
+
+        return NoIntersectionsPolicy::apply(g1, g2);
+    }
+};
+
+
+
+
+template
+<
+    typename Segment,
+    typename Areal,
+    typename Tag = typename tag<Areal>::type
+>
+struct disjoint_segment_areal
+    : not_implemented<Segment, Areal>
+{};
+
+
+template <typename Segment, typename Polygon>
+class disjoint_segment_areal<Segment, Polygon, polygon_tag>
+{
+private:
+    template <typename InteriorRings>
+    static inline
+    bool check_interior_rings(InteriorRings const& interior_rings,
+                              Segment const& segment)
+    {
+        typedef typename boost::range_value<InteriorRings>::type ring_type;
+
+        typedef unary_disjoint_geometry_to_query_geometry
+            <
+                Segment,
+                disjoint_range_segment_or_box
+                    <
+                        ring_type, closure<ring_type>::value, Segment
+                    >
+            > unary_predicate_type;
+                
+        return check_iterator_range
+            <
+                unary_predicate_type
+            >::apply(boost::begin(interior_rings),
+                     boost::end(interior_rings),
+                     unary_predicate_type(segment));
+    }
+
+
+public:
+    static inline bool apply(Segment const& segment, Polygon const& polygon)
+    {
+        typedef typename geometry::ring_type<Polygon>::type ring;
+
+        if ( !disjoint_range_segment_or_box
+                 <
+                     ring, closure<Polygon>::value, Segment
+                 >::apply(geometry::exterior_ring(polygon), segment) )
+        {
+            return false;
+        }
+
+        if ( !check_interior_rings(geometry::interior_rings(polygon), segment) )
+        {
+            return false;
+        }
+
+        typename point_type<Segment>::type p;
+        detail::assign_point_from_index<0>(segment, p);
+
+        return !geometry::covered_by(p, polygon);
+    }
+};
+
+
+template <typename Segment, typename MultiPolygon>
+struct disjoint_segment_areal<Segment, MultiPolygon, multi_polygon_tag>
+{
+    static inline
+    bool apply(Segment const& segment, MultiPolygon const& multipolygon)
+    {
+        return multirange_constant_size_geometry
+            <
+                MultiPolygon, Segment
+            >::apply(multipolygon, segment);
+    }
+};
+
+
+template <typename Segment, typename Ring>
+struct disjoint_segment_areal<Segment, Ring, ring_tag>
+{
+    static inline bool apply(Segment const& segment, Ring const& ring)
+    {
+        if ( !disjoint_range_segment_or_box
+                 <
+                     Ring, closure<Ring>::value, Segment
+                 >::apply(ring, segment) )
+        {
+            return false;
+        }
+
+        typename point_type<Segment>::type p;
+        detail::assign_point_from_index<0>(segment, p);
+        
+        return !geometry::covered_by(p, ring);        
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Linear, typename Areal>
+struct disjoint<Linear, Areal, 2, linear_tag, areal_tag, false>
+    : public detail::disjoint::disjoint_linear_areal<Linear, Areal>
+{};
+
+
+template <typename Areal, typename Linear>
+struct disjoint<Areal, Linear, 2, areal_tag, linear_tag, false>
+{    
+    static inline
+    bool apply(Areal const& areal, Linear const& linear)
+    {
+        return detail::disjoint::disjoint_linear_areal
+            <
+                Linear, Areal
+            >::apply(linear, areal);
+    }
+};
+
+
+template <typename Areal, typename Segment>
+struct disjoint<Areal, Segment, 2, areal_tag, segment_tag, false>
+{
+    static inline bool apply(Areal const& g1, Segment const& g2)
+    {
+        return detail::disjoint::disjoint_segment_areal
+            <
+                Segment, Areal
+            >::apply(g2, g1);
+    }
+};
+
+
+template <typename Segment, typename Areal>
+struct disjoint<Segment, Areal, 2, segment_tag, areal_tag, false>
+    : detail::disjoint::disjoint_segment_areal<Segment, Areal>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,187 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_LINEAR_HPP
+
+#include <cstddef>
+#include <deque>
+
+#include <boost/range.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
+#include <boost/geometry/algorithms/detail/overlay/do_reverse.hpp>
+
+#include <boost/geometry/policies/disjoint_interrupt_policy.hpp>
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio_type.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+template <typename Segment1, typename Segment2>
+struct disjoint_segment
+{
+    static inline bool apply(Segment1 const& segment1, Segment2 const& segment2)
+    {
+        typedef typename point_type<Segment1>::type point_type;
+
+        // We don't need to rescale to detect disjointness
+        typedef no_rescale_policy rescale_policy_type;
+        rescale_policy_type robust_policy;
+
+        typedef segment_intersection_points
+                <
+                    point_type,
+                    typename segment_ratio_type
+                    <
+                        point_type,
+                        rescale_policy_type
+                    >::type
+                > intersection_return_type;
+
+        intersection_return_type is
+            = strategy::intersection::relate_cartesian_segments
+            <
+                policies::relate::segments_intersection_points
+                    <
+                        intersection_return_type
+                    >
+            >::apply(segment1, segment2, robust_policy);
+
+        return is.count == 0;
+    }
+};
+
+
+struct assign_disjoint_policy
+{
+    // We want to include all points:
+    static bool const include_no_turn = true;
+    static bool const include_degenerate = true;
+    static bool const include_opposite = true;
+
+    // We don't assign extra info:
+    template
+    <
+        typename Info,
+        typename Point1,
+        typename Point2,
+        typename IntersectionInfo
+    >
+    static inline void apply(Info& , Point1 const& , Point2 const&,
+                IntersectionInfo const&)
+    {}
+};
+
+
+template <typename Geometry1, typename Geometry2>
+struct disjoint_linear
+{
+    static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        typedef typename geometry::point_type<Geometry1>::type point_type;
+        typedef detail::no_rescale_policy rescale_policy_type;
+        typedef typename geometry::segment_ratio_type
+            <
+                point_type, rescale_policy_type
+            >::type segment_ratio_type;
+        typedef overlay::turn_info
+            <
+                point_type,
+                segment_ratio_type,
+                typename detail::get_turns::turn_operation_type
+                        <
+                            Geometry1, Geometry2, segment_ratio_type
+                        >::type
+            > turn_info_type;
+
+        std::deque<turn_info_type> turns;
+
+        // Specify two policies:
+        // 1) Stop at any intersection
+        // 2) In assignment, include also degenerate points (which are normally skipped)
+        disjoint_interrupt_policy interrupt_policy;
+        dispatch::get_turns
+            <
+                typename geometry::tag<Geometry1>::type,
+                typename geometry::tag<Geometry2>::type,
+                Geometry1,
+                Geometry2,
+                overlay::do_reverse<geometry::point_order<Geometry1>::value>::value, // should be false
+                overlay::do_reverse<geometry::point_order<Geometry2>::value>::value, // should be false
+                detail::get_turns::get_turn_info_type
+                    <
+                        Geometry1, Geometry2, assign_disjoint_policy
+                    >
+            >::apply(0, geometry1, 1, geometry2,
+                     rescale_policy_type(), turns, interrupt_policy);
+
+        return !interrupt_policy.has_intersections;
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Linear1, typename Linear2>
+struct disjoint<Linear1, Linear2, 2, linear_tag, linear_tag, false>
+    : detail::disjoint::disjoint_linear<Linear1, Linear2>
+{};
+
+
+template <typename Segment1, typename Segment2>
+struct disjoint<Segment1, Segment2, 2, segment_tag, segment_tag, false>
+    : detail::disjoint::disjoint_segment<Segment1, Segment2>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/linear_segment_or_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,168 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_SEGMENT_OR_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_SEGMENT_OR_BOX_HPP
+
+#include <boost/range.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+
+#include <boost/geometry/geometries/segment.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/views/closeable_view.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/multirange_geometry.hpp>
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template
+<
+    typename Range,
+    closure_selector Closure,
+    typename SegmentOrBox
+>
+struct disjoint_range_segment_or_box
+{
+    static inline
+    bool apply(Range const& range, SegmentOrBox const& segment_or_box)
+    {
+        typedef typename closeable_view<Range const, Closure>::type view_type;
+
+        typedef typename ::boost::range_value<view_type>::type point_type;
+        typedef typename ::boost::range_iterator
+            <
+                view_type const
+            >::type const_iterator;
+
+        typedef typename ::boost::range_size<view_type>::type size_type;
+
+        typedef typename geometry::model::referring_segment
+            <
+                point_type const
+            > range_segment;
+
+        view_type view(range);
+
+        const size_type count = ::boost::size(view);
+
+        if ( count == 0 )
+        {
+            return false;
+        }
+        else if ( count == 1 )
+        {
+            return dispatch::disjoint
+                <
+                    point_type, SegmentOrBox
+                >::apply(geometry::range::front<view_type const>(view),
+                         segment_or_box);
+        }
+        else
+        {
+            const_iterator it0 = ::boost::begin(view);
+            const_iterator it1 = ::boost::begin(view) + 1;
+            const_iterator last = ::boost::end(view);
+
+            for ( ; it1 != last ; ++it0, ++it1 )
+            {
+                range_segment rng_segment(*it0, *it1);
+                if ( !dispatch::disjoint
+                         <
+                             range_segment, SegmentOrBox
+                         >::apply(rng_segment, segment_or_box) )
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+};
+
+
+
+
+template
+<
+    typename Linear,
+    typename SegmentOrBox,
+    typename Tag = typename tag<Linear>::type
+>
+struct disjoint_linear_segment_or_box
+    : not_implemented<Linear, SegmentOrBox>
+{};
+
+
+template <typename Linestring, typename SegmentOrBox>
+struct disjoint_linear_segment_or_box<Linestring, SegmentOrBox, linestring_tag>
+    : disjoint_range_segment_or_box<Linestring, closed, SegmentOrBox>
+{};
+
+
+template <typename MultiLinestring, typename SegmentOrBox>
+struct disjoint_linear_segment_or_box
+    <
+        MultiLinestring, SegmentOrBox, multi_linestring_tag
+    > : multirange_constant_size_geometry<MultiLinestring, SegmentOrBox>
+{};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Linear, typename Segment>
+struct disjoint<Linear, Segment, 2, linear_tag, segment_tag, false>
+    : detail::disjoint::disjoint_linear_segment_or_box<Linear, Segment>
+{};
+
+
+template <typename Linear, typename Box, std::size_t DimensionCount>
+struct disjoint<Linear, Box, DimensionCount, linear_tag, box_tag, false>
+    : detail::disjoint::disjoint_linear_segment_or_box<Linear, Box>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_LINEAR_SEGMENT_OR_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/multipoint_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,162 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIPOINT_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIPOINT_GEOMETRY_HPP
+
+#include <algorithm>
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/multirange_geometry.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_point.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/less.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+template<typename MultiPoint1, typename MultiPoint2>
+class multipoint_multipoint
+{
+private:
+    template <typename Iterator>
+    class unary_disjoint_predicate
+        : detail::relate::less
+    {
+    private:
+        typedef detail::relate::less base_type;
+
+    public:
+        unary_disjoint_predicate(Iterator first, Iterator last)
+            : base_type(), m_first(first), m_last(last)
+        {}
+
+        template <typename Point>
+        inline bool apply(Point const& point) const
+        {
+            return !std::binary_search(m_first,
+                                       m_last,
+                                       point,
+                                       static_cast<base_type const&>(*this));
+        }
+
+    private:
+        Iterator m_first, m_last;
+    };
+
+public:
+    static inline bool apply(MultiPoint1 const& multipoint1,
+                             MultiPoint2 const& multipoint2)
+    {
+        BOOST_ASSERT( boost::size(multipoint1) <= boost::size(multipoint2) );
+
+        typedef typename boost::range_value<MultiPoint1>::type point1_type;
+
+        std::vector<point1_type> points1(boost::begin(multipoint1),
+                                         boost::end(multipoint1));
+
+        std::sort(points1.begin(), points1.end(), detail::relate::less());
+
+        typedef unary_disjoint_predicate
+            <
+                typename std::vector<point1_type>::const_iterator
+            > predicate_type;
+
+        return check_iterator_range
+            <
+                predicate_type
+            >::apply(boost::begin(multipoint2),
+                     boost::end(multipoint2),
+                     predicate_type(points1.begin(), points1.end()));
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template<typename Point, typename MultiPoint, std::size_t DimensionCount>
+struct disjoint
+    <
+        Point, MultiPoint, DimensionCount, point_tag, multi_point_tag, false
+    > : detail::disjoint::multirange_constant_size_geometry<MultiPoint, Point>
+{};
+
+
+template<typename MultiPoint, typename Segment, std::size_t DimensionCount>
+struct disjoint
+    <
+        MultiPoint, Segment, DimensionCount, multi_point_tag, segment_tag, false
+    > : detail::disjoint::multirange_constant_size_geometry<MultiPoint, Segment>
+{};
+
+
+template<typename MultiPoint, typename Box, std::size_t DimensionCount>
+struct disjoint
+    <
+        MultiPoint, Box, DimensionCount, multi_point_tag, box_tag, false
+    > : detail::disjoint::multirange_constant_size_geometry<MultiPoint, Box>
+{};
+
+
+template<typename MultiPoint1, typename MultiPoint2, std::size_t DimensionCount>
+struct disjoint
+    <
+        MultiPoint1, MultiPoint2, DimensionCount,
+        multi_point_tag, multi_point_tag, false
+    >
+{
+    static inline bool apply(MultiPoint1 const& multipoint1,
+                             MultiPoint2 const& multipoint2)
+    {
+        if ( boost::size(multipoint2) < boost::size(multipoint1) )
+        {
+            return detail::disjoint::multipoint_multipoint
+                <
+                    MultiPoint2, MultiPoint1
+                >::apply(multipoint2, multipoint1);
+        } 
+
+        return detail::disjoint::multipoint_multipoint
+            <
+                MultiPoint1, MultiPoint2
+            >::apply(multipoint1, multipoint2);
+   }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIPOINT_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/multirange_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,85 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIRANGE_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIRANGE_GEOMETRY_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template <typename Geometry, typename BinaryPredicate>
+class unary_disjoint_geometry_to_query_geometry
+{
+public:
+    unary_disjoint_geometry_to_query_geometry(Geometry const& geometry)
+        : m_geometry(geometry)
+    {}
+
+    template <typename QueryGeometry>
+    inline bool apply(QueryGeometry const& query_geometry) const
+    {
+        return BinaryPredicate::apply(query_geometry, m_geometry);
+    }
+
+private:
+    Geometry const& m_geometry;
+};
+
+
+template<typename MultiRange, typename ConstantSizeGeometry>
+struct multirange_constant_size_geometry
+{
+    static inline bool apply(MultiRange const& multirange,
+                             ConstantSizeGeometry const& constant_size_geometry)
+    {
+        typedef unary_disjoint_geometry_to_query_geometry
+            <
+                ConstantSizeGeometry,
+                dispatch::disjoint
+                    <
+                        typename boost::range_value<MultiRange>::type,
+                        ConstantSizeGeometry
+                    >
+            > unary_predicate_type;
+
+        return detail::check_iterator_range
+            <
+                unary_predicate_type
+            >::apply(boost::begin(multirange), boost::end(multirange),
+                     unary_predicate_type(constant_size_geometry));
+    }
+
+    static inline bool apply(ConstantSizeGeometry const& constant_size_geometry,
+                             MultiRange const& multirange)
+    {
+        return apply(multirange, constant_size_geometry);
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_MULTIRANGE_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_BOX_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template
+<
+    typename Point, typename Box,
+    std::size_t Dimension, std::size_t DimensionCount
+>
+struct point_box
+{
+    static inline bool apply(Point const& point, Box const& box)
+    {
+        if (get<Dimension>(point) < get<min_corner, Dimension>(box)
+            || get<Dimension>(point) > get<max_corner, Dimension>(box))
+        {
+            return true;
+        }
+        return point_box
+            <
+                Point, Box,
+                Dimension + 1, DimensionCount
+            >::apply(point, box);
+    }
+};
+
+
+template <typename Point, typename Box, std::size_t DimensionCount>
+struct point_box<Point, Box, DimensionCount, DimensionCount>
+{
+    static inline bool apply(Point const& , Box const& )
+    {
+        return false;
+    }
+};
+
+/*!
+    \brief Internal utility function to detect if point/box are disjoint
+ */
+template <typename Point, typename Box>
+inline bool disjoint_point_box(Point const& point, Box const& box)
+{
+    return detail::disjoint::point_box
+        <
+            Point, Box,
+            0, dimension<Point>::type::value
+        >::apply(point, box);
+}
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Point, typename Box, std::size_t DimensionCount>
+struct disjoint<Point, Box, DimensionCount, point_tag, box_tag, false>
+    : detail::disjoint::point_box<Point, Box, 0, DimensionCount>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,111 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_GEOMETRY_HPP
+
+#include <boost/geometry/geometries/segment.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/linear_linear.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template<typename Point, typename Geometry>
+struct disjoint_point_linear
+{
+    static inline
+    bool apply(Point const& pt, Geometry const& g)
+    {
+        return !geometry::covered_by(pt, g);
+    }
+};
+
+
+template <typename Geometry1, typename Geometry2>
+struct reverse_covered_by
+{
+    static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        return !geometry::covered_by(geometry1, geometry2);
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template<typename Point, typename Linear, std::size_t DimensionCount>
+struct disjoint<Point, Linear, DimensionCount, point_tag, linear_tag, false>
+    : public detail::disjoint::disjoint_point_linear<Point, Linear>
+{};
+
+
+template <typename Point, typename Areal, std::size_t DimensionCount>
+struct disjoint<Point, Areal, DimensionCount, point_tag, areal_tag, false>
+    : detail::disjoint::reverse_covered_by<Point, Areal>
+{};
+
+
+template<typename Point, typename Segment, std::size_t DimensionCount>
+struct disjoint<Point, Segment, DimensionCount, point_tag, segment_tag, false>
+{
+    static inline bool apply(Point const& point, Segment const& segment)
+    {
+        typedef geometry::model::referring_segment<Point const> other_segment;
+
+        other_segment other(point, point);
+        return detail::disjoint::disjoint_segment
+            <
+                Segment, other_segment
+            >::apply(segment, other);
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/point_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,112 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_POINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_POINT_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+template
+<
+    typename Point1, typename Point2,
+    std::size_t Dimension, std::size_t DimensionCount
+>
+struct point_point
+{
+    static inline bool apply(Point1 const& p1, Point2 const& p2)
+    {
+        if (! geometry::math::equals(get<Dimension>(p1), get<Dimension>(p2)))
+        {
+            return true;
+        }
+        return point_point
+            <
+                Point1, Point2,
+                Dimension + 1, DimensionCount
+            >::apply(p1, p2);
+    }
+};
+
+
+template <typename Point1, typename Point2, std::size_t DimensionCount>
+struct point_point<Point1, Point2, DimensionCount, DimensionCount>
+{
+    static inline bool apply(Point1 const& , Point2 const& )
+    {
+        return false;
+    }
+};
+
+
+/*!
+    \brief Internal utility function to detect of points are disjoint
+    \note To avoid circular references
+ */
+template <typename Point1, typename Point2>
+inline bool disjoint_point_point(Point1 const& point1, Point2 const& point2)
+{
+    return point_point
+        <
+            Point1, Point2,
+            0, dimension<Point1>::type::value
+        >::apply(point1, point2);
+}
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Point1, typename Point2, std::size_t DimensionCount>
+struct disjoint<Point1, Point2, DimensionCount, point_tag, point_tag, false>
+    : detail::disjoint::point_point<Point1, Point2, 0, DimensionCount>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/disjoint/segment_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,291 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_SEGMENT_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_SEGMENT_BOX_HPP
+
+#include <cstddef>
+#include <utility>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/calculation_type.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/algorithms/detail/assign_indexed_point.hpp>
+
+#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+template <std::size_t I>
+struct compute_tmin_tmax_per_dim
+{
+    template <typename SegmentPoint, typename Box, typename RelativeDistance>
+    static inline void apply(SegmentPoint const& p0,
+                             SegmentPoint const& p1,
+                             Box const& box,
+                             RelativeDistance& ti_min,
+                             RelativeDistance& ti_max,
+                             RelativeDistance& diff)
+    {
+        typedef typename coordinate_type<Box>::type box_coordinate_type;
+        typedef typename coordinate_type
+            <
+                SegmentPoint
+            >::type point_coordinate_type;
+
+        RelativeDistance c_p0 = boost::numeric_cast
+            <
+                point_coordinate_type
+            >( geometry::get<I>(p0) );
+
+        RelativeDistance c_p1 = boost::numeric_cast
+            <
+                point_coordinate_type
+            >( geometry::get<I>(p1) );
+
+        RelativeDistance c_b_min = boost::numeric_cast
+            <
+                box_coordinate_type
+            >( geometry::get<geometry::min_corner, I>(box) );
+
+        RelativeDistance c_b_max = boost::numeric_cast
+            <
+                box_coordinate_type
+            >( geometry::get<geometry::max_corner, I>(box) );
+
+        if ( geometry::get<I>(p1) >= geometry::get<I>(p0) )
+        {
+            diff = c_p1 - c_p0;
+            ti_min = c_b_min - c_p0;
+            ti_max = c_b_max - c_p0;
+        }
+        else
+        {
+            diff = c_p0 - c_p1;
+            ti_min = c_p0 - c_b_max;
+            ti_max = c_p0 - c_b_min;
+        }
+    }
+};
+
+
+template
+<
+    typename RelativeDistance,
+    typename SegmentPoint,
+    typename Box,
+    std::size_t I,
+    std::size_t Dimension
+>
+struct disjoint_segment_box_impl
+{
+    template <typename RelativeDistancePair>
+    static inline bool apply(SegmentPoint const& p0,
+                             SegmentPoint const& p1,
+                             Box const& box,
+                             RelativeDistancePair& t_min,
+                             RelativeDistancePair& t_max)
+    {
+        RelativeDistance ti_min, ti_max, diff;
+
+        compute_tmin_tmax_per_dim<I>::apply(p0, p1, box, ti_min, ti_max, diff);
+
+        if ( geometry::math::equals(diff, 0) )
+        {
+            if ( (geometry::math::equals(t_min.second, 0)
+                  && t_min.first > ti_max)
+                 ||
+                 (geometry::math::equals(t_max.second, 0)
+                  && t_max.first < ti_min) )
+            {
+                return true;
+            }
+        }
+
+        RelativeDistance t_min_x_diff = t_min.first * diff;
+        RelativeDistance t_max_x_diff = t_max.first * diff;
+
+        if ( t_min_x_diff > ti_max * t_min.second
+             || t_max_x_diff < ti_min * t_max.second )
+        {
+            return true;
+        }
+
+        if ( ti_min * t_min.second > t_min_x_diff )
+        {
+            t_min.first = ti_min;
+            t_min.second = diff;
+        }
+        if ( ti_max * t_max.second < t_max_x_diff )
+        {
+            t_max.first = ti_max;
+            t_max.second = diff;
+        }
+
+        if ( t_min.first > t_min.second || t_max.first < 0 )
+        {
+            return true;
+        }
+
+        return disjoint_segment_box_impl
+            <
+                RelativeDistance,
+                SegmentPoint,
+                Box, 
+                I + 1,
+                Dimension
+            >::apply(p0, p1, box, t_min, t_max);
+    }
+};
+
+
+template
+<
+    typename RelativeDistance,
+    typename SegmentPoint,
+    typename Box,
+    std::size_t Dimension
+>
+struct disjoint_segment_box_impl
+    <
+        RelativeDistance, SegmentPoint, Box, 0, Dimension
+    >
+{
+    static inline bool apply(SegmentPoint const& p0,
+                             SegmentPoint const& p1,
+                             Box const& box)
+    {
+        std::pair<RelativeDistance, RelativeDistance> t_min, t_max;
+        RelativeDistance diff;
+
+        compute_tmin_tmax_per_dim<0>::apply(p0, p1, box,
+                                            t_min.first, t_max.first, diff);
+
+        if ( geometry::math::equals(diff, 0) )
+        {
+            if ( geometry::math::equals(t_min.first, 0) ) { t_min.first = -1; }
+            if ( geometry::math::equals(t_max.first, 0) ) { t_max.first = 1; }
+        }
+
+        if ( t_min.first > diff || t_max.first < 0 )
+        {
+            return true;
+        }
+
+        t_min.second = t_max.second = diff;
+
+        return disjoint_segment_box_impl
+            <
+                RelativeDistance, SegmentPoint, Box, 1, Dimension
+            >::apply(p0, p1, box, t_min, t_max);
+    }
+};
+
+
+template
+<
+    typename RelativeDistance,
+    typename SegmentPoint,
+    typename Box,
+    std::size_t Dimension
+>
+struct disjoint_segment_box_impl
+    <
+        RelativeDistance, SegmentPoint, Box, Dimension, Dimension
+    >
+{
+    template <typename RelativeDistancePair>
+    static inline bool apply(SegmentPoint const&, SegmentPoint const&,
+                             Box const&,
+                             RelativeDistancePair&, RelativeDistancePair&)
+    {
+        return false;
+    }
+};
+
+
+//=========================================================================
+
+
+template <typename Segment, typename Box>
+struct disjoint_segment_box
+{ 
+    static inline bool apply(Segment const& segment, Box const& box)
+    {
+        assert_dimension_equal<Segment, Box>();
+
+        typedef typename util::calculation_type::geometric::binary
+            <
+                Segment, Box, void
+            >::type relative_distance_type;
+
+        typedef typename point_type<Segment>::type segment_point_type;
+        segment_point_type p0, p1;
+        geometry::detail::assign_point_from_index<0>(segment, p0);
+        geometry::detail::assign_point_from_index<1>(segment, p1);
+
+        return disjoint_segment_box_impl
+            <
+                relative_distance_type, segment_point_type, Box,
+                0, dimension<Box>::value
+            >::apply(p0, p1, box);
+    }
+};
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Segment, typename Box, std::size_t DimensionCount>
+struct disjoint<Segment, Box, DimensionCount, segment_tag, box_tag, false>
+    : detail::disjoint::disjoint_segment_box<Segment, Box>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_SEGMENT_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/backward_compatibility.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,333 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/assign.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
+#include <boost/geometry/algorithms/detail/distance/point_to_geometry.hpp>
+#include <boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template<typename Point, typename Segment, typename Strategy>
+struct point_to_segment
+{
+    static inline typename strategy::distance::services::return_type
+        <
+            Strategy,
+            Point,
+            typename point_type<Segment>::type
+        >::type
+    apply(Point const& point, Segment const& segment, Strategy const& )
+    {
+        typename detail::distance::default_ps_strategy
+            <
+                Point,
+                typename point_type<Segment>::type,
+                Strategy
+            >::type segment_strategy;
+
+        typename point_type<Segment>::type p[2];
+        geometry::detail::assign_point_from_index<0>(segment, p[0]);
+        geometry::detail::assign_point_from_index<1>(segment, p[1]);
+        return segment_strategy.apply(point, p[0], p[1]);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// Point-segment version 1, with point-point strategy
+template <typename Point, typename Segment, typename Strategy>
+struct distance
+<
+    Point, Segment, Strategy,
+    point_tag, segment_tag, strategy_tag_distance_point_point,
+    false
+> : detail::distance::point_to_segment<Point, Segment, Strategy>
+{};
+
+
+// Point-line version 1, where point-point strategy is specified
+template <typename Point, typename Linestring, typename Strategy>
+struct distance
+<
+    Point, Linestring, Strategy,
+    point_tag, linestring_tag, strategy_tag_distance_point_point,
+    false
+>
+{
+
+    static inline typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Linestring>::type
+        >::type
+    apply(Point const& point,
+          Linestring const& linestring,
+          Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+                    <
+                        Point,
+                        typename point_type<Linestring>::type,
+                        Strategy
+                    >::type ps_strategy_type;
+
+        return detail::distance::point_to_range
+            <
+                Point, Linestring, closed, ps_strategy_type
+            >::apply(point, linestring, ps_strategy_type());
+    }
+};
+
+
+// Point-ring , where point-point strategy is specified
+template <typename Point, typename Ring, typename Strategy>
+struct distance
+<
+    Point, Ring, Strategy,
+    point_tag, ring_tag, strategy_tag_distance_point_point,
+    false
+>
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Ring>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+            Ring const& ring,
+            Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+            <
+                Point,
+                typename point_type<Ring>::type,
+                Strategy
+            >::type ps_strategy_type;
+
+        return detail::distance::point_to_ring
+            <
+                Point, Ring,
+                geometry::closure<Ring>::value,
+                ps_strategy_type
+            >::apply(point, ring, ps_strategy_type());
+    }
+};
+
+
+// Point-polygon , where point-point strategy is specified
+template <typename Point, typename Polygon, typename Strategy>
+struct distance
+<
+    Point, Polygon, Strategy,
+    point_tag, polygon_tag, strategy_tag_distance_point_point,
+    false
+>
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Polygon>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+                                    Polygon const& polygon,
+                                    Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+            <
+                Point,
+                typename point_type<Polygon>::type,
+                Strategy
+            >::type ps_strategy_type;
+
+        return detail::distance::point_to_polygon
+            <
+                Point,
+                Polygon,
+                geometry::closure<Polygon>::value,
+                ps_strategy_type
+            >::apply(point, polygon, ps_strategy_type());
+    }
+};
+
+
+
+
+template
+<
+    typename Point,
+    typename MultiGeometry,
+    typename MultiGeometryTag,
+    typename Strategy
+>
+struct distance
+    <
+        Point, MultiGeometry, Strategy,
+        point_tag, MultiGeometryTag,
+        strategy_tag_distance_point_point, false
+    >
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<MultiGeometry>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+                                    MultiGeometry const& multigeometry,
+                                    Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+            <
+                Point,
+                typename point_type<MultiGeometry>::type,
+                Strategy
+            >::type ps_strategy_type;
+    
+        return distance
+            <
+                Point, MultiGeometry, ps_strategy_type,
+                point_tag, MultiGeometryTag,
+                strategy_tag_distance_point_segment, false
+            >::apply(point, multigeometry, ps_strategy_type());
+    }
+};
+
+
+template
+<
+    typename Geometry,
+    typename MultiPoint,
+    typename GeometryTag,
+    typename Strategy
+>
+struct distance
+    <
+        Geometry, MultiPoint, Strategy,
+        GeometryTag, multi_point_tag,
+        strategy_tag_distance_point_point, false
+    >
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<MultiPoint>::type,
+            typename point_type<Geometry>::type
+        >::type return_type;
+
+    static inline return_type apply(Geometry const& geometry,
+                                    MultiPoint const& multipoint,
+                                    Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+            <
+                typename point_type<MultiPoint>::type,
+                typename point_type<Geometry>::type,
+                Strategy
+            >::type ps_strategy_type;
+    
+        return distance
+            <
+                Geometry, MultiPoint, ps_strategy_type,
+                GeometryTag, multi_point_tag,
+                strategy_tag_distance_point_segment, false
+            >::apply(geometry, multipoint, ps_strategy_type());
+    }
+};
+
+
+template
+<
+    typename MultiPoint,
+    typename MultiGeometry,
+    typename MultiGeometryTag,
+    typename Strategy
+>
+struct distance
+    <
+        MultiPoint, MultiGeometry, Strategy,
+        multi_point_tag, MultiGeometryTag,
+        strategy_tag_distance_point_point, false
+    >
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<MultiPoint>::type, 
+            typename point_type<MultiGeometry>::type
+        >::type return_type;
+
+    static inline return_type apply(MultiPoint const& multipoint,
+                                    MultiGeometry const& multigeometry,
+                                    Strategy const&)
+    {
+        typedef typename detail::distance::default_ps_strategy
+            <
+                typename point_type<MultiPoint>::type,
+                typename point_type<MultiGeometry>::type,
+                Strategy
+            >::type ps_strategy_type;
+    
+        return distance
+            <
+                MultiPoint, MultiGeometry, ps_strategy_type,
+                multi_point_tag, MultiGeometryTag,
+                strategy_tag_distance_point_segment, false
+            >::apply(multipoint, multigeometry, ps_strategy_type());
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/box_to_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,60 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BOX_TO_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BOX_TO_BOX_HPP
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Box1, typename Box2, typename Strategy>
+struct distance
+    <
+        Box1, Box2, Strategy, box_tag, box_tag,
+        strategy_tag_distance_box_box, false
+    >
+{
+    static inline typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Box1>::type,
+            typename point_type<Box2>::type
+        >::type
+    apply(Box1 const& box1, Box2 const& box2, Strategy const& strategy)
+    {
+        boost::ignore_unused(strategy);
+        return strategy.apply(box1, box2);
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BOX_TO_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/default_strategies.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,137 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/reverse_dispatch.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+
+// Helper metafunction for default strategy retrieval
+template
+<
+    typename Geometry1,
+    typename Geometry2 = Geometry1,
+    typename Tag1 = typename tag_cast
+        <
+            typename tag<Geometry1>::type, pointlike_tag
+        >::type,
+    typename Tag2 = typename tag_cast
+        <
+            typename tag<Geometry2>::type, pointlike_tag
+        >::type,
+    bool Reverse = geometry::reverse_dispatch<Geometry1, Geometry2>::type::value
+>
+struct default_strategy
+    : strategy::distance::services::default_strategy
+          <
+              point_tag, segment_tag,
+              typename point_type<Geometry1>::type,
+              typename point_type<Geometry2>::type
+          >
+{};
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename Tag1,
+    typename Tag2
+>
+struct default_strategy<Geometry1, Geometry2, Tag1, Tag2, true>
+    : default_strategy<Geometry2, Geometry1, Tag2, Tag1, false>
+{};
+
+
+template <typename Pointlike1, typename Pointlike2>
+struct default_strategy
+    <
+        Pointlike1, Pointlike2,
+        pointlike_tag, pointlike_tag, false
+    > : strategy::distance::services::default_strategy
+          <
+              point_tag, point_tag,
+              typename point_type<Pointlike1>::type,
+              typename point_type<Pointlike2>::type
+          >
+{};
+
+
+template <typename Pointlike, typename Box>
+struct default_strategy<Pointlike, Box, pointlike_tag, box_tag, false>
+    : strategy::distance::services::default_strategy
+          <
+              point_tag, box_tag,
+              typename point_type<Pointlike>::type,
+              typename point_type<Box>::type
+          >
+{};
+
+
+template <typename Box1, typename Box2>
+struct default_strategy<Box1, Box2, box_tag, box_tag, false>
+    : strategy::distance::services::default_strategy
+          <
+              box_tag, box_tag,
+              typename point_type<Box1>::type,
+              typename point_type<Box2>::type
+          >
+{};
+
+
+
+// Helper metafunction for default point-segment strategy retrieval
+template <typename Geometry1, typename Geometry2, typename Strategy>
+struct default_ps_strategy
+    : strategy::distance::services::default_strategy
+          <
+              point_tag, segment_tag,
+              typename point_type<Geometry1>::type,
+              typename point_type<Geometry2>::type,
+              typename cs_tag<typename point_type<Geometry1>::type>::type,
+              typename cs_tag<typename point_type<Geometry2>::type>::type,
+              Strategy
+          >
+{};
+
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_DEFAULT_STRATEGIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/geometry_to_segment_or_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,464 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_GEOMETRY_TO_SEGMENT_OR_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_GEOMETRY_TO_SEGMENT_OR_BOX_HPP
+
+#include <iterator>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+#include <boost/geometry/algorithms/num_points.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+#include <boost/geometry/iterators/segment_iterator.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/closest_feature/geometry_to_range.hpp>
+#include <boost/geometry/algorithms/detail/closest_feature/point_to_range.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+// closure of segment or box point range
+template
+<
+    typename SegmentOrBox,
+    typename Tag = typename tag<SegmentOrBox>::type
+>
+struct segment_or_box_point_range_closure
+    : not_implemented<SegmentOrBox>
+{};    
+
+template <typename Segment>
+struct segment_or_box_point_range_closure<Segment, segment_tag>
+{
+    static const closure_selector value = closed;
+};
+
+template <typename Box>
+struct segment_or_box_point_range_closure<Box, box_tag>
+{
+    static const closure_selector value = open;
+};
+
+
+
+template
+<
+    typename Geometry,
+    typename SegmentOrBox,
+    typename Strategy,
+    typename Tag = typename tag<Geometry>::type
+>
+class geometry_to_segment_or_box
+{
+private:
+    typedef typename point_type<SegmentOrBox>::type segment_or_box_point;
+
+    typedef typename strategy::distance::services::comparable_type
+       <
+           Strategy
+       >::type comparable_strategy;
+
+    typedef detail::closest_feature::point_to_point_range
+        <
+            typename point_type<Geometry>::type,
+            std::vector<segment_or_box_point>,
+            segment_or_box_point_range_closure<SegmentOrBox>::value,
+            comparable_strategy
+        > point_to_point_range;
+
+    typedef detail::closest_feature::geometry_to_range geometry_to_range;
+
+    typedef typename strategy::distance::services::return_type
+        <
+            comparable_strategy,
+            typename point_type<Geometry>::type,
+            segment_or_box_point
+        >::type comparable_return_type;
+
+
+    // assign the new minimum value for an iterator of the point range
+    // of a segment or a box
+    template
+    <
+        typename SegOrBox,
+        typename SegOrBoxTag = typename tag<SegOrBox>::type
+    >
+    struct assign_new_min_iterator
+        : not_implemented<SegOrBox>
+    {};
+
+    template <typename Segment>
+    struct assign_new_min_iterator<Segment, segment_tag>
+    {
+        template <typename Iterator>
+        static inline void apply(Iterator&, Iterator)
+        {
+        }
+    };
+
+    template <typename Box>
+    struct assign_new_min_iterator<Box, box_tag>
+    {
+        template <typename Iterator>
+        static inline void apply(Iterator& it_min, Iterator it)
+        {
+            it_min = it;
+        }
+    };
+
+
+    // assign the points of a segment or a box to a range
+    template
+    <
+        typename SegOrBox,
+        typename PointRange,
+        typename SegOrBoxTag = typename tag<SegOrBox>::type
+    >
+    struct assign_segment_or_box_points
+    {};
+
+    template <typename Segment, typename PointRange>
+    struct assign_segment_or_box_points<Segment, PointRange, segment_tag>
+    {
+        static inline void apply(Segment const& segment, PointRange& range)
+        {
+            detail::assign_point_from_index<0>(segment, range[0]);
+            detail::assign_point_from_index<1>(segment, range[1]);
+        }
+    };
+
+    template <typename Box, typename PointRange>
+    struct assign_segment_or_box_points<Box, PointRange, box_tag>
+    {
+        static inline void apply(Box const& box, PointRange& range)
+        {
+            detail::assign_box_corners_oriented<true>(box, range);
+        }
+    };
+
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Geometry>::type,
+            segment_or_box_point
+        >::type return_type;
+
+    static inline return_type apply(Geometry const& geometry,
+                                    SegmentOrBox const& segment_or_box,
+                                    Strategy const& strategy,
+                                    bool check_intersection = true)
+    {
+        typedef geometry::point_iterator<Geometry const> point_iterator_type;
+        typedef geometry::segment_iterator
+            <
+                Geometry const
+            > segment_iterator_type;
+
+        typedef typename std::vector
+            <
+                segment_or_box_point
+            >::const_iterator seg_or_box_iterator_type;
+
+        typedef assign_new_min_iterator<SegmentOrBox> assign_new_value;
+
+
+        if (check_intersection
+            && geometry::intersects(geometry, segment_or_box))
+        {
+            return 0;
+        }
+
+        comparable_strategy cstrategy =
+            strategy::distance::services::get_comparable
+                <
+                    Strategy
+                >::apply(strategy);
+
+        // get all points of the segment or the box
+        std::vector<segment_or_box_point>
+            seg_or_box_points(geometry::num_points(segment_or_box));
+
+        assign_segment_or_box_points
+            <
+                SegmentOrBox, 
+                std::vector<segment_or_box_point>
+            >::apply(segment_or_box, seg_or_box_points);
+
+        // consider all distances of the points in the geometry to the
+        // segment or box
+        comparable_return_type cd_min1(0);
+        point_iterator_type pit_min;
+        seg_or_box_iterator_type it_min1 = seg_or_box_points.begin();
+        seg_or_box_iterator_type it_min2 = ++seg_or_box_points.begin();
+        bool first = true;
+
+        for (point_iterator_type pit = points_begin(geometry);
+             pit != points_end(geometry); ++pit, first = false)
+        {
+            comparable_return_type cd;
+            std::pair
+                <
+                    seg_or_box_iterator_type, seg_or_box_iterator_type
+                > it_pair
+                = point_to_point_range::apply(*pit,
+                                              seg_or_box_points.begin(),
+                                              seg_or_box_points.end(),
+                                              cstrategy,
+                                              cd);
+
+            if (first || cd < cd_min1)
+            {
+                cd_min1 = cd;
+                pit_min = pit;
+                assign_new_value::apply(it_min1, it_pair.first);
+                assign_new_value::apply(it_min2, it_pair.second);
+            }
+        }
+
+        // consider all distances of the points in the segment or box to the
+        // segments of the geometry
+        comparable_return_type cd_min2(0);
+        segment_iterator_type sit_min;
+        typename std::vector<segment_or_box_point>::const_iterator it_min;
+
+        first = true;
+        for (typename std::vector<segment_or_box_point>::const_iterator it
+                 = seg_or_box_points.begin();
+             it != seg_or_box_points.end(); ++it, first = false)
+        {
+            comparable_return_type cd;
+            segment_iterator_type sit
+                = geometry_to_range::apply(*it,
+                                           segments_begin(geometry),
+                                           segments_end(geometry),
+                                           cstrategy,
+                                           cd);
+
+            if (first || cd < cd_min2)
+            {
+                cd_min2 = cd;
+                it_min = it;
+                sit_min = sit;
+            }
+        }
+
+        if (BOOST_GEOMETRY_CONDITION(is_comparable<Strategy>::value))
+        {
+            return (std::min)(cd_min1, cd_min2);
+        }
+
+        if (cd_min1 < cd_min2)
+        {
+            return strategy.apply(*pit_min, *it_min1, *it_min2);
+        }
+        else
+        {
+            return dispatch::distance
+                <
+                    segment_or_box_point,
+                    typename std::iterator_traits
+                        <
+                            segment_iterator_type
+                        >::value_type,
+                    Strategy
+                >::apply(*it_min, *sit_min, strategy);
+        }
+    }
+
+
+    static inline return_type
+    apply(SegmentOrBox const& segment_or_box, Geometry const& geometry, 
+          Strategy const& strategy, bool check_intersection = true)
+    {
+        return apply(geometry, segment_or_box, strategy, check_intersection);
+    }
+};
+
+
+
+template <typename MultiPoint, typename SegmentOrBox, typename Strategy>
+class geometry_to_segment_or_box
+    <
+        MultiPoint, SegmentOrBox, Strategy, multi_point_tag
+    >
+{
+private:
+    typedef detail::closest_feature::geometry_to_range base_type;
+
+    typedef typename boost::range_iterator
+        <
+            MultiPoint const
+        >::type iterator_type;
+
+    typedef detail::closest_feature::geometry_to_range geometry_to_range;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<SegmentOrBox>::type,
+            typename point_type<MultiPoint>::type
+        >::type return_type;
+
+    static inline return_type apply(MultiPoint const& multipoint,
+                                    SegmentOrBox const& segment_or_box,
+                                    Strategy const& strategy)
+    {
+        namespace sds = strategy::distance::services;
+
+        typename sds::return_type
+            <
+                typename sds::comparable_type<Strategy>::type,
+                typename point_type<SegmentOrBox>::type,
+                typename point_type<MultiPoint>::type
+            >::type cd_min;
+
+        iterator_type it_min
+            = geometry_to_range::apply(segment_or_box,
+                                       boost::begin(multipoint),
+                                       boost::end(multipoint),
+                                       sds::get_comparable
+                                           <
+                                               Strategy
+                                           >::apply(strategy),
+                                       cd_min);
+
+        return
+            is_comparable<Strategy>::value
+            ?
+            cd_min
+            :
+            dispatch::distance
+                <
+                    typename point_type<MultiPoint>::type,
+                    SegmentOrBox,
+                    Strategy
+                >::apply(*it_min, segment_or_box, strategy);
+    }
+};
+
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Linear, typename Segment, typename Strategy>
+struct distance
+    <
+        Linear, Segment, Strategy, linear_tag, segment_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box<Linear, Segment, Strategy>
+{};
+
+
+template <typename Areal, typename Segment, typename Strategy>
+struct distance
+    <
+        Areal, Segment, Strategy, areal_tag, segment_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box<Areal, Segment, Strategy>
+{};
+
+
+template <typename Segment, typename Areal, typename Strategy>
+struct distance
+    <
+        Segment, Areal, Strategy, segment_tag, areal_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box<Areal, Segment, Strategy>
+{};
+
+
+template <typename Linear, typename Box, typename Strategy>
+struct distance
+    <
+        Linear, Box, Strategy, linear_tag, box_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box
+        <
+            Linear, Box, Strategy
+        >
+{};
+
+
+template <typename Areal, typename Box, typename Strategy>
+struct distance
+    <
+        Areal, Box, Strategy, areal_tag, box_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box<Areal, Box, Strategy>
+{};
+
+
+template <typename MultiPoint, typename Segment, typename Strategy>
+struct distance
+    <
+        MultiPoint, Segment, Strategy,
+        multi_point_tag, segment_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::geometry_to_segment_or_box
+        <
+            MultiPoint, Segment, Strategy
+        >
+{};
+
+
+template <typename MultiPoint, typename Box, typename Strategy>
+struct distance
+    <
+        MultiPoint, Box, Strategy,
+        multi_point_tag, box_tag,
+        strategy_tag_distance_point_box, false
+    > : detail::distance::geometry_to_segment_or_box
+        <
+            MultiPoint, Box, Strategy
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_GEOMETRY_TO_SEGMENT_OR_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_IMPLEMENTATION_HPP
+
+// the implementation details
+#include <boost/geometry/algorithms/detail/distance/point_to_geometry.hpp>
+#include <boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp>
+#include <boost/geometry/algorithms/detail/distance/linear_to_linear.hpp>
+#include <boost/geometry/algorithms/detail/distance/linear_or_areal_to_areal.hpp>
+#include <boost/geometry/algorithms/detail/distance/geometry_to_segment_or_box.hpp>
+#include <boost/geometry/algorithms/detail/distance/segment_to_segment.hpp>
+#include <boost/geometry/algorithms/detail/distance/segment_to_box.hpp>
+#include <boost/geometry/algorithms/detail/distance/box_to_box.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/backward_compatibility.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,403 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2014 Samuel Debionne, Grenoble, France.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP
+
+#include <boost/concept_check.hpp>
+
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/strategies/default_strategy.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/default_distance_result.hpp>
+#include <boost/geometry/strategies/distance_result.hpp>
+
+#include <boost/geometry/algorithms/detail/throw_on_empty_input.hpp>
+#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// If reversal is needed, perform it
+template
+<
+    typename Geometry1, typename Geometry2, typename Strategy,
+    typename Tag1, typename Tag2, typename StrategyTag
+>
+struct distance
+<
+    Geometry1, Geometry2, Strategy,
+    Tag1, Tag2, StrategyTag,
+    true
+>
+    : distance<Geometry2, Geometry1, Strategy, Tag2, Tag1, StrategyTag, false>
+{
+    typedef typename strategy::distance::services::return_type
+                     <
+                         Strategy,
+                         typename point_type<Geometry2>::type,
+                         typename point_type<Geometry1>::type
+                     >::type return_type;
+
+    static inline return_type apply(
+        Geometry1 const& g1,
+        Geometry2 const& g2,
+        Strategy const& strategy)
+    {
+        return distance
+            <
+                Geometry2, Geometry1, Strategy,
+                Tag2, Tag1, StrategyTag,
+                false
+            >::apply(g2, g1, strategy);
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+namespace resolve_strategy
+{
+
+struct distance
+{
+    template <typename Geometry1, typename Geometry2, typename Strategy>
+    static inline typename distance_result<Geometry1, Geometry2, Strategy>::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        return dispatch::distance
+            <
+                Geometry1, Geometry2, Strategy
+            >::apply(geometry1, geometry2, strategy);
+    }
+
+    template <typename Geometry1, typename Geometry2>
+    static inline
+    typename distance_result<Geometry1, Geometry2, default_strategy>::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          default_strategy)
+    {
+        typedef typename detail::distance::default_strategy
+            <
+                Geometry1, Geometry2
+            >::type strategy_type;
+
+        return dispatch::distance
+            <
+                Geometry1, Geometry2, strategy_type
+            >::apply(geometry1, geometry2, strategy_type());
+    }
+};
+
+} // namespace resolve_strategy
+
+
+namespace resolve_variant
+{
+
+
+template <typename Geometry1, typename Geometry2>
+struct distance
+{
+    template <typename Strategy>
+    static inline typename distance_result<Geometry1, Geometry2, Strategy>::type
+    apply(Geometry1 const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        return
+            resolve_strategy::distance::apply(geometry1, geometry2, strategy);
+    }
+};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
+struct distance<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename distance_result
+                <
+                    variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+                    Geometry2,
+                    Strategy
+                >::type
+        >
+    {
+        Geometry2 const& m_geometry2;
+        Strategy const& m_strategy;
+
+        visitor(Geometry2 const& geometry2,
+                Strategy const& strategy)
+            : m_geometry2(geometry2),
+              m_strategy(strategy)
+        {}
+
+        template <typename Geometry1>
+        typename distance_result<Geometry1, Geometry2, Strategy>::type
+        operator()(Geometry1 const& geometry1) const
+        {
+            return distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                    <
+                        Strategy
+                    >(geometry1, m_geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename distance_result
+        <
+            variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+            Geometry2,
+            Strategy
+        >::type
+    apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
+          Geometry2 const& geometry2,
+          Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(geometry2, strategy), geometry1);
+    }
+};
+
+
+template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct distance<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename distance_result
+                <
+                    Geometry1,
+                    variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+                    Strategy
+                >::type
+        >
+    {
+        Geometry1 const& m_geometry1;
+        Strategy const& m_strategy;
+
+        visitor(Geometry1 const& geometry1,
+                Strategy const& strategy)
+            : m_geometry1(geometry1),
+              m_strategy(strategy)
+        {}
+
+        template <typename Geometry2>
+        typename distance_result<Geometry1, Geometry2, Strategy>::type
+        operator()(Geometry2 const& geometry2) const
+        {
+            return distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                <
+                    Strategy
+                >(m_geometry1, geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename distance_result
+        <
+            Geometry1,
+            variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+            Strategy
+        >::type
+    apply(
+        Geometry1 const& geometry1,
+        const variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry2,
+        Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(geometry1, strategy), geometry2);
+    }
+};
+
+
+template
+<
+    BOOST_VARIANT_ENUM_PARAMS(typename T1),
+    BOOST_VARIANT_ENUM_PARAMS(typename T2)
+>
+struct distance
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
+    >
+{
+    template <typename Strategy>
+    struct visitor: static_visitor
+        <
+            typename distance_result
+                <
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+                    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
+                    Strategy
+                >::type
+        >
+    {
+        Strategy const& m_strategy;
+
+        visitor(Strategy const& strategy)
+            : m_strategy(strategy)
+        {}
+
+        template <typename Geometry1, typename Geometry2>
+        typename distance_result<Geometry1, Geometry2, Strategy>::type
+        operator()(Geometry1 const& geometry1, Geometry2 const& geometry2) const
+        {
+            return distance
+                <
+                    Geometry1,
+                    Geometry2
+                >::template apply
+                <
+                    Strategy
+                >(geometry1, geometry2, m_strategy);
+        }
+    };
+
+    template <typename Strategy>
+    static inline typename distance_result
+        <
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
+            boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
+            Strategy
+        >::type
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
+          boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
+          Strategy const& strategy)
+    {
+        return apply_visitor(visitor<Strategy>(strategy), geometry1, geometry2);
+    }
+};
+
+} // namespace resolve_variant
+
+
+/*!
+\brief \brief_calc2{distance} \brief_strategy
+\ingroup distance
+\details
+\details \details_calc{area}. \brief_strategy. \details_strategy_reasons
+
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam Strategy \tparam_strategy{Distance}
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param strategy \param_strategy{distance}
+\return \return_calc{distance}
+\note The strategy can be a point-point strategy. In case of distance point-line/point-polygon
+    it may also be a point-segment strategy.
+
+\qbk{distinguish,with strategy}
+
+\qbk{
+[heading Available Strategies]
+\* [link geometry.reference.strategies.strategy_distance_pythagoras Pythagoras (cartesian)]
+\* [link geometry.reference.strategies.strategy_distance_haversine Haversine (spherical)]
+\* [link geometry.reference.strategies.strategy_distance_cross_track Cross track (spherical\, point-to-segment)]
+\* [link geometry.reference.strategies.strategy_distance_projected_point Projected point (cartesian\, point-to-segment)]
+\* more (currently extensions): Vincenty\, Andoyer (geographic)
+}
+ */
+
+/*
+Note, in case of a Compilation Error:
+if you get:
+ - "Failed to specialize function template ..."
+ - "error: no matching function for call to ..."
+for distance, it is probably so that there is no specialization
+for return_type<...> for your strategy.
+*/
+template <typename Geometry1, typename Geometry2, typename Strategy>
+inline typename distance_result<Geometry1, Geometry2, Strategy>::type
+distance(Geometry1 const& geometry1,
+         Geometry2 const& geometry2,
+         Strategy const& strategy)
+{
+    concept::check<Geometry1 const>();
+    concept::check<Geometry2 const>();
+
+    detail::throw_on_empty_input(geometry1);
+    detail::throw_on_empty_input(geometry2);
+
+    return resolve_variant::distance
+               <
+                   Geometry1,
+                   Geometry2
+               >::apply(geometry1, geometry2, strategy);
+}
+
+
+/*!
+\brief \brief_calc2{distance}
+\ingroup distance
+\details The default strategy is used, corresponding to the coordinate system of the geometries
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\return \return_calc{distance}
+
+\qbk{[include reference/algorithms/distance.qbk]}
+ */
+template <typename Geometry1, typename Geometry2>
+inline typename default_distance_result<Geometry1, Geometry2>::type
+distance(Geometry1 const& geometry1,
+         Geometry2 const& geometry2)
+{
+    concept::check<Geometry1 const>();
+    concept::check<Geometry2 const>();
+
+    return distance(geometry1, geometry2, default_strategy());
+}
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/is_comparable.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_IS_COMPARABLE_HPP
+#define BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_IS_COMPARABLE_HPP
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+// metafunction to determine is a strategy is comparable or not
+template <typename Strategy>
+struct is_comparable
+    : boost::is_same
+        <
+            Strategy,
+            typename strategy::distance::services::comparable_type
+              <
+                  Strategy
+              >::type
+        >
+{};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_IS_COMPARABLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/iterator_selector.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_ITERATOR_SELECTOR_HPP
+#define BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_ITERATOR_SELECTOR_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+#include <boost/geometry/iterators/segment_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+// class to choose between point_iterator and segment_iterator
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct iterator_selector
+{
+    typedef geometry::segment_iterator<Geometry> iterator_type;
+
+    static inline iterator_type begin(Geometry& geometry)
+    {
+        return segments_begin(geometry);
+    }
+
+    static inline iterator_type end(Geometry& geometry)
+    {
+        return segments_end(geometry);
+    }
+};
+
+template <typename MultiPoint>
+struct iterator_selector<MultiPoint, multi_point_tag>
+{
+    typedef geometry::point_iterator<MultiPoint> iterator_type;
+
+    static inline iterator_type begin(MultiPoint& multipoint)
+    {
+        return points_begin(multipoint);
+    }
+
+    static inline iterator_type end(MultiPoint& multipoint)
+    {
+        return points_end(multipoint);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHS_DETAIL_DISTANCE_ITERATOR_SELECTOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/linear_or_areal_to_areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,147 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_OR_AREAL_TO_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_OR_AREAL_TO_AREAL_HPP
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/algorithms/intersects.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/linear_to_linear.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template <typename Linear, typename Areal, typename Strategy>
+struct linear_to_areal
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Linear>::type,
+            typename point_type<Areal>::type
+        >::type return_type;
+
+    static inline return_type apply(Linear const& linear,
+                                    Areal const& areal,
+                                    Strategy const& strategy)
+    {
+        if ( geometry::intersects(linear, areal) )
+        {
+            return 0;
+        }
+
+        return linear_to_linear
+            <
+                Linear, Areal, Strategy
+            >::apply(linear, areal, strategy, false);
+    }
+
+
+    static inline return_type apply(Areal const& areal,
+                                    Linear const& linear,
+                                    Strategy const& strategy)
+    {
+        return apply(linear, areal, strategy);
+    }
+};
+
+
+template <typename Areal1, typename Areal2, typename Strategy>
+struct areal_to_areal
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Areal1>::type,
+            typename point_type<Areal2>::type
+        >::type return_type;
+
+    static inline return_type apply(Areal1 const& areal1,
+                                    Areal2 const& areal2,
+                                    Strategy const& strategy)
+    {
+        if ( geometry::intersects(areal1, areal2) )
+        {
+            return 0;
+        }
+
+        return linear_to_linear
+            <
+                Areal1, Areal2, Strategy
+            >::apply(areal1, areal2, strategy, false);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template <typename Linear, typename Areal, typename Strategy>
+struct distance
+    <
+        Linear, Areal, Strategy,
+        linear_tag, areal_tag, 
+        strategy_tag_distance_point_segment, false
+    >
+    : detail::distance::linear_to_areal
+        <
+            Linear, Areal, Strategy
+        >
+{};
+
+
+template <typename Areal, typename Linear, typename Strategy>
+struct distance
+    <
+        Areal, Linear, Strategy,
+        areal_tag, linear_tag, 
+        strategy_tag_distance_point_segment, false
+    >
+    : detail::distance::linear_to_areal
+        <
+            Linear, Areal, Strategy
+        >
+{};
+
+
+template <typename Areal1, typename Areal2, typename Strategy>
+struct distance
+    <
+        Areal1, Areal2, Strategy,
+        areal_tag, areal_tag, 
+        strategy_tag_distance_point_segment, false
+    >
+    : detail::distance::areal_to_areal
+        <
+            Areal1, Areal2, Strategy
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_OR_AREAL_TO_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/linear_to_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,123 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+#include <boost/geometry/iterators/segment_iterator.hpp>
+
+#include <boost/geometry/algorithms/num_points.hpp>
+#include <boost/geometry/algorithms/num_segments.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template <typename Linear1, typename Linear2, typename Strategy>
+struct linear_to_linear
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Linear1>::type,
+            typename point_type<Linear2>::type
+        >::type return_type;
+
+    static inline return_type apply(Linear1 const& linear1,
+                                    Linear2 const& linear2,
+                                    Strategy const& strategy,
+                                    bool = false)
+    {
+        if (geometry::num_points(linear1) == 1)
+        {
+            return dispatch::distance
+                <
+                    typename point_type<Linear1>::type,
+                    Linear2,
+                    Strategy
+                >::apply(*points_begin(linear1), linear2, strategy);
+        }
+
+        if (geometry::num_points(linear2) == 1)
+        {
+            return dispatch::distance
+                <
+                    typename point_type<Linear2>::type,
+                    Linear1,
+                    Strategy
+                >::apply(*points_begin(linear2), linear1, strategy);
+        }
+
+        if (geometry::num_segments(linear2) < geometry::num_segments(linear1))
+        {
+            return point_or_segment_range_to_geometry_rtree
+                <
+                    geometry::segment_iterator<Linear2 const>,
+                    Linear1,
+                    Strategy
+                >::apply(geometry::segments_begin(linear2),
+                         geometry::segments_end(linear2),
+                         linear1,
+                         strategy);
+
+        }
+
+        return point_or_segment_range_to_geometry_rtree
+            <
+                geometry::segment_iterator<Linear1 const>,
+                Linear2,
+                Strategy
+            >::apply(geometry::segments_begin(linear1),
+                     geometry::segments_end(linear1),
+                     linear2,
+                     strategy);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template <typename Linear1, typename Linear2, typename Strategy>
+struct distance
+    <
+        Linear1, Linear2, Strategy,
+        linear_tag, linear_tag, 
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::linear_to_linear
+        <
+            Linear1, Linear2, Strategy
+        >
+{};
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/multipoint_to_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,239 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_MULTIPOINT_TO_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_MULTIPOINT_TO_GEOMETRY_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template <typename MultiPoint1, typename MultiPoint2, typename Strategy>
+struct multipoint_to_multipoint
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<MultiPoint1>::type,
+            typename point_type<MultiPoint2>::type
+        >::type return_type;   
+
+    static inline return_type apply(MultiPoint1 const& multipoint1,
+                                    MultiPoint2 const& multipoint2,
+                                    Strategy const& strategy)
+    {
+        if (boost::size(multipoint2) < boost::size(multipoint1))
+
+        {
+            return point_or_segment_range_to_geometry_rtree
+                <
+                    typename boost::range_iterator<MultiPoint2 const>::type,
+                    MultiPoint1,
+                    Strategy
+                >::apply(boost::begin(multipoint2),
+                         boost::end(multipoint2),
+                         multipoint1,
+                         strategy);
+        }
+
+        return point_or_segment_range_to_geometry_rtree
+            <
+                typename boost::range_iterator<MultiPoint1 const>::type,
+                MultiPoint2,
+                Strategy
+            >::apply(boost::begin(multipoint1),
+                     boost::end(multipoint1),
+                     multipoint2,
+                     strategy);
+    }
+};
+
+
+template <typename MultiPoint, typename Linear, typename Strategy>
+struct multipoint_to_linear
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<MultiPoint>::type,
+            typename point_type<Linear>::type
+        >::type return_type;
+
+    static inline return_type apply(MultiPoint const& multipoint,
+                                    Linear const& linear,
+                                    Strategy const& strategy)
+    {
+        return detail::distance::point_or_segment_range_to_geometry_rtree
+            <
+                typename boost::range_iterator<MultiPoint const>::type,
+                Linear,
+                Strategy
+            >::apply(boost::begin(multipoint),
+                     boost::end(multipoint),
+                     linear,
+                     strategy);
+    }
+
+    static inline return_type apply(Linear const& linear,
+                                    MultiPoint const& multipoint,
+                                    Strategy const& strategy)
+    {
+        return apply(multipoint, linear, strategy);
+    }
+};
+
+
+template <typename MultiPoint, typename Areal, typename Strategy>
+class multipoint_to_areal
+{
+private:
+    struct not_covered_by_areal
+    {
+        not_covered_by_areal(Areal const& areal)
+            : m_areal(areal)
+        {}
+
+        template <typename Point>
+        inline bool apply(Point const& point) const
+        {
+            return !geometry::covered_by(point, m_areal);
+        }
+
+        Areal const& m_areal;
+    };
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<MultiPoint>::type,
+            typename point_type<Areal>::type
+        >::type return_type;
+
+    static inline return_type apply(MultiPoint const& multipoint,
+                                    Areal const& areal,
+                                    Strategy const& strategy)
+    {
+        not_covered_by_areal predicate(areal);
+
+        if (check_iterator_range
+                <
+                    not_covered_by_areal, false
+                >::apply(boost::begin(multipoint),
+                         boost::end(multipoint),
+                         predicate))
+        {
+            return detail::distance::point_or_segment_range_to_geometry_rtree
+                <
+                    typename boost::range_iterator<MultiPoint const>::type,
+                    Areal,
+                    Strategy
+                >::apply(boost::begin(multipoint),
+                         boost::end(multipoint),
+                         areal,
+                         strategy);
+        }
+        return 0;
+    }
+
+    static inline return_type apply(Areal const& areal,
+                                    MultiPoint const& multipoint,
+                                    Strategy const& strategy)
+    {
+        return apply(multipoint, areal, strategy);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename MultiPoint1, typename MultiPoint2, typename Strategy>
+struct distance
+    <
+        MultiPoint1, MultiPoint2, Strategy,
+        multi_point_tag, multi_point_tag,
+        strategy_tag_distance_point_point, false
+    > : detail::distance::multipoint_to_multipoint
+        <
+            MultiPoint1, MultiPoint2, Strategy
+        >
+{};
+
+template <typename MultiPoint, typename Linear, typename Strategy>
+struct distance
+    <
+         MultiPoint, Linear, Strategy, multi_point_tag, linear_tag,
+         strategy_tag_distance_point_segment, false
+    > : detail::distance::multipoint_to_linear<MultiPoint, Linear, Strategy>
+{};
+
+
+template <typename Linear, typename MultiPoint, typename Strategy>
+struct distance
+    <
+         Linear, MultiPoint, Strategy, linear_tag, multi_point_tag,
+         strategy_tag_distance_point_segment, false
+    > : detail::distance::multipoint_to_linear<MultiPoint, Linear, Strategy>
+{};
+
+
+template <typename MultiPoint, typename Areal, typename Strategy>
+struct distance
+    <
+         MultiPoint, Areal, Strategy, multi_point_tag, areal_tag,
+         strategy_tag_distance_point_segment, false
+    > : detail::distance::multipoint_to_areal<MultiPoint, Areal, Strategy>
+{};
+
+
+template <typename Areal, typename MultiPoint, typename Strategy>
+struct distance
+    <
+         Areal, MultiPoint, Strategy, areal_tag, multi_point_tag,
+         strategy_tag_distance_point_segment, false
+    > : detail::distance::multipoint_to_areal<MultiPoint, Areal, Strategy>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_MULTIPOINT_TO_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/point_to_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,518 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_POINT_TO_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_POINT_TO_GEOMETRY_HPP
+
+#include <iterator>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/range.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/within.hpp>
+
+#include <boost/geometry/algorithms/detail/closest_feature/geometry_to_range.hpp>
+#include <boost/geometry/algorithms/detail/closest_feature/point_to_range.hpp>
+#include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
+#include <boost/geometry/algorithms/detail/distance/iterator_selector.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template <typename P1, typename P2, typename Strategy>
+struct point_to_point
+{
+    static inline
+    typename strategy::distance::services::return_type<Strategy, P1, P2>::type
+    apply(P1 const& p1, P2 const& p2, Strategy const& strategy)
+    {
+        boost::ignore_unused(strategy);
+        return strategy.apply(p1, p2);
+    }
+};
+
+
+template
+<
+    typename Point,
+    typename Range,
+    closure_selector Closure,
+    typename Strategy
+>
+class point_to_range
+{
+private:
+    typedef typename strategy::distance::services::comparable_type
+        <
+            Strategy
+        >::type comparable_strategy;
+
+    typedef detail::closest_feature::point_to_point_range
+        <
+            Point, Range, Closure, comparable_strategy
+        > point_to_point_range;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            Point,
+            typename boost::range_value<Range>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point, Range const& range,
+                                    Strategy const& strategy)
+    {
+        return_type const zero = return_type(0);
+
+        if (boost::size(range) == 0)
+        {
+            return zero;
+        }
+
+        namespace sds = strategy::distance::services;
+
+        typename sds::return_type
+            <
+                comparable_strategy,
+                Point,
+                typename point_type<Range>::type
+            >::type cd_min;
+
+        std::pair
+            <
+                typename boost::range_iterator<Range const>::type,
+                typename boost::range_iterator<Range const>::type
+            > it_pair
+            = point_to_point_range::apply(point,
+                                          boost::begin(range),
+                                          boost::end(range),
+                                          sds::get_comparable
+                                              <
+                                                  Strategy
+                                              >::apply(strategy),
+                                          cd_min);
+
+        return
+            is_comparable<Strategy>::value
+            ?
+            cd_min
+            :
+            strategy.apply(point, *it_pair.first, *it_pair.second);
+    }
+};
+
+
+template
+<
+    typename Point,
+    typename Ring,
+    closure_selector Closure,
+    typename Strategy
+>
+struct point_to_ring
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Ring>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+                                    Ring const& ring,
+                                    Strategy const& strategy)
+    {
+        if (geometry::within(point, ring))
+        {
+            return return_type(0);
+        }
+
+        return point_to_range
+            <
+                Point, Ring, closure<Ring>::value, Strategy
+            >::apply(point, ring, strategy);
+    }
+};
+
+
+template
+<
+    typename Point,
+    typename Polygon,
+    closure_selector Closure,
+    typename Strategy
+>
+class point_to_polygon
+{
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Polygon>::type
+        >::type return_type;
+
+private:
+    typedef point_to_range
+        <
+            Point, typename ring_type<Polygon>::type, Closure, Strategy
+        > per_ring;
+
+    struct distance_to_interior_rings
+    {
+        template <typename InteriorRingIterator>
+        static inline return_type apply(Point const& point,
+                                        InteriorRingIterator first,
+                                        InteriorRingIterator last,
+                                        Strategy const& strategy)
+        {
+            for (InteriorRingIterator it = first; it != last; ++it)
+            {
+                if (geometry::within(point, *it))
+                {
+                    // the point is inside a polygon hole, so its distance
+                    // to the polygon its distance to the polygon's
+                    // hole boundary
+                    return per_ring::apply(point, *it, strategy);
+                }
+            }
+            return 0;
+        }
+
+        template <typename InteriorRings>
+        static inline return_type apply(Point const& point,
+                                        InteriorRings const& interior_rings,
+                                        Strategy const& strategy)
+        {
+            return apply(point,
+                         boost::begin(interior_rings),
+                         boost::end(interior_rings),
+                         strategy);
+        }
+    };
+
+
+public:
+    static inline return_type apply(Point const& point,
+                                    Polygon const& polygon,
+                                    Strategy const& strategy)
+    {
+        if (!geometry::covered_by(point, exterior_ring(polygon)))
+        {
+            // the point is outside the exterior ring, so its distance
+            // to the polygon is its distance to the polygon's exterior ring
+            return per_ring::apply(point, exterior_ring(polygon), strategy);
+        }
+
+        // Check interior rings
+        return distance_to_interior_rings::apply(point,
+                                                 interior_rings(polygon),
+                                                 strategy);
+    }
+};
+
+
+template
+<
+    typename Point,
+    typename MultiGeometry,
+    typename Strategy,
+    bool CheckCoveredBy = boost::is_same
+        <
+            typename tag<MultiGeometry>::type, multi_polygon_tag
+        >::value
+>
+class point_to_multigeometry
+{
+private:
+    typedef detail::closest_feature::geometry_to_range geometry_to_range;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            Point,
+            typename point_type<MultiGeometry>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+                                    MultiGeometry const& multigeometry,
+                                    Strategy const& strategy)
+    {
+        typedef iterator_selector<MultiGeometry const> selector_type;
+
+        namespace sds = strategy::distance::services;
+
+        typename sds::return_type
+            <
+                typename sds::comparable_type<Strategy>::type,
+                Point,
+                typename point_type<MultiGeometry>::type
+            >::type cd;
+
+        typename selector_type::iterator_type it_min
+            = geometry_to_range::apply(point,
+                                       selector_type::begin(multigeometry),
+                                       selector_type::end(multigeometry),
+                                       sds::get_comparable
+                                           <
+                                               Strategy
+                                           >::apply(strategy),
+                                       cd);
+
+        return
+            is_comparable<Strategy>::value
+            ?
+            cd
+            :
+            dispatch::distance
+                <
+                    Point,
+                    typename std::iterator_traits
+                        <
+                            typename selector_type::iterator_type
+                        >::value_type,
+                    Strategy
+                >::apply(point, *it_min, strategy);
+    }
+};
+
+
+// this is called only for multipolygons, hence the change in the
+// template parameter name MultiGeometry to MultiPolygon
+template <typename Point, typename MultiPolygon, typename Strategy>
+struct point_to_multigeometry<Point, MultiPolygon, Strategy, true>
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            Point,
+            typename point_type<MultiPolygon>::type
+        >::type return_type;
+
+    static inline return_type apply(Point const& point,
+                                    MultiPolygon const& multipolygon,
+                                    Strategy const& strategy)
+    {
+        if (geometry::covered_by(point, multipolygon))
+        {
+            return 0;
+        }
+
+        return point_to_multigeometry
+            <
+                Point, MultiPolygon, Strategy, false
+            >::apply(point, multipolygon, strategy);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// Point-point
+template <typename P1, typename P2, typename Strategy>
+struct distance
+    <
+        P1, P2, Strategy, point_tag, point_tag,
+        strategy_tag_distance_point_point, false
+    > : detail::distance::point_to_point<P1, P2, Strategy>
+{};
+
+
+// Point-line version 2, where point-segment strategy is specified
+template <typename Point, typename Linestring, typename Strategy>
+struct distance
+    <
+        Point, Linestring, Strategy, point_tag, linestring_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::point_to_range<Point, Linestring, closed, Strategy>
+{};
+
+
+// Point-ring , where point-segment strategy is specified
+template <typename Point, typename Ring, typename Strategy>
+struct distance
+    <
+        Point, Ring, Strategy, point_tag, ring_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::point_to_ring
+        <
+            Point, Ring, closure<Ring>::value, Strategy
+        >
+{};
+
+
+// Point-polygon , where point-segment strategy is specified
+template <typename Point, typename Polygon, typename Strategy>
+struct distance
+    <
+        Point, Polygon, Strategy, point_tag, polygon_tag, 
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::point_to_polygon
+        <
+            Point, Polygon, closure<Polygon>::value, Strategy
+        >
+{};
+
+
+// Point-segment version 2, with point-segment strategy
+template <typename Point, typename Segment, typename Strategy>
+struct distance
+    <
+        Point, Segment, Strategy, point_tag, segment_tag,
+        strategy_tag_distance_point_segment, false
+    >
+{
+    static inline typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Segment>::type
+        >::type apply(Point const& point,
+                      Segment const& segment,
+                      Strategy const& strategy)
+    {
+        typename point_type<Segment>::type p[2];
+        geometry::detail::assign_point_from_index<0>(segment, p[0]);
+        geometry::detail::assign_point_from_index<1>(segment, p[1]);
+
+        boost::ignore_unused(strategy);
+        return strategy.apply(point, p[0], p[1]);
+    }
+};
+
+
+template <typename Point, typename Box, typename Strategy>
+struct distance
+    <
+         Point, Box, Strategy, point_tag, box_tag,
+         strategy_tag_distance_point_box, false
+    >
+{
+    static inline typename strategy::distance::services::return_type
+        <
+            Strategy, Point, typename point_type<Box>::type
+        >::type
+    apply(Point const& point, Box const& box, Strategy const& strategy)
+    {
+        boost::ignore_unused(strategy);
+        return strategy.apply(point, box);
+    }
+};
+
+
+template<typename Point, typename MultiPoint, typename Strategy>
+struct distance
+    <
+        Point, MultiPoint, Strategy, point_tag, multi_point_tag,
+        strategy_tag_distance_point_point, false
+    > : detail::distance::point_to_multigeometry
+        <
+            Point, MultiPoint, Strategy
+        >
+{};
+
+
+template<typename Point, typename MultiLinestring, typename Strategy>
+struct distance
+    <
+        Point, MultiLinestring, Strategy, point_tag, multi_linestring_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::point_to_multigeometry
+        <
+            Point, MultiLinestring, Strategy
+        >
+{};
+
+
+template<typename Point, typename MultiPolygon, typename Strategy>
+struct distance
+    <
+        Point, MultiPolygon, Strategy, point_tag, multi_polygon_tag,
+        strategy_tag_distance_point_segment, false
+    > : detail::distance::point_to_multigeometry
+        <
+            Point, MultiPolygon, Strategy
+        >
+{};
+
+
+template <typename Point, typename Linear, typename Strategy>
+struct distance
+    <
+         Point, Linear, Strategy, point_tag, linear_tag,
+         strategy_tag_distance_point_segment, false
+    > : distance
+        <
+            Point, Linear, Strategy,
+            point_tag, typename tag<Linear>::type,
+            strategy_tag_distance_point_segment, false
+        >
+{};
+
+
+template <typename Point, typename Areal, typename Strategy>
+struct distance
+    <
+         Point, Areal, Strategy, point_tag, areal_tag,
+         strategy_tag_distance_point_segment, false
+    > : distance
+        <
+            Point, Areal, Strategy,
+            point_tag, typename tag<Areal>::type,
+            strategy_tag_distance_point_segment, false
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_POINT_TO_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,131 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
+
+#include <iterator>
+#include <utility>
+
+#include <boost/assert.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/iterators/has_one_element.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+#include <boost/geometry/algorithms/detail/closest_feature/range_to_range.hpp>
+#include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
+#include <boost/geometry/algorithms/detail/distance/iterator_selector.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template
+<
+    typename PointOrSegmentIterator,
+    typename Geometry,
+    typename Strategy
+>
+class point_or_segment_range_to_geometry_rtree
+{
+private:
+    typedef typename std::iterator_traits
+        <
+            PointOrSegmentIterator
+        >::value_type point_or_segment_type;
+
+    typedef iterator_selector<Geometry const> selector_type;
+
+    typedef detail::closest_feature::range_to_range_rtree range_to_range;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<point_or_segment_type>::type,
+            typename point_type<Geometry>::type
+        >::type return_type;
+
+    static inline return_type apply(PointOrSegmentIterator first,
+                                    PointOrSegmentIterator last,
+                                    Geometry const& geometry,
+                                    Strategy const& strategy)
+    {
+        namespace sds = strategy::distance::services;
+
+        BOOST_ASSERT( first != last );
+
+        if ( geometry::has_one_element(first, last) )
+        {
+            return dispatch::distance
+                <
+                    point_or_segment_type, Geometry, Strategy
+                >::apply(*first, geometry, strategy);
+        }
+
+        typename sds::return_type
+            <
+                typename sds::comparable_type<Strategy>::type,
+                typename point_type<point_or_segment_type>::type,
+                typename point_type<Geometry>::type
+            >::type cd_min;
+
+        std::pair
+            <
+                point_or_segment_type,
+                typename selector_type::iterator_type
+            > closest_features
+            = range_to_range::apply(first,
+                                    last,
+                                    selector_type::begin(geometry),
+                                    selector_type::end(geometry),
+                                    sds::get_comparable
+                                        <
+                                            Strategy
+                                        >::apply(strategy),
+                                    cd_min);
+
+        return
+            is_comparable<Strategy>::value
+            ?
+            cd_min
+            :
+            dispatch::distance
+                <
+                    point_or_segment_type,                    
+                    typename std::iterator_traits
+                        <
+                            typename selector_type::iterator_type
+                        >::value_type,
+                    Strategy
+                >::apply(closest_features.first,
+                         *closest_features.second,
+                         strategy);
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,887 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_BOX_HPP
+
+#include <cstddef>
+
+#include <functional>
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/calculation_type.hpp>
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/policies/compare.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/algorithms/detail/assign_box_corners.hpp>
+#include <boost/geometry/algorithms/detail/assign_indexed_point.hpp>
+#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
+#include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+template
+<
+    typename Segment,
+    typename Box,
+    typename Strategy,
+    bool UsePointBoxStrategy = false
+>
+class segment_to_box_2D_generic
+{
+private:
+    typedef typename point_type<Segment>::type segment_point;
+    typedef typename point_type<Box>::type box_point;
+
+    typedef typename strategy::distance::services::comparable_type
+        <
+            Strategy
+        >::type comparable_strategy;
+
+    typedef detail::closest_feature::point_to_point_range
+        <
+            segment_point,
+            std::vector<box_point>,
+            open,
+            comparable_strategy
+        > point_to_point_range;
+
+    typedef typename strategy::distance::services::return_type
+        <
+            comparable_strategy, segment_point, box_point
+        >::type comparable_return_type;
+    
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, segment_point, box_point
+        >::type return_type;
+
+    static inline return_type apply(Segment const& segment,
+                                    Box const& box,
+                                    Strategy const& strategy,
+                                    bool check_intersection = true)
+    {
+        if (check_intersection && geometry::intersects(segment, box))
+        {
+            return 0;
+        }
+
+        comparable_strategy cstrategy =
+            strategy::distance::services::get_comparable
+                <
+                    Strategy
+                >::apply(strategy);
+
+        // get segment points
+        segment_point p[2];
+        detail::assign_point_from_index<0>(segment, p[0]);
+        detail::assign_point_from_index<1>(segment, p[1]);
+
+        // get box points
+        std::vector<box_point> box_points(4);
+        detail::assign_box_corners_oriented<true>(box, box_points);
+ 
+        comparable_return_type cd[6];
+        for (unsigned int i = 0; i < 4; ++i)
+        {
+            cd[i] = cstrategy.apply(box_points[i], p[0], p[1]);
+        }
+
+        std::pair
+            <
+                typename std::vector<box_point>::const_iterator,
+                typename std::vector<box_point>::const_iterator
+            > bit_min[2];
+
+        bit_min[0] = point_to_point_range::apply(p[0],
+                                                 box_points.begin(),
+                                                 box_points.end(),
+                                                 cstrategy,
+                                                 cd[4]);
+        bit_min[1] = point_to_point_range::apply(p[1],
+                                                 box_points.begin(),
+                                                 box_points.end(),
+                                                 cstrategy,
+                                                 cd[5]);
+
+        unsigned int imin = 0;
+        for (unsigned int i = 1; i < 6; ++i)
+        {
+            if (cd[i] < cd[imin])
+            {
+                imin = i;
+            }
+        }
+
+        if (BOOST_GEOMETRY_CONDITION(is_comparable<Strategy>::value))
+        {
+            return cd[imin];
+        }
+
+        if (imin < 4)
+        {
+            return strategy.apply(box_points[imin], p[0], p[1]);
+        }
+        else
+        {
+            unsigned int bimin = imin - 4;
+            return strategy.apply(p[bimin],
+                                  *bit_min[bimin].first,
+                                  *bit_min[bimin].second);
+        }
+    }
+};
+
+
+template
+<
+    typename Segment,
+    typename Box,
+    typename Strategy
+>
+class segment_to_box_2D_generic<Segment, Box, Strategy, true>
+{
+private:
+    typedef typename point_type<Segment>::type segment_point;
+    typedef typename point_type<Box>::type box_point;
+
+    typedef typename strategy::distance::services::comparable_type
+        <
+            Strategy
+        >::type comparable_strategy;
+
+    typedef typename strategy::distance::services::return_type
+        <
+            comparable_strategy, segment_point, box_point
+        >::type comparable_return_type;
+
+    typedef typename detail::distance::default_strategy
+        <
+            segment_point, Box
+        >::type point_box_strategy;
+
+    typedef typename strategy::distance::services::comparable_type
+        <
+            point_box_strategy
+        >::type point_box_comparable_strategy;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy, segment_point, box_point
+        >::type return_type;
+
+    static inline return_type apply(Segment const& segment,
+                                    Box const& box,
+                                    Strategy const& strategy,
+                                    bool check_intersection = true)
+    {
+        if (check_intersection && geometry::intersects(segment, box))
+        {
+            return 0;
+        }
+
+        comparable_strategy cstrategy =
+            strategy::distance::services::get_comparable
+                <
+                    Strategy
+                >::apply(strategy);
+        boost::ignore_unused(cstrategy);
+
+        // get segment points
+        segment_point p[2];
+        detail::assign_point_from_index<0>(segment, p[0]);
+        detail::assign_point_from_index<1>(segment, p[1]);
+
+        // get box points
+        std::vector<box_point> box_points(4);
+        detail::assign_box_corners_oriented<true>(box, box_points);
+ 
+        comparable_return_type cd[6];
+        for (unsigned int i = 0; i < 4; ++i)
+        {
+            cd[i] = cstrategy.apply(box_points[i], p[0], p[1]);
+        }
+
+        point_box_comparable_strategy pb_cstrategy;
+        boost::ignore_unused(pb_cstrategy);
+        cd[4] = pb_cstrategy.apply(p[0], box);
+        cd[5] = pb_cstrategy.apply(p[1], box);
+
+        unsigned int imin = 0;
+        for (unsigned int i = 1; i < 6; ++i)
+        {
+            if (cd[i] < cd[imin])
+            {
+                imin = i;
+            }
+        }
+
+        if (is_comparable<Strategy>::value)
+        {
+            return cd[imin];
+        }
+
+        if (imin < 4)
+        {
+            strategy.apply(box_points[imin], p[0], p[1]);
+        }
+        else
+        {
+            return point_box_strategy().apply(p[imin - 4], box);
+        }
+    }
+};
+
+
+
+
+template
+<
+    typename ReturnType,
+    typename SegmentPoint,
+    typename BoxPoint,
+    typename PPStrategy,
+    typename PSStrategy
+>
+class segment_to_box_2D
+{
+private:
+    template <typename Result>
+    struct cast_to_result
+    {
+        template <typename T>
+        static inline Result apply(T const& t)
+        {
+            return boost::numeric_cast<Result>(t);
+        }
+    };
+
+
+    template <typename T, bool IsLess /* true */>
+    struct compare_less_equal
+    {
+        typedef compare_less_equal<T, !IsLess> other;
+
+        template <typename T1, typename T2>
+        inline bool operator()(T1 const& t1, T2 const& t2) const
+        {
+            return std::less_equal<T>()(cast_to_result<T>::apply(t1),
+                                        cast_to_result<T>::apply(t2));
+        }
+    };
+
+    template <typename T>
+    struct compare_less_equal<T, false>
+    {
+        typedef compare_less_equal<T, true> other;
+
+        template <typename T1, typename T2>
+        inline bool operator()(T1 const& t1, T2 const& t2) const
+        {
+            return std::greater_equal<T>()(cast_to_result<T>::apply(t1),
+                                           cast_to_result<T>::apply(t2));
+        }
+    };
+
+
+    template <typename LessEqual>
+    struct other_compare
+    {
+        typedef typename LessEqual::other type;
+    };
+
+
+    // it is assumed here that p0 lies to the right of the box (so the
+    // entire segment lies to the right of the box)
+    template <typename LessEqual>
+    struct right_of_box
+    {
+        static inline ReturnType apply(SegmentPoint const& p0,
+                                       SegmentPoint const& p1,
+                                       BoxPoint const& bottom_right,
+                                       BoxPoint const& top_right,
+                                       PPStrategy const& pp_strategy,
+                                       PSStrategy const& ps_strategy)
+        {
+            boost::ignore_unused(pp_strategy, ps_strategy);
+
+            // the implementation below is written for non-negative slope
+            // segments
+            //
+            // for negative slope segments swap the roles of bottom_right
+            // and top_right and use greater_equal instead of less_equal.
+
+            typedef cast_to_result<ReturnType> cast;
+
+            LessEqual less_equal;
+
+            if (less_equal(geometry::get<1>(top_right), geometry::get<1>(p0)))
+            {
+                // closest box point is the top-right corner
+                return cast::apply(pp_strategy.apply(p0, top_right));
+            }
+            else if (less_equal(geometry::get<1>(bottom_right),
+                                geometry::get<1>(p0)))
+            {
+                // distance is realized between p0 and right-most
+                // segment of box
+                ReturnType diff = cast::apply(geometry::get<0>(p0))
+                    - cast::apply(geometry::get<0>(bottom_right));
+                return strategy::distance::services::result_from_distance
+                    <
+                        PSStrategy, BoxPoint, SegmentPoint
+                    >::apply(ps_strategy, math::abs(diff));
+            }
+            else
+            {
+                // distance is realized between the bottom-right
+                // corner of the box and the segment
+                return cast::apply(ps_strategy.apply(bottom_right, p0, p1));
+            }
+        }
+    };
+
+
+    // it is assumed here that p0 lies above the box (so the
+    // entire segment lies above the box)
+    template <typename LessEqual>
+    struct above_of_box
+    {
+        static inline ReturnType apply(SegmentPoint const& p0,
+                                       SegmentPoint const& p1,
+                                       BoxPoint const& top_left,
+                                       PSStrategy const& ps_strategy)
+        {
+            boost::ignore_unused(ps_strategy);
+
+            // the segment lies above the box
+
+            typedef cast_to_result<ReturnType> cast;
+
+            LessEqual less_equal;
+
+            // p0 is above the upper segment of the box
+            // (and inside its band)
+            if (less_equal(geometry::get<0>(top_left), geometry::get<0>(p0)))
+            {
+                ReturnType diff = cast::apply(geometry::get<1>(p0))
+                    - cast::apply(geometry::get<1>(top_left));
+                return strategy::distance::services::result_from_distance
+                    <
+                        PSStrategy, SegmentPoint, BoxPoint
+                    >::apply(ps_strategy, math::abs(diff));
+            }
+
+            // p0 is to the left of the box, but p1 is above the box
+            // in this case the distance is realized between the
+            // top-left corner of the box and the segment
+            return cast::apply(ps_strategy.apply(top_left, p0, p1));
+        }
+    };
+
+
+    template <typename LessEqual>
+    struct check_right_left_of_box
+    {
+        static inline bool apply(SegmentPoint const& p0,
+                                 SegmentPoint const& p1,
+                                 BoxPoint const& top_left,
+                                 BoxPoint const& top_right,
+                                 BoxPoint const& bottom_left,
+                                 BoxPoint const& bottom_right,
+                                 PPStrategy const& pp_strategy,
+                                 PSStrategy const& ps_strategy,
+                                 ReturnType& result)
+        {
+            // p0 lies to the right of the box
+            if (geometry::get<0>(p0) >= geometry::get<0>(top_right))
+            {
+                result = right_of_box
+                    <
+                        LessEqual
+                    >::apply(p0, p1, bottom_right, top_right,
+                             pp_strategy, ps_strategy);
+                return true;
+            }
+
+            // p1 lies to the left of the box
+            if (geometry::get<0>(p1) <= geometry::get<0>(bottom_left))
+            {
+                result = right_of_box
+                    <
+                        typename other_compare<LessEqual>::type
+                    >::apply(p1, p0, top_left, bottom_left,
+                             pp_strategy, ps_strategy);
+                return true;
+            }
+
+            return false;
+        }
+    };
+
+
+    template <typename LessEqual>
+    struct check_above_below_of_box
+    {
+        static inline bool apply(SegmentPoint const& p0,
+                                 SegmentPoint const& p1,
+                                 BoxPoint const& top_left,
+                                 BoxPoint const& top_right,
+                                 BoxPoint const& bottom_left,
+                                 BoxPoint const& bottom_right,
+                                 PSStrategy const& ps_strategy,
+                                 ReturnType& result)
+        {
+            // the segment lies below the box
+            if (geometry::get<1>(p1) < geometry::get<1>(bottom_left))
+            {
+                result = above_of_box
+                    <
+                        typename other_compare<LessEqual>::type
+                    >::apply(p1, p0, bottom_right, ps_strategy);
+                return true;
+            }
+
+            // the segment lies above the box
+            if (geometry::get<1>(p0) > geometry::get<1>(top_right))
+            {
+                result = above_of_box
+                    <
+                        LessEqual
+                    >::apply(p0, p1, top_left, ps_strategy);
+                return true;
+            }
+            return false;
+        }
+    };
+
+    struct check_generic_position
+    {
+        static inline bool apply(SegmentPoint const& p0,
+                                 SegmentPoint const& p1,
+                                 BoxPoint const& bottom_left0,
+                                 BoxPoint const& top_right0,
+                                 BoxPoint const& bottom_left1,
+                                 BoxPoint const& top_right1,
+                                 BoxPoint const& corner1,
+                                 BoxPoint const& corner2,
+                                 PSStrategy const& ps_strategy,
+                                 ReturnType& result)
+        {
+            typedef cast_to_result<ReturnType> cast;
+
+            ReturnType diff0 = cast::apply(geometry::get<0>(p1))
+                - cast::apply(geometry::get<0>(p0));
+            ReturnType t_min0 = cast::apply(geometry::get<0>(bottom_left0))
+                - cast::apply(geometry::get<0>(p0));
+            ReturnType t_max0 = cast::apply(geometry::get<0>(top_right0))
+                - cast::apply(geometry::get<0>(p0));
+
+            ReturnType diff1 = cast::apply(geometry::get<1>(p1))
+                - cast::apply(geometry::get<1>(p0));
+            ReturnType t_min1 = cast::apply(geometry::get<1>(bottom_left1))
+                - cast::apply(geometry::get<1>(p0));
+            ReturnType t_max1 = cast::apply(geometry::get<1>(top_right1))
+                - cast::apply(geometry::get<1>(p0));
+
+            if (diff1 < 0)
+            {
+                diff1 = -diff1;
+                t_min1 = -t_min1;
+                t_max1 = -t_max1;
+            }
+
+            //  t_min0 > t_max1
+            if (t_min0 * diff1 > t_max1 * diff0)
+            {
+                result = cast::apply(ps_strategy.apply(corner1, p0, p1));
+                return true;
+            }
+
+            //  t_max0 < t_min1
+            if (t_max0 * diff1 < t_min1 * diff0)
+            {
+                result = cast::apply(ps_strategy.apply(corner2, p0, p1));
+                return true;
+            }
+            return false;
+        }
+    };
+
+    static inline ReturnType
+    non_negative_slope_segment(SegmentPoint const& p0,
+                               SegmentPoint const& p1,
+                               BoxPoint const& top_left,
+                               BoxPoint const& top_right,
+                               BoxPoint const& bottom_left,
+                               BoxPoint const& bottom_right,
+                               PPStrategy const& pp_strategy,
+                               PSStrategy const& ps_strategy)
+    {
+        typedef compare_less_equal<ReturnType, true> less_equal;
+
+        // assert that the segment has non-negative slope
+        BOOST_ASSERT( ( math::equals(geometry::get<0>(p0), geometry::get<0>(p1))
+                        && geometry::get<1>(p0) < geometry::get<1>(p1))
+                      ||
+                      ( geometry::get<0>(p0) < geometry::get<0>(p1)
+                        && geometry::get<1>(p0) <= geometry::get<1>(p1) )
+                      );
+
+        ReturnType result(0);
+
+        if (check_right_left_of_box
+                <
+                    less_equal
+                >::apply(p0, p1,
+                         top_left, top_right, bottom_left, bottom_right,
+                         pp_strategy, ps_strategy, result))
+        {
+            return result;
+        }
+
+        if (check_above_below_of_box
+                <
+                    less_equal
+                >::apply(p0, p1,
+                         top_left, top_right, bottom_left, bottom_right,
+                         ps_strategy, result))
+        {
+            return result;
+        }
+
+        if (check_generic_position::apply(p0, p1,
+                                          bottom_left, top_right,
+                                          bottom_left, top_right,
+                                          top_left, bottom_right,
+                                          ps_strategy, result))
+        {
+            return result;
+        }
+
+        // in all other cases the box and segment intersect, so return 0
+        return result;
+    }
+
+
+    static inline ReturnType
+    negative_slope_segment(SegmentPoint const& p0,
+                           SegmentPoint const& p1,
+                           BoxPoint const& top_left,
+                           BoxPoint const& top_right,
+                           BoxPoint const& bottom_left,
+                           BoxPoint const& bottom_right,
+                           PPStrategy const& pp_strategy,
+                           PSStrategy const& ps_strategy)
+    {
+        typedef compare_less_equal<ReturnType, false> greater_equal;
+
+        // assert that the segment has negative slope
+        BOOST_ASSERT( geometry::get<0>(p0) < geometry::get<0>(p1)
+                      && geometry::get<1>(p0) > geometry::get<1>(p1) );
+
+        ReturnType result(0);
+
+        if (check_right_left_of_box
+                <
+                    greater_equal
+                >::apply(p0, p1,
+                         bottom_left, bottom_right, top_left, top_right,
+                         pp_strategy, ps_strategy, result))
+        {
+            return result;
+        }
+
+        if (check_above_below_of_box
+                <
+                    greater_equal
+                >::apply(p1, p0,
+                         top_right, top_left, bottom_right, bottom_left,
+                         ps_strategy, result))
+        {
+            return result;
+        }
+
+        if (check_generic_position::apply(p0, p1,
+                                          bottom_left, top_right,
+                                          top_right, bottom_left,
+                                          bottom_left, top_right,
+                                          ps_strategy, result))
+        {
+            return result;
+        }
+
+        // in all other cases the box and segment intersect, so return 0
+        return result;
+    }
+
+public:
+    static inline ReturnType apply(SegmentPoint const& p0,
+                                   SegmentPoint const& p1,
+                                   BoxPoint const& top_left,
+                                   BoxPoint const& top_right,
+                                   BoxPoint const& bottom_left,
+                                   BoxPoint const& bottom_right,
+                                   PPStrategy const& pp_strategy,
+                                   PSStrategy const& ps_strategy)
+    {
+        BOOST_ASSERT( geometry::less<SegmentPoint>()(p0, p1) );
+
+        if (geometry::get<0>(p0) < geometry::get<0>(p1)
+            && geometry::get<1>(p0) > geometry::get<1>(p1))
+        {
+            return negative_slope_segment(p0, p1,
+                                          top_left, top_right,
+                                          bottom_left, bottom_right,
+                                          pp_strategy, ps_strategy);
+        }
+
+        return non_negative_slope_segment(p0, p1,
+                                          top_left, top_right,
+                                          bottom_left, bottom_right,
+                                          pp_strategy, ps_strategy);
+    }
+};
+
+
+//=========================================================================
+
+
+template
+<
+    typename Segment,
+    typename Box,
+    typename std::size_t Dimension,
+    typename PPStrategy,
+    typename PSStrategy
+>
+class segment_to_box
+    : not_implemented<Segment, Box>
+{};
+
+
+template
+<
+    typename Segment,
+    typename Box,
+    typename PPStrategy,
+    typename PSStrategy
+>
+class segment_to_box<Segment, Box, 2, PPStrategy, PSStrategy>
+{
+private:
+    typedef typename point_type<Segment>::type segment_point;
+    typedef typename point_type<Box>::type box_point;
+
+    typedef typename strategy::distance::services::comparable_type
+        <
+            PPStrategy
+        >::type pp_comparable_strategy;
+
+    typedef typename strategy::distance::services::comparable_type
+        <
+            PSStrategy
+        >::type ps_comparable_strategy;
+
+    typedef typename strategy::distance::services::return_type
+        <
+            ps_comparable_strategy, segment_point, box_point
+        >::type comparable_return_type;
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            PSStrategy, segment_point, box_point
+        >::type return_type;
+
+    static inline return_type apply(Segment const& segment,
+                                    Box const& box,
+                                    PPStrategy const& pp_strategy,
+                                    PSStrategy const& ps_strategy)
+    {
+        segment_point p[2];
+        detail::assign_point_from_index<0>(segment, p[0]);
+        detail::assign_point_from_index<1>(segment, p[1]);
+
+        if (geometry::equals(p[0], p[1]))
+        {
+            typedef typename boost::mpl::if_
+                <
+                    boost::is_same
+                        <
+                            ps_comparable_strategy,
+                            PSStrategy
+                        >,
+                    typename strategy::distance::services::comparable_type
+                        <
+                            typename detail::distance::default_strategy
+                                <
+                                    segment_point, Box
+                                >::type
+                        >::type,
+                    typename detail::distance::default_strategy
+                        <
+                            segment_point, Box
+                        >::type
+                >::type point_box_strategy_type;
+
+            return dispatch::distance
+                <
+                    segment_point,
+                    Box,
+                    point_box_strategy_type
+                >::apply(p[0], box, point_box_strategy_type());
+        }
+
+        box_point top_left, top_right, bottom_left, bottom_right;
+        detail::assign_box_corners(box, bottom_left, bottom_right,
+                                   top_left, top_right);
+
+        if (geometry::less<segment_point>()(p[0], p[1]))
+        {
+            return segment_to_box_2D
+                <
+                    return_type,
+                    segment_point,
+                    box_point,
+                    PPStrategy,
+                    PSStrategy
+                >::apply(p[0], p[1],
+                         top_left, top_right, bottom_left, bottom_right,
+                         pp_strategy,
+                         ps_strategy);
+        }
+        else
+        {
+            return segment_to_box_2D
+                <
+                    return_type,
+                    segment_point,
+                    box_point,
+                    PPStrategy,
+                    PSStrategy
+                >::apply(p[1], p[0],
+                         top_left, top_right, bottom_left, bottom_right,
+                         pp_strategy,
+                         ps_strategy);
+        }
+    }
+};
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Segment, typename Box, typename Strategy>
+struct distance
+    <
+        Segment, Box, Strategy, segment_tag, box_tag,
+        strategy_tag_distance_point_segment, false
+    >
+{
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Segment>::type,
+            typename point_type<Box>::type
+        >::type return_type;
+
+
+    static inline return_type apply(Segment const& segment,
+                                    Box const& box,
+                                    Strategy const& strategy)
+    {
+        assert_dimension_equal<Segment, Box>();
+
+        typedef typename boost::mpl::if_
+            <
+                boost::is_same
+                    <
+                        typename strategy::distance::services::comparable_type
+                            <
+                                Strategy
+                            >::type,
+                        Strategy
+                    >,
+                typename strategy::distance::services::comparable_type
+                    <
+                        typename detail::distance::default_strategy
+                            <
+                                typename point_type<Segment>::type,
+                                typename point_type<Box>::type
+                            >::type
+                    >::type,
+                typename detail::distance::default_strategy
+                    <
+                        typename point_type<Segment>::type,
+                        typename point_type<Box>::type
+                    >::type
+            >::type pp_strategy_type;
+
+
+        return detail::distance::segment_to_box
+            <
+                Segment,
+                Box,
+                dimension<Segment>::value,
+                pp_strategy_type,
+                Strategy
+            >::apply(segment, box, pp_strategy_type(), strategy);
+    }
+};
+
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/distance/segment_to_segment.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,152 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_SEGMENT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_SEGMENT_HPP
+
+#include <algorithm>
+#include <iterator>
+
+#include <boost/core/addressof.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
+
+#include <boost/geometry/algorithms/dispatch/distance.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace distance
+{
+
+
+
+// compute segment-segment distance
+template<typename Segment1, typename Segment2, typename Strategy>
+class segment_to_segment
+{
+private:
+    typedef typename strategy::distance::services::comparable_type
+        <
+            Strategy
+        >::type comparable_strategy;
+
+    typedef typename strategy::distance::services::return_type
+        <
+            comparable_strategy,
+            typename point_type<Segment1>::type,
+            typename point_type<Segment2>::type
+        >::type comparable_return_type;
+
+public:
+    typedef typename strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Segment1>::type,
+            typename point_type<Segment2>::type
+        >::type return_type;
+
+    static inline return_type
+    apply(Segment1 const& segment1, Segment2 const& segment2,
+          Strategy const& strategy)
+    {
+        if (geometry::intersects(segment1, segment2))
+        {
+            return 0;
+        }
+
+        typename point_type<Segment1>::type p[2];
+        detail::assign_point_from_index<0>(segment1, p[0]);
+        detail::assign_point_from_index<1>(segment1, p[1]);
+
+        typename point_type<Segment2>::type q[2];
+        detail::assign_point_from_index<0>(segment2, q[0]);
+        detail::assign_point_from_index<1>(segment2, q[1]);
+
+        comparable_strategy cstrategy =
+            strategy::distance::services::get_comparable
+                <
+                    Strategy
+                >::apply(strategy);
+
+        comparable_return_type d[4];
+        d[0] = cstrategy.apply(q[0], p[0], p[1]);
+        d[1] = cstrategy.apply(q[1], p[0], p[1]);
+        d[2] = cstrategy.apply(p[0], q[0], q[1]);
+        d[3] = cstrategy.apply(p[1], q[0], q[1]);
+
+        std::size_t imin = std::distance(boost::addressof(d[0]),
+                                         std::min_element(d, d + 4));
+
+        if (BOOST_GEOMETRY_CONDITION(is_comparable<Strategy>::value))
+        {
+            return d[imin];
+        }
+
+        switch (imin)
+        {
+        case 0:
+            return strategy.apply(q[0], p[0], p[1]);
+        case 1:
+            return strategy.apply(q[1], p[0], p[1]);
+        case 2:
+            return strategy.apply(p[0], q[0], q[1]);
+        default:
+            return strategy.apply(p[1], q[0], q[1]);
+        }
+    }
+};
+
+
+
+
+}} // namespace detail::distance
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+
+// segment-segment
+template <typename Segment1, typename Segment2, typename Strategy>
+struct distance
+    <
+        Segment1, Segment2, Strategy, segment_tag, segment_tag,
+        strategy_tag_distance_point_segment, false
+    >
+    : detail::distance::segment_to_segment<Segment1, Segment2, Strategy>
+{};
+
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_SEGMENT_TO_SEGMENT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/equals/point_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_EQUALS_POINT_POINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_EQUALS_POINT_POINT_HPP
+
+#include <boost/geometry/algorithms/detail/disjoint/point_point.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace equals
+{
+
+/*!
+    \brief Internal utility function to detect of points are disjoint
+    \note To avoid circular references
+ */
+template <typename Point1, typename Point2>
+inline bool equals_point_point(Point1 const& point1, Point2 const& point2)
+{
+    return ! detail::disjoint::disjoint_point_point(point1, point2);
+}
+
+
+}} // namespace detail::equals
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_EQUALS_POINT_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/extreme_points.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,520 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
+
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/detail/interior_iterator.hpp>
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+#include <boost/geometry/iterators/ever_circling_iterator.hpp>
+
+#include <boost/geometry/algorithms/detail/assign_box_corners.hpp>
+
+#include <boost/geometry/strategies/side.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace extreme_points
+{
+
+template <std::size_t Dimension>
+struct compare
+{
+    template <typename Point>
+    inline bool operator()(Point const& lhs, Point const& rhs)
+    {
+        return geometry::get<Dimension>(lhs) < geometry::get<Dimension>(rhs);
+    }
+};
+
+
+template <std::size_t Dimension, typename PointType, typename CoordinateType>
+inline void move_along_vector(PointType& point, PointType const& extreme, CoordinateType const& base_value)
+{
+    // Moves a point along the vector (point, extreme) in the direction of the extreme  point
+    // This adapts the possibly uneven legs of the triangle (or trapezium-like shape)
+    //      _____extreme            _____
+    //     /     \                 /     \                                    .
+    //    /base   \         =>    /       \ point                             .
+    //             \ point                                                    .
+    //
+    // For so-called intruders, it can be used to adapt both legs to the level of "base"
+    // For the base, it can be used to adapt both legs to the level of the max-value of the intruders
+    // If there are 2 or more extreme values, use the one close to 'point' to have a correct vector
+
+    CoordinateType const value = geometry::get<Dimension>(point);
+    //if (geometry::math::equals(value, base_value))
+    if (value >= base_value)
+    {
+        return;
+    }
+
+    PointType vector = point;
+    subtract_point(vector, extreme);
+
+    CoordinateType const diff = geometry::get<Dimension>(vector);
+
+    // diff should never be zero
+    // because of the way our triangle/trapezium is build.
+    // We just return if it would be the case.
+    if (geometry::math::equals(diff, 0))
+    {
+        return;
+    }
+
+    CoordinateType const base_diff = base_value - geometry::get<Dimension>(extreme);
+
+    multiply_value(vector, base_diff);
+    divide_value(vector, diff);
+
+    // The real move:
+    point = extreme;
+    add_point(point, vector);
+}
+
+
+template <std::size_t Dimension, typename Range, typename CoordinateType>
+inline void move_along_vector(Range& range, CoordinateType const& base_value)
+{
+    if (range.size() >= 3)
+    {
+        move_along_vector<Dimension>(range.front(), *(range.begin() + 1), base_value);
+        move_along_vector<Dimension>(range.back(), *(range.rbegin() + 1), base_value);
+    }
+}
+
+
+template<typename Ring, std::size_t Dimension>
+struct extreme_points_on_ring
+{
+
+    typedef typename geometry::coordinate_type<Ring>::type coordinate_type;
+    typedef typename boost::range_iterator<Ring const>::type range_iterator;
+    typedef typename geometry::point_type<Ring>::type point_type;
+
+    typedef typename geometry::strategy::side::services::default_strategy
+        <
+            typename geometry::cs_tag<point_type>::type
+        >::type side_strategy;
+
+
+    template <typename CirclingIterator, typename Points>
+    static inline bool extend(CirclingIterator& it,
+            std::size_t n,
+            coordinate_type max_coordinate_value,
+            Points& points, int direction)
+    {
+        std::size_t safe_index = 0;
+        do
+        {
+            it += direction;
+
+            points.push_back(*it);
+
+            if (safe_index++ >= n)
+            {
+                // E.g.: ring is completely horizontal or vertical (= invalid, but we don't want to have an infinite loop)
+                return false;
+            }
+        } while (geometry::math::equals(geometry::get<Dimension>(*it), max_coordinate_value));
+
+        return true;
+    }
+
+    // Overload without adding to poinst
+    template <typename CirclingIterator>
+    static inline bool extend(CirclingIterator& it,
+            std::size_t n,
+            coordinate_type max_coordinate_value,
+            int direction)
+    {
+        std::size_t safe_index = 0;
+        do
+        {
+            it += direction;
+
+            if (safe_index++ >= n)
+            {
+                // E.g.: ring is completely horizontal or vertical (= invalid, but we don't want to have an infinite loop)
+                return false;
+            }
+        } while (geometry::math::equals(geometry::get<Dimension>(*it), max_coordinate_value));
+
+        return true;
+    }
+
+    template <typename CirclingIterator>
+    static inline bool extent_both_sides(Ring const& ring,
+            point_type extreme,
+            CirclingIterator& left,
+            CirclingIterator& right)
+    {
+        std::size_t const n = boost::size(ring);
+        coordinate_type const max_coordinate_value = geometry::get<Dimension>(extreme);
+
+        if (! extend(left, n, max_coordinate_value, -1))
+        {
+            return false;
+        }
+        if (! extend(right, n, max_coordinate_value, +1))
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    template <typename Collection, typename CirclingIterator>
+    static inline bool collect(Ring const& ring,
+            point_type extreme,
+            Collection& points,
+            CirclingIterator& left,
+            CirclingIterator& right)
+    {
+        std::size_t const n = boost::size(ring);
+        coordinate_type const max_coordinate_value = geometry::get<Dimension>(extreme);
+
+        // Collects first left, which is reversed (if more than one point) then adds the top itself, then right
+        if (! extend(left, n, max_coordinate_value, points, -1))
+        {
+            return false;
+        }
+        std::reverse(points.begin(), points.end());
+        points.push_back(extreme);
+        if (! extend(right, n, max_coordinate_value, points, +1))
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    template <typename Extremes, typename Intruders, typename CirclingIterator>
+    static inline void get_intruders(Ring const& ring, CirclingIterator left, CirclingIterator right,
+            Extremes const& extremes,
+            Intruders& intruders)
+    {
+        if (boost::size(extremes) < 3)
+        {
+            return;
+        }
+        coordinate_type const min_value = geometry::get<Dimension>(*std::min_element(boost::begin(extremes), boost::end(extremes), compare<Dimension>()));
+
+        // Also select left/right (if Dimension=1)
+        coordinate_type const other_min = geometry::get<1 - Dimension>(*std::min_element(boost::begin(extremes), boost::end(extremes), compare<1 - Dimension>()));
+        coordinate_type const other_max = geometry::get<1 - Dimension>(*std::max_element(boost::begin(extremes), boost::end(extremes), compare<1 - Dimension>()));
+
+        std::size_t defensive_check_index = 0; // in case we skip over left/right check, collect modifies right too
+        std::size_t const n = boost::size(ring);
+        while (left != right && defensive_check_index < n)
+        {
+            coordinate_type const coordinate = geometry::get<Dimension>(*right);
+            coordinate_type const other_coordinate = geometry::get<1 - Dimension>(*right);
+            if (coordinate > min_value && other_coordinate > other_min && other_coordinate < other_max)
+            {
+                int const factor = geometry::point_order<Ring>::value == geometry::clockwise ? 1 : -1;
+                int const first_side = side_strategy::apply(*right, extremes.front(), *(extremes.begin() + 1)) * factor;
+                int const last_side = side_strategy::apply(*right, *(extremes.rbegin() + 1), extremes.back()) * factor;
+
+                // If not lying left from any of the extemes side
+                if (first_side != 1 && last_side != 1)
+                {
+                    //std::cout << "first " << first_side << " last " << last_side << std::endl;
+
+                    // we start at this intrusion until it is handled, and don't affect our initial left iterator
+                    CirclingIterator left_intrusion_it = right;
+                    typename boost::range_value<Intruders>::type intruder;
+                    collect(ring, *right, intruder, left_intrusion_it, right);
+
+                    // Also moves these to base-level, makes sorting possible which can be done in case of self-tangencies
+                    // (we might postpone this action, it is often not necessary. However it is not time-consuming)
+                    move_along_vector<Dimension>(intruder, min_value);
+                    intruders.push_back(intruder);
+                    --right;
+                }
+            }
+            ++right;
+            defensive_check_index++;
+        }
+    }
+
+    template <typename Extremes, typename Intruders>
+    static inline void get_intruders(Ring const& ring,
+            Extremes const& extremes,
+            Intruders& intruders)
+    {
+        std::size_t const n = boost::size(ring);
+        if (n >= 3)
+        {
+            geometry::ever_circling_range_iterator<Ring const> left(ring);
+            geometry::ever_circling_range_iterator<Ring const> right(ring);
+            ++right;
+
+            get_intruders(ring, left, right, extremes, intruders);
+        }
+    }
+
+    template <typename Iterator>
+    static inline bool right_turn(Ring const& ring, Iterator it)
+    {
+        typename std::iterator_traits<Iterator>::difference_type const index
+            = std::distance(boost::begin(ring), it);
+        geometry::ever_circling_range_iterator<Ring const> left(ring);
+        geometry::ever_circling_range_iterator<Ring const> right(ring);
+        left += index;
+        right += index;
+
+        if (! extent_both_sides(ring, *it, left, right))
+        {
+            return false;
+        }
+
+        int const factor = geometry::point_order<Ring>::value == geometry::clockwise ? 1 : -1;
+        int const first_side = side_strategy::apply(*(right - 1), *right, *left) * factor;
+        int const last_side = side_strategy::apply(*left, *(left + 1), *right) * factor;
+
+//std::cout << "Candidate at " << geometry::wkt(*it) << " first=" << first_side << " last=" << last_side << std::endl;
+
+        // Turn should not be left (actually, it should be right because extent removes horizontal/collinear cases)
+        return first_side != 1 && last_side != 1;
+    }
+
+
+    // Gets the extreme segments (top point plus neighbouring points), plus intruders, if any, on the same ring
+    template <typename Extremes, typename Intruders>
+    static inline bool apply(Ring const& ring, Extremes& extremes, Intruders& intruders)
+    {
+        std::size_t const n = boost::size(ring);
+        if (n < 3)
+        {
+            return false;
+        }
+
+        // Get all maxima, usually one. In case of self-tangencies, or self-crossings,
+        // the max might be is not valid. A valid max should make a right turn
+        range_iterator max_it = boost::begin(ring);
+        compare<Dimension> smaller;
+        for (range_iterator it = max_it + 1; it != boost::end(ring); ++it)
+        {
+            if (smaller(*max_it, *it) && right_turn(ring, it))
+            {
+                max_it = it;
+            }
+        }
+
+        if (max_it == boost::end(ring))
+        {
+            return false;
+        }
+
+        typename std::iterator_traits<range_iterator>::difference_type const
+            index = std::distance(boost::begin(ring), max_it);
+//std::cout << "Extreme point lies at " << index << " having " << geometry::wkt(*max_it) << std::endl;
+
+        geometry::ever_circling_range_iterator<Ring const> left(ring);
+        geometry::ever_circling_range_iterator<Ring const> right(ring);
+        left += index;
+        right += index;
+
+        // Collect all points (often 3) in a temporary vector
+        std::vector<point_type> points;
+        points.reserve(3);
+        if (! collect(ring, *max_it, points, left, right))
+        {
+            return false;
+        }
+
+//std::cout << "Built vector of " << points.size() << std::endl;
+
+        coordinate_type const front_value = geometry::get<Dimension>(points.front());
+        coordinate_type const back_value = geometry::get<Dimension>(points.back());
+        coordinate_type const base_value = (std::max)(front_value, back_value);
+        if (front_value < back_value)
+        {
+            move_along_vector<Dimension>(points.front(), *(points.begin() + 1), base_value);
+        }
+        else
+        {
+            move_along_vector<Dimension>(points.back(), *(points.rbegin() + 1), base_value);
+        }
+
+        std::copy(points.begin(), points.end(), std::back_inserter(extremes));
+
+        get_intruders(ring, left, right, extremes, intruders);
+
+        return true;
+    }
+};
+
+
+
+
+
+}} // namespace detail::extreme_points
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry,
+    std::size_t Dimension,
+    typename GeometryTag = typename tag<Geometry>::type
+>
+struct extreme_points
+{};
+
+
+template<typename Ring, std::size_t Dimension>
+struct extreme_points<Ring, Dimension, ring_tag>
+    : detail::extreme_points::extreme_points_on_ring<Ring, Dimension>
+{};
+
+
+template<typename Polygon, std::size_t Dimension>
+struct extreme_points<Polygon, Dimension, polygon_tag>
+{
+    template <typename Extremes, typename Intruders>
+    static inline bool apply(Polygon const& polygon, Extremes& extremes, Intruders& intruders)
+    {
+        typedef typename geometry::ring_type<Polygon>::type ring_type;
+        typedef detail::extreme_points::extreme_points_on_ring
+            <
+                ring_type, Dimension
+            > ring_implementation;
+
+        if (! ring_implementation::apply(geometry::exterior_ring(polygon), extremes, intruders))
+        {
+            return false;
+        }
+
+        // For a polygon, its interior rings can contain intruders
+        typename interior_return_type<Polygon const>::type
+            rings = interior_rings(polygon);
+        for (typename detail::interior_iterator<Polygon const>::type
+                it = boost::begin(rings); it != boost::end(rings); ++it)
+        {
+            ring_implementation::get_intruders(*it, extremes,  intruders);
+        }
+
+        return true;
+    }
+};
+
+template<typename Box>
+struct extreme_points<Box, 1, box_tag>
+{
+    template <typename Extremes, typename Intruders>
+    static inline bool apply(Box const& box, Extremes& extremes, Intruders& )
+    {
+        extremes.resize(4);
+        geometry::detail::assign_box_corners_oriented<false>(box, extremes);
+        // ll,ul,ur,lr, contains too exactly the right info
+        return true;
+    }
+};
+
+template<typename Box>
+struct extreme_points<Box, 0, box_tag>
+{
+    template <typename Extremes, typename Intruders>
+    static inline bool apply(Box const& box, Extremes& extremes, Intruders& )
+    {
+        extremes.resize(4);
+        geometry::detail::assign_box_corners_oriented<false>(box, extremes);
+        // ll,ul,ur,lr, rotate one to start with UL and end with LL
+        std::rotate(extremes.begin(), extremes.begin() + 1, extremes.end());
+        return true;
+    }
+};
+
+template<typename MultiPolygon, std::size_t Dimension>
+struct extreme_points<MultiPolygon, Dimension, multi_polygon_tag>
+{
+    template <typename Extremes, typename Intruders>
+    static inline bool apply(MultiPolygon const& multi, Extremes& extremes, Intruders& intruders)
+    {
+        // Get one for the very first polygon, that is (for the moment) enough.
+        // It is not guaranteed the "extreme" then, but for the current purpose
+        // (point_on_surface) it can just be this point.
+        if (boost::size(multi) >= 1)
+        {
+            return extreme_points
+                <
+                    typename boost::range_value<MultiPolygon const>::type,
+                    Dimension,
+                    polygon_tag
+                >::apply(*boost::begin(multi), extremes, intruders);
+        }
+
+        return false;
+    }
+};
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+/*!
+\brief Returns extreme points (for Edge=1 in dimension 1, so the top,
+       for Edge=0 in dimension 0, the right side)
+\note We could specify a strategy (less/greater) to get bottom/left side too. However, until now we don't need that.
+ */
+template <std::size_t Edge, typename Geometry, typename Extremes, typename Intruders>
+inline bool extreme_points(Geometry const& geometry, Extremes& extremes, Intruders& intruders)
+{
+    concept::check<Geometry const>();
+
+    // Extremes is not required to follow a geometry concept (but it should support an output iterator),
+    // but its elements should fulfil the point-concept
+    concept::check<typename boost::range_value<Extremes>::type>();
+
+    // Intruders should contain collections which value type is point-concept
+    // Extremes might be anything (supporting an output iterator), but its elements should fulfil the point-concept
+    concept::check
+        <
+            typename boost::range_value
+                <
+                    typename boost::range_value<Intruders>::type
+                >::type
+            const
+        >();
+
+    return dispatch::extreme_points<Geometry, Edge>::apply(geometry, extremes, intruders);
+}
+
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/flattening.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,69 @@
+// Boost.Geometry
+
+// Copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_FLATTENING_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_FLATTENING_HPP
+
+#include <boost/geometry/core/radius.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch
+{
+
+template <typename ResultType, typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct flattening
+    : not_implemented<Tag>
+{};
+
+template <typename ResultType, typename Geometry>
+struct flattening<ResultType, Geometry, srs_sphere_tag>
+{
+    static inline ResultType apply(Geometry const& /*geometry*/)
+    {
+        return ResultType(0);
+    }
+};
+
+template <typename ResultType, typename Geometry>
+struct flattening<ResultType, Geometry, srs_spheroid_tag>
+{
+    static inline ResultType apply(Geometry const& geometry)
+    {
+        return ResultType(get_radius<0>(geometry) - get_radius<2>(geometry))
+                    / ResultType(get_radius<0>(geometry));
+    }
+};
+
+} // namespace detail_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename ResultType, typename Geometry>
+ResultType flattening(Geometry const& geometry)
+{
+    return detail_dispatch::flattening<ResultType, Geometry>::apply(geometry);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_FLATTENING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/get_max_size.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_GET_MAX_SIZE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_GET_MAX_SIZE_HPP
+
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/util/math.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename Box, std::size_t Dimension>
+struct get_max_size_box
+{
+    static inline typename coordinate_type<Box>::type apply(Box const& box)
+    {
+        typename coordinate_type<Box>::type s
+            = geometry::math::abs(geometry::get<1, Dimension>(box) - geometry::get<0, Dimension>(box));
+
+        return (std::max)(s, get_max_size_box<Box, Dimension - 1>::apply(box));
+    }
+};
+
+template <typename Box>
+struct get_max_size_box<Box, 0>
+{
+    static inline typename coordinate_type<Box>::type apply(Box const& box)
+    {
+        return geometry::math::abs(geometry::get<1, 0>(box) - geometry::get<0, 0>(box));
+    }
+};
+
+// This might be implemented later on for other geometries too.
+// Not dispatched yet.
+template <typename Box>
+inline typename coordinate_type<Box>::type get_max_size(Box const& box)
+{
+    return get_max_size_box<Box, dimension<Box>::value - 1>::apply(box);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_GET_MAX_SIZE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/interior_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,71 @@
+// Boost.Geometry
+
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERIOR_ITERATOR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERIOR_ITERATOR_HPP
+
+#include <boost/range/iterator.hpp>
+#include <boost/range/value_type.hpp>
+
+#include <boost/geometry/core/interior_type.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+/*!
+\brief Structure defining the type of interior rings iterator
+\note If the Geometry is const, const iterator is defined.
+\tparam Geometry \tparam_geometry
+ */
+template <typename Geometry>
+struct interior_iterator
+{
+    typedef typename boost::range_iterator
+        <
+            typename geometry::interior_type<Geometry>::type        
+        >::type type;
+};
+
+template <typename BaseT, typename T>
+struct copy_const
+{
+    typedef T type;
+};
+
+template <typename BaseT, typename T>
+struct copy_const<BaseT const, T>
+{
+    typedef T const type;
+};
+
+template <typename Geometry>
+struct interior_ring_iterator
+{
+    typedef typename boost::range_iterator
+        <
+            typename copy_const
+                <
+                    typename geometry::interior_type<Geometry>::type,
+                    typename boost::range_value
+                        <
+                            typename geometry::interior_type<Geometry>::type
+                        >::type
+                >::type
+        >::type type;
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERIOR_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/box_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,54 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_BOX_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_BOX_BOX_HPP
+
+
+#include <boost/geometry/algorithms/detail/intersection/interface.hpp>
+#include <boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Box1, typename Box2, bool Reverse
+>
+struct intersection
+    <
+        Box1, Box2,
+        box_tag, box_tag,
+        Reverse
+    > : public detail::intersection::intersection_box_box
+            <
+                0, geometry::dimension<Box1>::value
+            >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_BOX_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,22 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_IMPLEMENTATION_HPP
+
+
+#include <boost/geometry/algorithms/detail/intersection/box_box.hpp>
+#include <boost/geometry/algorithms/detail/intersection/multi.hpp>
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,309 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
+
+
+// TODO: those headers probably may be removed
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>
+#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+// By default, all is forwarded to the intersection_insert-dispatcher
+template
+<
+    typename Geometry1, typename Geometry2,
+    typename Tag1 = typename geometry::tag<Geometry1>::type,
+    typename Tag2 = typename geometry::tag<Geometry2>::type,
+    bool Reverse = reverse_dispatch<Geometry1, Geometry2>::type::value
+>
+struct intersection
+{
+    template <typename RobustPolicy, typename GeometryOut, typename Strategy>
+    static inline bool apply(Geometry1 const& geometry1,
+            Geometry2 const& geometry2,
+            RobustPolicy const& robust_policy,
+            GeometryOut& geometry_out,
+            Strategy const& strategy)
+    {
+        typedef typename boost::range_value<GeometryOut>::type OneOut;
+
+        intersection_insert
+        <
+            Geometry1, Geometry2, OneOut,
+            overlay_intersection
+        >::apply(geometry1, geometry2, robust_policy, std::back_inserter(geometry_out), strategy);
+
+        return true;
+    }
+
+};
+
+
+// If reversal is needed, perform it
+template
+<
+    typename Geometry1, typename Geometry2,
+    typename Tag1, typename Tag2
+>
+struct intersection
+<
+    Geometry1, Geometry2,
+    Tag1, Tag2,
+    true
+>
+    : intersection<Geometry2, Geometry1, Tag2, Tag1, false>
+{
+    template <typename RobustPolicy, typename GeometryOut, typename Strategy>
+    static inline bool apply(
+        Geometry1 const& g1,
+        Geometry2 const& g2,
+        RobustPolicy const& robust_policy,
+        GeometryOut& out,
+        Strategy const& strategy)
+    {
+        return intersection<
+                   Geometry2, Geometry1,
+                   Tag2, Tag1,
+                   false
+               >::apply(g2, g1, robust_policy, out, strategy);
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+    
+namespace resolve_variant
+{
+    
+template <typename Geometry1, typename Geometry2>
+struct intersection
+{
+    template <typename GeometryOut>
+    static inline bool
+    apply(
+          const Geometry1& geometry1,
+          const Geometry2& geometry2,
+          GeometryOut& geometry_out)
+    {
+        concept::check<Geometry1 const>();
+        concept::check<Geometry2 const>();
+        
+        typedef typename geometry::rescale_overlay_policy_type
+        <
+            Geometry1,
+            Geometry2
+        >::type rescale_policy_type;
+        
+        rescale_policy_type robust_policy
+        = geometry::get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
+        
+        typedef strategy_intersection
+        <
+            typename cs_tag<Geometry1>::type,
+            Geometry1,
+            Geometry2,
+            typename geometry::point_type<Geometry1>::type,
+            rescale_policy_type
+        > strategy;
+        
+        return dispatch::intersection
+        <
+            Geometry1,
+            Geometry2
+        >::apply(geometry1, geometry2, robust_policy, geometry_out, strategy());
+    }
+};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
+struct intersection<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
+{
+    template <typename GeometryOut>
+    struct visitor: static_visitor<bool>
+    {
+        Geometry2 const& m_geometry2;
+        GeometryOut& m_geometry_out;
+        
+        visitor(Geometry2 const& geometry2,
+                GeometryOut& geometry_out)
+        : m_geometry2(geometry2),
+        m_geometry_out(geometry_out)
+        {}
+        
+        template <typename Geometry1>
+        result_type operator()(Geometry1 const& geometry1) const
+        {
+            return intersection
+            <
+                Geometry1,
+                Geometry2
+            >::template apply
+            <
+                GeometryOut
+            >
+            (geometry1, m_geometry2, m_geometry_out);
+        }
+    };
+    
+    template <typename GeometryOut>
+    static inline bool
+    apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
+          Geometry2 const& geometry2,
+          GeometryOut& geometry_out)
+    {
+        return apply_visitor(visitor<GeometryOut>(geometry2, geometry_out), geometry1);
+    }
+};
+
+
+template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct intersection<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    template <typename GeometryOut>
+    struct visitor: static_visitor<bool>
+    {
+        Geometry1 const& m_geometry1;
+        GeometryOut& m_geometry_out;
+        
+        visitor(Geometry1 const& geometry1,
+                GeometryOut& geometry_out)
+        : m_geometry1(geometry1),
+          m_geometry_out(geometry_out)
+        {}
+        
+        template <typename Geometry2>
+        result_type operator()(Geometry2 const& geometry2) const
+        {
+            return intersection
+            <
+                Geometry1,
+                Geometry2
+            >::template apply
+            <
+                GeometryOut
+            >
+            (m_geometry1, geometry2, m_geometry_out);
+        }
+    };
+    
+    template <typename GeometryOut>
+    static inline bool
+    apply(
+          Geometry1 const& geometry1,
+          const variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry2,
+          GeometryOut& geometry_out)
+    {
+        return apply_visitor(visitor<GeometryOut>(geometry1, geometry_out), geometry2);
+    }
+};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T1), BOOST_VARIANT_ENUM_PARAMS(typename T2)>
+struct intersection<variant<BOOST_VARIANT_ENUM_PARAMS(T1)>, variant<BOOST_VARIANT_ENUM_PARAMS(T2)> >
+{
+    template <typename GeometryOut>
+    struct visitor: static_visitor<bool>
+    {
+        GeometryOut& m_geometry_out;
+        
+        visitor(GeometryOut& geometry_out)
+        : m_geometry_out(geometry_out)
+        {}
+        
+        template <typename Geometry1, typename Geometry2>
+        result_type operator()(
+                               Geometry1 const& geometry1,
+                               Geometry2 const& geometry2) const
+        {
+            return intersection
+            <
+                Geometry1,
+                Geometry2
+            >::template apply
+            <
+                GeometryOut
+            >
+            (geometry1, geometry2, m_geometry_out);
+        }
+    };
+    
+    template <typename GeometryOut>
+    static inline bool
+    apply(
+          const variant<BOOST_VARIANT_ENUM_PARAMS(T1)>& geometry1,
+          const variant<BOOST_VARIANT_ENUM_PARAMS(T2)>& geometry2,
+          GeometryOut& geometry_out)
+    {
+        return apply_visitor(visitor<GeometryOut>(geometry_out), geometry1, geometry2);
+    }
+};
+    
+} // namespace resolve_variant
+    
+
+/*!
+\brief \brief_calc2{intersection}
+\ingroup intersection
+\details \details_calc2{intersection, spatial set theoretic intersection}.
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam GeometryOut Collection of geometries (e.g. std::vector, std::deque, boost::geometry::multi*) of which
+    the value_type fulfills a \p_l_or_c concept, or it is the output geometry (e.g. for a box)
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param geometry_out The output geometry, either a multi_point, multi_polygon,
+    multi_linestring, or a box (for intersection of two boxes)
+
+\qbk{[include reference/algorithms/intersection.qbk]}
+*/
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename GeometryOut
+>
+inline bool intersection(Geometry1 const& geometry1,
+            Geometry2 const& geometry2,
+            GeometryOut& geometry_out)
+{
+    return resolve_variant::intersection
+        <
+           Geometry1,
+           Geometry2
+        >::template apply
+        <
+            GeometryOut
+        >
+        (geometry1, geometry2, geometry_out);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/intersection/multi.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,423 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_MULTI_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_MULTI_HPP
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/geometry_id.hpp>
+#include <boost/geometry/core/is_areal.hpp>
+#include <boost/geometry/core/point_order.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+// TODO: those headers probably may be removed
+#include <boost/geometry/algorithms/detail/overlay/get_ring.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
+#include <boost/geometry/algorithms/detail/overlay/copy_segments.hpp>
+#include <boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>
+#include <boost/geometry/algorithms/detail/overlay/select_rings.hpp>
+#include <boost/geometry/algorithms/detail/sections/range_by_section.hpp>
+#include <boost/geometry/algorithms/detail/sections/sectionalize.hpp>
+
+#include <boost/geometry/algorithms/detail/intersection/interface.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/envelope.hpp>
+#include <boost/geometry/algorithms/num_points.hpp>
+
+// TODO: remove this after moving num_point from multi directory
+#include <boost/geometry/multi/algorithms/num_points.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace intersection
+{
+
+
+template <typename PointOut>
+struct intersection_multi_linestring_multi_linestring_point
+{
+    template
+    <
+        typename MultiLinestring1, typename MultiLinestring2,
+        typename RobustPolicy,
+        typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(MultiLinestring1 const& ml1,
+            MultiLinestring2 const& ml2,
+            RobustPolicy const& robust_policy,
+            OutputIterator out,
+            Strategy const& strategy)
+    {
+        // Note, this loop is quadratic w.r.t. number of linestrings per input.
+        // Future Enhancement: first do the sections of each, then intersect.
+        for (typename boost::range_iterator
+                <
+                    MultiLinestring1 const
+                >::type it1 = boost::begin(ml1);
+            it1 != boost::end(ml1);
+            ++it1)
+        {
+            for (typename boost::range_iterator
+                    <
+                        MultiLinestring2 const
+                    >::type it2 = boost::begin(ml2);
+                it2 != boost::end(ml2);
+                ++it2)
+            {
+                out = intersection_linestring_linestring_point<PointOut>
+                      ::apply(*it1, *it2, robust_policy, out, strategy);
+            }
+        }
+
+        return out;
+    }
+};
+
+
+template <typename PointOut>
+struct intersection_linestring_multi_linestring_point
+{
+    template
+    <
+        typename Linestring, typename MultiLinestring,
+        typename RobustPolicy,
+        typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(Linestring const& linestring,
+            MultiLinestring const& ml,
+            RobustPolicy const& robust_policy,
+            OutputIterator out,
+            Strategy const& strategy)
+    {
+        for (typename boost::range_iterator
+                <
+                    MultiLinestring const
+                >::type it = boost::begin(ml);
+            it != boost::end(ml);
+            ++it)
+        {
+            out = intersection_linestring_linestring_point<PointOut>
+                  ::apply(linestring, *it, robust_policy, out, strategy);
+        }
+
+        return out;
+    }
+};
+
+
+// This loop is quite similar to the loop above, but beacuse the iterator
+// is second (above) or first (below) argument, it is not trivial to merge them.
+template
+<
+    bool ReverseAreal,
+    typename LineStringOut,
+    overlay_type OverlayType
+>
+struct intersection_of_multi_linestring_with_areal
+{
+    template
+    <
+        typename MultiLinestring, typename Areal,
+        typename RobustPolicy,
+        typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(MultiLinestring const& ml, Areal const& areal,
+            RobustPolicy const& robust_policy,
+            OutputIterator out,
+            Strategy const& strategy)
+    {
+        for (typename boost::range_iterator
+                <
+                    MultiLinestring const
+                >::type it = boost::begin(ml);
+            it != boost::end(ml);
+            ++it)
+        {
+            out = intersection_of_linestring_with_areal
+                <
+                    ReverseAreal, LineStringOut, OverlayType
+                >::apply(*it, areal, robust_policy, out, strategy);
+        }
+
+        return out;
+
+    }
+};
+
+// This one calls the one above with reversed arguments
+template
+<
+    bool ReverseAreal,
+    typename LineStringOut,
+    overlay_type OverlayType
+>
+struct intersection_of_areal_with_multi_linestring
+{
+    template
+    <
+        typename Areal, typename MultiLinestring,
+        typename RobustPolicy,
+        typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(Areal const& areal, MultiLinestring const& ml,
+            RobustPolicy const& robust_policy,
+            OutputIterator out,
+            Strategy const& strategy)
+    {
+        return intersection_of_multi_linestring_with_areal
+            <
+                ReverseAreal, LineStringOut, OverlayType
+            >::apply(ml, areal, robust_policy, out, strategy);
+    }
+};
+
+
+
+template <typename LinestringOut>
+struct clip_multi_linestring
+{
+    template
+    <
+        typename MultiLinestring, typename Box,
+        typename RobustPolicy,
+        typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(MultiLinestring const& multi_linestring,
+            Box const& box,
+            RobustPolicy const& robust_policy,
+            OutputIterator out, Strategy const& )
+    {
+        typedef typename point_type<LinestringOut>::type point_type;
+        strategy::intersection::liang_barsky<Box, point_type> lb_strategy;
+        for (typename boost::range_iterator<MultiLinestring const>::type it
+            = boost::begin(multi_linestring);
+            it != boost::end(multi_linestring); ++it)
+        {
+            out = detail::intersection::clip_range_with_box
+                <LinestringOut>(box, *it, robust_policy, out, lb_strategy);
+        }
+        return out;
+    }
+};
+
+
+}} // namespace detail::intersection
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// Linear
+template
+<
+    typename MultiLinestring1, typename MultiLinestring2,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool Reverse1, bool Reverse2, bool ReverseOut
+>
+struct intersection_insert
+    <
+        MultiLinestring1, MultiLinestring2,
+        GeometryOut,
+        OverlayType,
+        Reverse1, Reverse2, ReverseOut,
+        multi_linestring_tag, multi_linestring_tag, point_tag,
+        false, false, false
+    > : detail::intersection::intersection_multi_linestring_multi_linestring_point
+            <
+                GeometryOut
+            >
+{};
+
+
+template
+<
+    typename Linestring, typename MultiLinestring,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool Reverse1, bool Reverse2, bool ReverseOut
+>
+struct intersection_insert
+    <
+        Linestring, MultiLinestring,
+        GeometryOut,
+        OverlayType,
+        Reverse1, Reverse2, ReverseOut,
+        linestring_tag, multi_linestring_tag, point_tag,
+        false, false, false
+    > : detail::intersection::intersection_linestring_multi_linestring_point
+            <
+                GeometryOut
+            >
+{};
+
+
+template
+<
+    typename MultiLinestring, typename Box,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool Reverse1, bool Reverse2, bool ReverseOut
+>
+struct intersection_insert
+    <
+        MultiLinestring, Box,
+        GeometryOut,
+        OverlayType,
+        Reverse1, Reverse2, ReverseOut,
+        multi_linestring_tag, box_tag, linestring_tag,
+        false, true, false
+    > : detail::intersection::clip_multi_linestring
+            <
+                GeometryOut
+            >
+{};
+
+
+template
+<
+    typename Linestring, typename MultiPolygon,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool ReverseLinestring, bool ReverseMultiPolygon, bool ReverseOut
+>
+struct intersection_insert
+    <
+        Linestring, MultiPolygon,
+        GeometryOut,
+        OverlayType,
+        ReverseLinestring, ReverseMultiPolygon, ReverseOut,
+        linestring_tag, multi_polygon_tag, linestring_tag,
+        false, true, false
+    > : detail::intersection::intersection_of_linestring_with_areal
+            <
+                ReverseMultiPolygon,
+                GeometryOut,
+                OverlayType
+            >
+{};
+
+
+// Derives from areal/mls because runtime arguments are in that order.
+// areal/mls reverses it itself to mls/areal
+template
+<
+    typename Polygon, typename MultiLinestring,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool ReversePolygon, bool ReverseMultiLinestring, bool ReverseOut
+>
+struct intersection_insert
+    <
+        Polygon, MultiLinestring,
+        GeometryOut,
+        OverlayType,
+        ReversePolygon, ReverseMultiLinestring, ReverseOut,
+        polygon_tag, multi_linestring_tag, linestring_tag,
+        true, false, false
+    > : detail::intersection::intersection_of_areal_with_multi_linestring
+            <
+                ReversePolygon,
+                GeometryOut,
+                OverlayType
+            >
+{};
+
+
+template
+<
+    typename MultiLinestring, typename Ring,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool ReverseMultiLinestring, bool ReverseRing, bool ReverseOut
+>
+struct intersection_insert
+    <
+        MultiLinestring, Ring,
+        GeometryOut,
+        OverlayType,
+        ReverseMultiLinestring, ReverseRing, ReverseOut,
+        multi_linestring_tag, ring_tag, linestring_tag,
+        false, true, false
+    > : detail::intersection::intersection_of_multi_linestring_with_areal
+            <
+                ReverseRing,
+                GeometryOut,
+                OverlayType
+            >
+{};
+
+template
+<
+    typename MultiLinestring, typename Polygon,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool ReverseMultiLinestring, bool ReverseRing, bool ReverseOut
+>
+struct intersection_insert
+    <
+        MultiLinestring, Polygon,
+        GeometryOut,
+        OverlayType,
+        ReverseMultiLinestring, ReverseRing, ReverseOut,
+        multi_linestring_tag, polygon_tag, linestring_tag,
+        false, true, false
+    > : detail::intersection::intersection_of_multi_linestring_with_areal
+            <
+                ReverseRing,
+                GeometryOut,
+                OverlayType
+            >
+{};
+
+
+
+template
+<
+    typename MultiLinestring, typename MultiPolygon,
+    typename GeometryOut,
+    overlay_type OverlayType,
+    bool ReverseMultiLinestring, bool ReverseMultiPolygon, bool ReverseOut
+>
+struct intersection_insert
+    <
+        MultiLinestring, MultiPolygon,
+        GeometryOut,
+        OverlayType,
+        ReverseMultiLinestring, ReverseMultiPolygon, ReverseOut,
+        multi_linestring_tag, multi_polygon_tag, linestring_tag,
+        false, true, false
+    > : detail::intersection::intersection_of_multi_linestring_with_areal
+            <
+                ReverseMultiPolygon,
+                GeometryOut,
+                OverlayType
+            >
+{};
+
+
+} // namespace dispatch
+#endif
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_MULTI_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_ALWAYS_SIMPLE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_ALWAYS_SIMPLE_HPP
+
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_simple.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_simple
+{
+
+
+template <typename Geometry>
+struct always_simple
+{
+    static inline bool apply(Geometry const&)
+    {
+        return true;
+    }
+};
+
+
+}} // namespace detail::is_simple
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A point is always simple
+template <typename Point>
+struct is_simple<Point, point_tag>
+    : detail::is_simple::always_simple<Point>
+{};
+
+
+// A valid segment is always simple.
+// A segment is a curve.
+// A curve is simple if it does not pass through the same point twice,
+// with the possible exception of its two endpoints
+//
+// Reference: OGC 06-103r4 (6.1.6.1)
+template <typename Segment>
+struct is_simple<Segment, segment_tag>
+    : detail::is_simple::always_simple<Segment>
+{};
+
+
+// A valid box is always simple
+// A box is a Polygon, and it satisfies the conditions for Polygon validity.
+//
+// Reference (for polygon validity): OGC 06-103r4 (6.1.11.1)
+template <typename Box>
+struct is_simple<Box, box_tag>
+    : detail::is_simple::always_simple<Box>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_ALWAYS_SIMPLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,143 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/failure_policy.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_simple.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_simple
+{
+
+
+template <typename Ring>
+struct is_simple_ring
+{
+    static inline bool apply(Ring const& ring)
+    {
+        simplicity_failure_policy policy;
+        return
+            !detail::is_valid::has_duplicates
+                <
+                    Ring, geometry::closure<Ring>::value
+                >::apply(ring, policy);
+    }
+};
+
+
+template <typename Polygon>
+class is_simple_polygon
+{
+private:
+    template <typename InteriorRings>
+    static inline
+    bool are_simple_interior_rings(InteriorRings const& interior_rings)
+    {
+        return
+            detail::check_iterator_range
+                <
+                    is_simple_ring
+                        <
+                            typename boost::range_value<InteriorRings>::type
+                        >
+                >::apply(boost::begin(interior_rings),
+                         boost::end(interior_rings));
+    }
+
+public:
+    static inline bool apply(Polygon const& polygon)
+    {
+        return
+            is_simple_ring
+                <
+                    typename ring_type<Polygon>::type
+                >::apply(exterior_ring(polygon))
+            &&
+            are_simple_interior_rings(geometry::interior_rings(polygon));
+    }
+};
+
+
+}} // namespace detail::is_simple
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A Ring is a Polygon.
+// A Polygon is always a simple geometric object provided that it is valid.
+//
+// Reference (for polygon validity): OGC 06-103r4 (6.1.11.1)
+template <typename Ring>
+struct is_simple<Ring, ring_tag>
+    : detail::is_simple::is_simple_ring<Ring>
+{};
+
+
+// A Polygon is always a simple geometric object provided that it is valid.
+//
+// Reference (for validity of Polygons): OGC 06-103r4 (6.1.11.1)
+template <typename Polygon>
+struct is_simple<Polygon, polygon_tag>
+    : detail::is_simple::is_simple_polygon<Polygon>
+{};
+
+
+// Not clear what the definition is.
+// Right now we consider a MultiPolygon as simple if it is valid.
+//
+// Reference (for validity of MultiPolygons): OGC 06-103r4 (6.1.14)
+template <typename MultiPolygon>
+struct is_simple<MultiPolygon, multi_polygon_tag>
+{
+    static inline bool apply(MultiPolygon const& multipolygon)
+    {
+        return
+            detail::check_iterator_range
+                <
+                    detail::is_simple::is_simple_polygon
+                        <
+                            typename boost::range_value<MultiPolygon>::type
+                        >,
+                    false // do not allow empty multi-polygon
+                >::apply(boost::begin(multipolygon), boost::end(multipolygon));
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,113 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_DEBUG_PRINT_BOUNDARY_POINTS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_DEBUG_PRINT_BOUNDARY_POINTS_HPP
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+#include <algorithm>
+#include <iostream>
+#include <vector>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/io/dsv/write.hpp>
+
+#include <boost/geometry/policies/compare.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+#endif // BOOST_GEOMETRY_TEST_DEBUG
+
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace is_simple
+{
+
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+template <typename Linear, typename Tag = typename tag<Linear>::type>
+struct debug_boundary_points_printer
+    : not_implemented<Linear>
+{};
+
+template <typename Linestring>
+struct debug_boundary_points_printer<Linestring, linestring_tag>
+{
+    static inline void apply(Linestring const& linestring)
+    {
+        std::cout << "boundary points: ";
+        std::cout << " " << geometry::dsv(range::front(linestring));
+        std::cout << " " << geometry::dsv(range::back(linestring));
+        std::cout << std::endl << std::endl;
+    }
+};
+
+template <typename MultiLinestring>
+struct debug_boundary_points_printer<MultiLinestring, multi_linestring_tag>
+{
+    static inline void apply(MultiLinestring const& multilinestring)
+    {
+        typedef typename point_type<MultiLinestring>::type point_type;
+        typedef std::vector<point_type> point_vector;
+
+        point_vector boundary_points;
+        for (typename boost::range_iterator<MultiLinestring const>::type it
+                 = boost::begin(multilinestring);
+             it != boost::end(multilinestring); ++it)
+        {
+            if ( boost::size(*it) > 1
+                 && !geometry::equals(range::front(*it), range::back(*it)) )
+            {
+                boundary_points.push_back( range::front(*it) );
+                boundary_points.push_back( range::back(*it) );
+            }
+        }
+
+        std::sort(boundary_points.begin(), boundary_points.end(),
+                  geometry::less<point_type>());
+
+        std::cout << "boundary points: ";
+        for (typename point_vector::const_iterator
+                 pit = boundary_points.begin();
+             pit != boundary_points.end(); ++pit)
+        {
+            std::cout << " " << geometry::dsv(*pit);
+        }
+        std::cout << std::endl << std::endl;
+    }
+};
+
+
+template <typename Linear>
+inline void debug_print_boundary_points(Linear const& linear)
+{
+    debug_boundary_points_printer<Linear>::apply(linear);
+}
+#else
+template <typename Linear>
+inline void debug_print_boundary_points(Linear const&)
+{
+}
+#endif // BOOST_GEOMETRY_TEST_DEBUG
+
+
+}} // namespace detail::is_simple
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_DEBUG_PRINT_BOUNDARY_POINTS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/failure_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,53 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_FAILURE_POLICY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_FAILURE_POLICY_HPP
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_simple
+{
+
+
+struct simplicity_failure_policy
+{
+    template <validity_failure_type Failure>
+    static inline bool apply()
+    {
+        return Failure == no_failure;
+    }
+
+    template <validity_failure_type Failure, typename Data>
+    static inline bool apply(Data const&)
+    {
+        return apply<Failure>();
+    }
+
+    template <validity_failure_type Failure, typename Data1, typename Data2>
+    static inline bool apply(Data1 const&, Data2 const&)
+    {
+        return apply<Failure>();
+    }
+};
+
+
+}} // namespace detail::is_simple
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_FAILURE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,18 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_IMPLEMENTATION_HPP
+
+#include <boost/geometry/algorithms/detail/is_simple/always_simple.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/areal.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/linear.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/multipoint.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,80 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_INTERFACE_HPP
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_simple.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace resolve_variant {
+
+template <typename Geometry>
+struct is_simple
+{
+    static inline bool apply(Geometry const& geometry)
+    {
+        concept::check<Geometry const>();
+        return dispatch::is_simple<Geometry>::apply(geometry);
+    }
+};
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct is_simple<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    struct visitor : boost::static_visitor<bool>
+    {
+        template <typename Geometry>
+        bool operator()(Geometry const& geometry) const
+        {
+            return is_simple<Geometry>::apply(geometry);
+        }
+    };
+
+    static inline bool
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry)
+    {
+        return boost::apply_visitor(visitor(), geometry);
+    }
+};
+
+} // namespace resolve_variant
+
+
+
+/*!
+\brief \brief_check{is simple}
+\ingroup is_simple
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\return \return_check{is simple}
+
+\qbk{[include reference/algorithms/is_simple.qbk]}
+*/
+template <typename Geometry>
+inline bool is_simple(Geometry const& geometry)
+{
+    return resolve_variant::is_simple<Geometry>::apply(geometry);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,319 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_LINEAR_HPP
+
+#include <algorithm>
+#include <deque>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/policies/predicate_based_interrupt_policy.hpp>
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/signed_index_type.hpp>
+
+#include <boost/geometry/algorithms/detail/disjoint/linear_linear.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
+
+#include <boost/geometry/algorithms/detail/is_simple/debug_print_boundary_points.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/failure_policy.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/debug_print_turns.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_simple.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_simple
+{
+
+
+template <typename Turn>
+inline bool check_segment_indices(Turn const& turn,
+                                  signed_index_type last_index)
+{
+    return
+        (turn.operations[0].seg_id.segment_index == 0
+         && turn.operations[1].seg_id.segment_index == last_index)
+        ||
+        (turn.operations[0].seg_id.segment_index == 0
+         && turn.operations[1].seg_id.segment_index == last_index);
+}
+
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+class is_acceptable_turn
+    : not_implemented<Geometry>
+{};
+
+template <typename Linestring>
+class is_acceptable_turn<Linestring, linestring_tag>
+{
+public:
+    is_acceptable_turn(Linestring const& linestring)
+        : m_linestring(linestring)
+        , m_is_closed(geometry::equals(range::front(linestring),
+                                       range::back(linestring)))
+    {}
+
+    template <typename Turn>
+    inline bool apply(Turn const& turn) const
+    {
+        BOOST_ASSERT(boost::size(m_linestring) > 1);
+        return m_is_closed
+            && turn.method == overlay::method_none
+            && check_segment_indices(turn, boost::size(m_linestring) - 2)
+            && turn.operations[0].fraction.is_zero();
+    }
+
+private:
+    Linestring const& m_linestring;
+    bool const m_is_closed;
+};
+
+template <typename MultiLinestring>
+class is_acceptable_turn<MultiLinestring, multi_linestring_tag>
+{
+private:
+    typedef typename boost::range_value<MultiLinestring>::type linestring_type;
+    typedef is_acceptable_turn<linestring_type> base_type;
+
+    template <typename Point, typename Linestring>
+    static inline bool is_boundary_point_of(Point const& point,
+                                            Linestring const& linestring)
+    {
+        BOOST_ASSERT(boost::size(linestring) > 1);
+        return
+            ! geometry::equals(range::front(linestring),
+                               range::back(linestring))
+            &&
+            (geometry::equals(point, range::front(linestring))
+             || geometry::equals(point, range::back(linestring)));
+    }
+
+    template <typename Turn, typename Linestring>
+    static inline bool is_closing_point_of(Turn const& turn,
+                                           Linestring const& linestring)
+    {
+        BOOST_ASSERT(boost::size(linestring) > 1);
+        return
+            turn.method == overlay::method_none
+            &&
+            check_segment_indices(turn, boost::size(linestring) - 2)
+            &&
+            geometry::equals(range::front(linestring), range::back(linestring))
+            &&
+            turn.operations[0].fraction.is_zero();
+            ;
+    }
+
+    template <typename Linestring1, typename Linestring2>
+    static inline bool have_same_boundary_points(Linestring1 const& ls1,
+                                                 Linestring2 const& ls2)
+    {
+        return
+            geometry::equals(range::front(ls1), range::front(ls2))
+            ?
+            geometry::equals(range::back(ls1), range::back(ls2))
+            :
+            (geometry::equals(range::front(ls1), range::back(ls2))
+             &&
+             geometry::equals(range::back(ls1), range::front(ls2)))
+            ;
+    }
+
+public:
+    is_acceptable_turn(MultiLinestring const& multilinestring)
+        : m_multilinestring(multilinestring)
+    {}
+
+    template <typename Turn>
+    inline bool apply(Turn const& turn) const
+    {
+        linestring_type const& ls1 =
+            range::at(m_multilinestring, turn.operations[0].seg_id.multi_index);
+
+        linestring_type const& ls2 =
+            range::at(m_multilinestring, turn.operations[1].seg_id.multi_index);
+
+        if (turn.operations[0].seg_id.multi_index
+            == turn.operations[1].seg_id.multi_index)
+        {
+            return is_closing_point_of(turn, ls1);
+        }
+
+        return
+            is_boundary_point_of(turn.point, ls1)
+            && is_boundary_point_of(turn.point, ls2)
+            &&
+            ( boost::size(ls1) != 2
+              || boost::size(ls2) != 2
+              || ! have_same_boundary_points(ls1, ls2) );
+    }
+
+private:
+    MultiLinestring const& m_multilinestring;
+};
+
+
+template <typename Linear>
+inline bool has_self_intersections(Linear const& linear)
+{
+    typedef typename point_type<Linear>::type point_type;
+
+    // compute self turns
+    typedef detail::overlay::turn_info
+        <
+            point_type,
+            geometry::segment_ratio
+                <
+                    typename geometry::coordinate_type<point_type>::type
+                >
+        > turn_info;
+
+    std::deque<turn_info> turns;
+
+    typedef detail::overlay::get_turn_info
+        <
+            detail::disjoint::assign_disjoint_policy
+        > turn_policy;
+
+    is_acceptable_turn<Linear> predicate(linear);
+    detail::overlay::predicate_based_interrupt_policy
+        <
+            is_acceptable_turn<Linear>
+        > interrupt_policy(predicate);
+
+    detail::self_get_turn_points::get_turns
+        <
+            turn_policy
+        >::apply(linear,
+                 detail::no_rescale_policy(),
+                 turns,
+                 interrupt_policy);
+
+    detail::is_valid::debug_print_turns(turns.begin(), turns.end());
+    debug_print_boundary_points(linear);
+
+    return interrupt_policy.has_intersections;
+}
+
+
+template <typename Linestring, bool CheckSelfIntersections = true>
+struct is_simple_linestring
+{
+    static inline bool apply(Linestring const& linestring)
+    {
+        simplicity_failure_policy policy;
+        return ! detail::is_valid::has_duplicates
+                    <
+                        Linestring, closed
+                    >::apply(linestring, policy)
+            && ! detail::is_valid::has_spikes
+                    <
+                        Linestring, closed
+                    >::apply(linestring, policy)
+            && ! (CheckSelfIntersections && has_self_intersections(linestring));
+    }
+};
+
+
+template <typename MultiLinestring>
+struct is_simple_multilinestring
+{
+    static inline bool apply(MultiLinestring const& multilinestring)
+    {
+        // check each of the linestrings for simplicity
+        // but do not compute self-intersections yet; these will be
+        // computed for the entire multilinestring
+        if ( ! detail::check_iterator_range
+                 <
+                     is_simple_linestring
+                         <
+                             typename boost::range_value<MultiLinestring>::type,
+                             false // do not compute self-intersections
+                         >,
+                     false // do not allow empty multilinestring
+                 >::apply(boost::begin(multilinestring),
+                          boost::end(multilinestring))
+             )
+        {
+            return false;
+        }
+
+        return ! has_self_intersections(multilinestring);
+    }
+};
+
+
+
+}} // namespace detail::is_simple
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+// A linestring is a curve.
+// A curve is simple if it does not pass through the same point twice,
+// with the possible exception of its two endpoints
+//
+// Reference: OGC 06-103r4 (6.1.6.1)
+template <typename Linestring>
+struct is_simple<Linestring, linestring_tag>
+    : detail::is_simple::is_simple_linestring<Linestring>
+{};
+
+
+// A MultiLinestring is a MultiCurve
+// A MultiCurve is simple if all of its elements are simple and the
+// only intersections between any two elements occur at Points that
+// are on the boundaries of both elements.
+//
+// Reference: OGC 06-103r4 (6.1.8.1; Fig. 9)
+template <typename MultiLinestring>
+struct is_simple<MultiLinestring, multi_linestring_tag>
+    : detail::is_simple::is_simple_multilinestring<MultiLinestring>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,89 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_MULTIPOINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_MULTIPOINT_HPP
+
+#include <algorithm>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/policies/compare.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/failure_policy.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_simple.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_simple
+{
+
+
+template <typename MultiPoint>
+struct is_simple_multipoint
+{
+    static inline bool apply(MultiPoint const& multipoint)
+    {
+        if ( boost::size(multipoint) == 0 )
+        {
+            return false;
+        }
+
+        MultiPoint mp(multipoint);
+        std::sort(boost::begin(mp), boost::end(mp),
+                  geometry::less<typename point_type<MultiPoint>::type>());
+
+        simplicity_failure_policy policy;
+        return !detail::is_valid::has_duplicates
+            <
+                MultiPoint, closed
+            >::apply(mp, policy);
+    }
+};
+
+
+}} // namespace detail::is_simple
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A MultiPoint is simple if no two Points in the MultiPoint are equal
+// (have identical coordinate values in X and Y)
+//
+// Reference: OGC 06-103r4 (6.1.5)
+template <typename MultiPoint>
+struct is_simple<MultiPoint, multi_point_tag>
+    : detail::is_simple::is_simple_multipoint<MultiPoint>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_MULTIPOINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,95 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_BOX_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+template <typename Box, std::size_t I>
+struct has_valid_corners
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Box const& box, VisitPolicy& visitor)
+    {
+        if (math::equals(geometry::get<geometry::min_corner, I-1>(box),
+                         geometry::get<geometry::max_corner, I-1>(box)))
+        {
+            return
+                visitor.template apply<failure_wrong_topological_dimension>();
+        }
+        else if (geometry::get<geometry::min_corner, I-1>(box)
+                 >
+                 geometry::get<geometry::max_corner, I-1>(box))
+        {
+            return visitor.template apply<failure_wrong_corner_order>();
+        }
+        return has_valid_corners<Box, I-1>::apply(box, visitor);
+    }
+};
+
+
+template <typename Box>
+struct has_valid_corners<Box, 0>
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Box const&, VisitPolicy& visitor)
+    {
+        return visitor.template apply<no_failure>();
+    }
+};
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A box is always simple
+// A box is a Polygon, and it satisfies the conditions for Polygon validity.
+//
+// The only thing we have to check is whether the max corner lies in
+// the upper-right quadrant as defined by the min corner
+//
+// Reference (for polygon validity): OGC 06-103r4 (6.1.11.1)
+template <typename Box>
+struct is_valid<Box, box_tag>
+    : detail::is_valid::has_valid_corners<Box, dimension<Box>::value>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/complement_graph.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,239 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_COMPLEMENT_GRAPH_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_COMPLEMENT_GRAPH_HPP
+
+#include <cstddef>
+
+#include <set>
+#include <stack>
+#include <utility>
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/core/addressof.hpp>
+
+#include <boost/geometry/policies/compare.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace is_valid
+{
+
+
+template <typename TurnPoint>
+class complement_graph_vertex
+{
+public:
+    complement_graph_vertex(std::size_t id)
+        : m_id(id)
+        , m_turn_point(NULL)
+    {}
+
+    complement_graph_vertex(TurnPoint const* turn_point,
+                            std::size_t expected_id)
+        : m_id(expected_id)
+        , m_turn_point(turn_point)
+    {}
+
+    inline std::size_t id() const { return m_id; }
+
+    inline bool operator<(complement_graph_vertex const& other) const
+    {
+        if ( m_turn_point != NULL && other.m_turn_point != NULL )
+        {
+            return geometry::less
+                <
+                    TurnPoint
+                >()(*m_turn_point, *other.m_turn_point);
+        }
+        if ( m_turn_point == NULL && other.m_turn_point == NULL )
+        {
+            return m_id < other.m_id;
+        }
+        return m_turn_point == NULL;
+    }
+
+private:
+    // the value of m_turn_point determines the type of the vertex
+    // non-NULL: vertex corresponds to an IP
+    // NULL    : vertex corresponds to a hole or outer space, and the id
+    //           is the ring id of the corresponding ring of the polygon
+    std::size_t m_id;
+    TurnPoint const* m_turn_point;
+};
+
+
+
+
+template <typename TurnPoint>
+class complement_graph
+{
+private:
+    typedef complement_graph_vertex<TurnPoint> vertex;
+    typedef std::set<vertex> vertex_container;
+
+public:
+    typedef typename vertex_container::const_iterator vertex_handle;
+
+private:
+    struct vertex_handle_less
+    {
+        inline bool operator()(vertex_handle v1, vertex_handle v2) const
+        {
+            return v1->id() < v2->id();
+        }
+    };
+
+    typedef std::set<vertex_handle, vertex_handle_less> neighbor_container;
+
+    class has_cycles_dfs_data
+    {
+    public:
+        has_cycles_dfs_data(std::size_t num_nodes)
+            : m_visited(num_nodes, false)
+            , m_parent_id(num_nodes, -1)
+        {}
+
+        inline signed_index_type parent_id(vertex_handle v) const
+        {
+            return m_parent_id[v->id()];
+        }
+
+        inline void set_parent_id(vertex_handle v, signed_index_type id)
+        {
+            m_parent_id[v->id()] = id;
+        }
+
+        inline bool visited(vertex_handle v) const
+        {
+            return m_visited[v->id()];
+        }
+
+        inline void set_visited(vertex_handle v, bool value)
+        {
+            m_visited[v->id()] = value;
+        }
+    private:
+        std::vector<bool> m_visited;
+        std::vector<signed_index_type> m_parent_id;
+    };
+
+
+    inline bool has_cycles(vertex_handle start_vertex,
+                           has_cycles_dfs_data& data) const
+    {
+        std::stack<vertex_handle> stack;
+        stack.push(start_vertex);
+
+        while ( !stack.empty() )
+        {
+            vertex_handle v = stack.top();
+            stack.pop();
+
+            data.set_visited(v, true);
+            for (typename neighbor_container::const_iterator nit
+                     = m_neighbors[v->id()].begin();
+                 nit != m_neighbors[v->id()].end(); ++nit)
+            {
+                if ( static_cast<signed_index_type>((*nit)->id()) != data.parent_id(v) )
+                {
+                    if ( data.visited(*nit) )
+                    {
+                        return true;
+                    }
+                    else
+                    {
+                        data.set_parent_id(*nit, static_cast<signed_index_type>(v->id()));
+                        stack.push(*nit);
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+public:
+    // num_rings: total number of rings, including the exterior ring
+    complement_graph(std::size_t num_rings)
+        : m_num_rings(num_rings)
+        , m_num_turns(0)
+        , m_vertices()
+        , m_neighbors(num_rings)
+    {}
+
+    // inserts a ring vertex in the graph and returns its handle
+    // ring id's are zero-based (so the first interior ring has id 1)
+    inline vertex_handle add_vertex(signed_index_type id)
+    {
+        return m_vertices.insert(vertex(static_cast<std::size_t>(id))).first;
+    }
+
+    // inserts an IP in the graph and returns its id
+    inline vertex_handle add_vertex(TurnPoint const& turn_point)
+    {
+        std::pair<vertex_handle, bool> res
+            = m_vertices.insert(vertex(boost::addressof(turn_point),
+                                       m_num_rings + m_num_turns)
+                                );
+
+        if ( res.second )
+        {
+            // a new element is inserted
+            m_neighbors.push_back(neighbor_container());
+            ++m_num_turns;
+        }
+        return res.first;
+    }
+
+    inline void add_edge(vertex_handle v1, vertex_handle v2)
+    {
+        BOOST_ASSERT( v1 != m_vertices.end() );
+        BOOST_ASSERT( v2 != m_vertices.end() );
+        m_neighbors[v1->id()].insert(v2);
+        m_neighbors[v2->id()].insert(v1);
+    }
+
+    inline bool has_cycles() const
+    {
+        // initialize all vertices as non-visited and with no parent set
+        // this is done by the constructor of has_cycles_dfs_data
+        has_cycles_dfs_data data(m_num_rings + m_num_turns);
+
+        // for each non-visited vertex, start a DFS from that vertex
+        for (vertex_handle it = m_vertices.begin();
+             it != m_vertices.end(); ++it)
+        {
+            if ( !data.visited(it) && has_cycles(it, data) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    template <typename OStream, typename TP>
+    friend inline
+    void debug_print_complement_graph(OStream&, complement_graph<TP> const&);
+
+private:
+    std::size_t m_num_rings, m_num_turns;
+    vertex_container m_vertices;
+    std::vector<neighbor_container> m_neighbors;
+};
+
+
+}} // namespace detail::is_valid
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_COMPLEMENT_GRAPH_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_complement_graph.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_COMPLEMENT_GRAPH_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_COMPLEMENT_GRAPH_HPP
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+#include <iostream>
+#endif
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace is_valid
+{
+
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+template <typename OutputStream, typename TurnPoint>
+inline void
+debug_print_complement_graph(OutputStream& os,
+                             complement_graph<TurnPoint> const& graph)
+{
+    typedef typename complement_graph<TurnPoint>::vertex_handle vertex_handle;
+
+    os << "num rings: " << graph.m_num_rings << std::endl;
+    os << "vertex ids: {";
+    for (vertex_handle it = graph.m_vertices.begin();
+         it != graph.m_vertices.end(); ++it)
+    {
+        os << " " << it->id();
+    }
+    os << " }" << std::endl;        
+
+    for (vertex_handle it = graph.m_vertices.begin();
+         it != graph.m_vertices.end(); ++it)
+    {
+        os << "neighbors of " << it->id() << ": {";
+        for (typename complement_graph
+                 <
+                     TurnPoint
+                 >::neighbor_container::const_iterator
+                 nit = graph.m_neighbors[it->id()].begin();
+             nit != graph.m_neighbors[it->id()].end(); ++nit)
+        {
+            os << " " << (*nit)->id();
+        }
+        os << "}" << std::endl;        
+    }
+}
+#else
+template <typename OutputStream, typename TurnPoint>
+inline void debug_print_complement_graph(OutputStream&,
+                                         complement_graph<TurnPoint> const&)
+{
+}
+#endif
+
+
+}} // namespace detail::is_valid
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_COMPLEMENT_GRAPH_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_print_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,78 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_PRINT_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_PRINT_TURNS_HPP
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+#include <iostream>
+
+#include <boost/geometry/io/dsv/write.hpp>
+#include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
+#endif
+
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace is_valid
+{
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+template <typename Turn>
+inline void debug_print_turn(Turn const& turn)
+{
+    std::cout << " ["
+              << geometry::method_char(turn.method)
+              << ","
+              << geometry::operation_char(turn.operations[0].operation)
+              << "/"
+              << geometry::operation_char(turn.operations[1].operation)
+              << " {"
+              << turn.operations[0].seg_id.multi_index
+              << ", "
+              << turn.operations[1].seg_id.multi_index
+              << "} {"
+              << turn.operations[0].seg_id.ring_index
+              << ", "
+              << turn.operations[1].seg_id.ring_index
+              << "} {"
+              << turn.operations[0].seg_id.segment_index
+              << ", "
+              << turn.operations[1].seg_id.segment_index
+              << "} "
+              << geometry::dsv(turn.point)
+              << "]";
+}
+
+template <typename TurnIterator>
+inline void debug_print_turns(TurnIterator first, TurnIterator beyond)
+{
+    std::cout << "turns:";
+    for (TurnIterator tit = first; tit != beyond; ++tit)
+    {
+        debug_print_turn(*tit);
+    }
+    std::cout << std::endl << std::endl;
+}
+#else
+template <typename Turn>
+inline void debug_print_turn(Turn const&)
+{}
+
+template <typename TurnIterator>
+inline void debug_print_turns(TurnIterator, TurnIterator)
+{}
+#endif // BOOST_GEOMETRY_TEST_DEBUG
+
+}} // namespace detail::is_valid
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_PRINT_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/debug_validity_phase.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,68 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_VALIDITY_PHASE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_VALIDITY_PHASE_HPP
+
+#ifdef GEOMETRY_TEST_DEBUG
+#include <iostream>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+#endif
+
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace is_valid
+{
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct debug_validity_phase
+{
+    static inline void apply(int)
+    {
+    }
+};
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+template <typename Polygon>
+struct debug_validity_phase<Polygon, polygon_tag>
+{
+    static inline void apply(int phase)
+    {
+        switch (phase)
+        {
+        case 1:
+            std::cout << "checking exterior ring..." << std::endl;
+            break;
+        case 2:
+            std::cout << "checking interior rings..." << std::endl;
+            break;
+        case 3:
+            std::cout << "computing and analyzing turns..." << std::endl;
+            break;
+        case 4:
+            std::cout << "checking if interior rings are inside "
+                      << "the exterior ring..." << std::endl;
+            break;
+        case 5:
+            std::cout << "checking connectivity of interior..." << std::endl;
+            break;
+        }
+    }
+};
+#endif
+
+}} // namespace detail::is_valid
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_DEBUG_VALIDITY_PHASE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,73 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_DUPLICATES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_DUPLICATES_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+
+#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/policies/is_valid/default_policy.hpp>
+
+#include <boost/geometry/views/closeable_view.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+template <typename Range, closure_selector Closure>
+struct has_duplicates
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Range const& range, VisitPolicy& visitor)
+    {
+        typedef typename closeable_view<Range const, Closure>::type view_type;
+        typedef typename boost::range_iterator<view_type const>::type iterator;
+
+        view_type view(range);
+
+        if ( boost::size(view) < 2 )
+        {
+            return ! visitor.template apply<no_failure>();
+        }
+
+        geometry::equal_to<typename boost::range_value<Range>::type> equal;
+
+        iterator it = boost::begin(view);
+        iterator next = ++boost::begin(view);
+        for (; next != boost::end(view); ++it, ++next)
+        {
+            if ( equal(*it, *next) )
+            {
+                return ! visitor.template apply<failure_duplicate_points>(*it);
+            }
+        }
+        return ! visitor.template apply<no_failure>();
+    }
+};
+
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_DUPLICATES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_spikes.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,159 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_SPIKES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_SPIKES_HPP
+
+#include <algorithm>
+
+#include <boost/range.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/policies/is_valid/default_policy.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/views/closeable_view.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp>
+#include <boost/geometry/io/dsv/write.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+template <typename Point>
+struct equal_to
+{
+    Point const& m_point;
+
+    equal_to(Point const& point)
+        : m_point(point)
+    {}
+
+    template <typename OtherPoint>
+    inline bool operator()(OtherPoint const& other) const
+    {
+        return geometry::equals(m_point, other);
+    }
+};
+
+template <typename Point>
+struct not_equal_to
+{
+    Point const& m_point;
+
+    not_equal_to(Point const& point)
+        : m_point(point)
+    {}
+
+    template <typename OtherPoint>
+    inline bool operator()(OtherPoint const& other) const
+    {
+        return ! geometry::equals(other, m_point);
+    }
+};
+
+
+
+template <typename Range, closure_selector Closure>
+struct has_spikes
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Range const& range, VisitPolicy& visitor)
+    {
+        typedef not_equal_to<typename point_type<Range>::type> not_equal;
+
+        typedef typename closeable_view<Range const, Closure>::type view_type;
+        typedef typename boost::range_iterator<view_type const>::type iterator; 
+
+        bool const is_linear
+            = boost::is_same<typename tag<Range>::type, linestring_tag>::value;
+
+        view_type const view(range);
+
+        iterator prev = boost::begin(view);
+
+        iterator cur = std::find_if(prev, boost::end(view), not_equal(*prev));
+        if ( cur == boost::end(view) )
+        {
+            // the range has only one distinct point, so it
+            // cannot have a spike
+            return ! visitor.template apply<no_failure>();
+        }
+
+        iterator next = std::find_if(cur, boost::end(view), not_equal(*cur));
+        if ( next == boost::end(view) )
+        {
+            // the range has only two distinct points, so it
+            // cannot have a spike
+            return ! visitor.template apply<no_failure>();
+        }
+
+        while ( next != boost::end(view) )
+        {
+            if ( geometry::detail::point_is_spike_or_equal(*prev,
+                                                           *next,
+                                                           *cur) )
+            {
+                return
+                    ! visitor.template apply<failure_spikes>(is_linear, *cur);
+            }
+            prev = cur;
+            cur = next;
+            next = std::find_if(cur, boost::end(view), not_equal(*cur));
+        }
+
+        if ( geometry::equals(range::front(view), range::back(view)) )
+        {
+            iterator cur = boost::begin(view);
+            typename boost::range_reverse_iterator
+                <
+                    view_type const
+                >::type prev = std::find_if(boost::rbegin(view),
+                                            boost::rend(view),
+                                            not_equal(range::back(view)));
+            iterator next =
+                std::find_if(cur, boost::end(view), not_equal(*cur));
+            if (detail::point_is_spike_or_equal(*prev, *next, *cur))
+            {
+                return
+                    ! visitor.template apply<failure_spikes>(is_linear, *cur);
+            }
+            else
+            {
+                return ! visitor.template apply<no_failure>();
+            }
+        }
+
+        return ! visitor.template apply<no_failure>();
+    }
+};
+
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_SPIKES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,115 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_VALID_SELF_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_VALID_SELF_TURNS_HPP
+
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/policies/predicate_based_interrupt_policy.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio_type.hpp>
+#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/is_acceptable_turn.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+template
+<
+    typename Geometry,
+    typename IsAcceptableTurn = is_acceptable_turn<Geometry>
+>
+class has_valid_self_turns
+{
+private:
+    typedef typename point_type<Geometry>::type point_type;
+
+    typedef typename geometry::rescale_policy_type
+        <
+            point_type
+        >::type rescale_policy_type;
+
+    typedef detail::overlay::get_turn_info
+        <
+            detail::overlay::assign_null_policy
+        > turn_policy;
+
+public:
+    typedef detail::overlay::turn_info
+        <
+            point_type,
+            typename geometry::segment_ratio_type
+                <
+                    point_type,
+                    rescale_policy_type
+                >::type
+        > turn_type;
+
+    // returns true if all turns are valid
+    template <typename Turns, typename VisitPolicy>
+    static inline bool apply(Geometry const& geometry,
+                             Turns& turns,
+                             VisitPolicy& visitor)
+    {
+        rescale_policy_type robust_policy
+            = geometry::get_rescale_policy<rescale_policy_type>(geometry);
+
+        detail::overlay::stateless_predicate_based_interrupt_policy
+            <
+                IsAcceptableTurn
+            > interrupt_policy;
+
+        geometry::self_turns<turn_policy>(geometry,
+                                          robust_policy,
+                                          turns,
+                                          interrupt_policy);
+
+        if (interrupt_policy.has_intersections)
+        {
+            BOOST_ASSERT(! boost::empty(turns));
+            return visitor.template apply<failure_self_intersections>(turns);
+        }
+        else
+        {
+            return visitor.template apply<no_failure>();
+        }
+    }
+
+    // returns true if all turns are valid
+    template <typename VisitPolicy>
+    static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+    {
+        std::vector<turn_type> turns;
+        return apply(geometry, turns, visitor);
+    }
+};
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_VALID_SELF_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/implementation.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,21 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IMPLEMENTATION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IMPLEMENTATION_HPP
+
+#include <boost/geometry/algorithms/detail/is_valid/pointlike.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/linear.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/polygon.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/multipolygon.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/ring.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/segment.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/box.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IMPLEMENTATION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/interface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,159 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_INTERFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_INTERFACE_HPP
+
+#include <sstream>
+#include <string>
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+#include <boost/geometry/policies/is_valid/default_policy.hpp>
+#include <boost/geometry/policies/is_valid/failing_reason_policy.hpp>
+#include <boost/geometry/policies/is_valid/failure_type_policy.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace resolve_variant {
+
+template <typename Geometry>
+struct is_valid
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+    {
+        concept::check<Geometry const>();
+        return dispatch::is_valid<Geometry>::apply(geometry, visitor);
+    }
+};
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct is_valid<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    template <typename VisitPolicy>
+    struct visitor : boost::static_visitor<bool>
+    {
+        visitor(VisitPolicy& policy) : m_policy(policy) {}
+
+        template <typename Geometry>
+        bool operator()(Geometry const& geometry) const
+        {
+            return is_valid<Geometry>::apply(geometry, m_policy);
+        }
+
+        VisitPolicy& m_policy;
+    };
+
+    template <typename VisitPolicy>
+    static inline bool
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry,
+          VisitPolicy& policy_visitor)
+    {
+        return boost::apply_visitor(visitor<VisitPolicy>(policy_visitor),
+                                    geometry);
+    }
+};
+
+} // namespace resolve_variant
+
+
+// Undocumented for now
+template <typename Geometry, typename VisitPolicy>
+inline bool is_valid(Geometry const& geometry, VisitPolicy& visitor)
+{
+    return resolve_variant::is_valid<Geometry>::apply(geometry, visitor);
+}
+
+
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\return \return_check{is valid (in the OGC sense);
+    furthermore, the following geometries are considered valid:
+    multi-geometries with no elements,
+    linear geometries containing spikes,
+    areal geometries with duplicate (consecutive) points}
+
+\qbk{[include reference/algorithms/is_valid.qbk]}
+*/
+template <typename Geometry>
+inline bool is_valid(Geometry const& geometry)
+{
+    is_valid_default_policy<> policy_visitor;
+    return is_valid(geometry, policy_visitor);
+}
+
+
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\param failure An enumeration value indicating that the geometry is
+    valid or not, and if not valid indicating the reason why
+\return \return_check{is valid (in the OGC sense);
+    furthermore, the following geometries are considered valid:
+    multi-geometries with no elements,
+    linear geometries containing spikes,
+    areal geometries with duplicate (consecutive) points}
+
+\qbk{distinguish,with failure value}
+\qbk{[include reference/algorithms/is_valid_with_failure.qbk]}
+*/
+template <typename Geometry>
+inline bool is_valid(Geometry const& geometry, validity_failure_type& failure)
+{
+    failure_type_policy<> policy_visitor;
+    bool result = is_valid(geometry, policy_visitor);
+    failure = policy_visitor.failure();
+    return result;
+}
+
+
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\param message A string containing a message stating if the geometry
+    is valid or not, and if not valid a reason why
+\return \return_check{is valid (in the OGC sense);
+    furthermore, the following geometries are considered valid:
+    multi-geometries with no elements,
+    linear geometries containing spikes,
+    areal geometries with duplicate (consecutive) points}
+
+\qbk{distinguish,with message}
+\qbk{[include reference/algorithms/is_valid_with_message.qbk]}
+*/
+template <typename Geometry>
+inline bool is_valid(Geometry const& geometry, std::string& message)
+{
+    std::ostringstream stream;
+    failing_reason_policy<> policy_visitor(stream);
+    bool result = is_valid(geometry, policy_visitor);
+    message = stream.str();
+    return result;
+}
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_INTERFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/is_acceptable_turn.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,154 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IS_ACCEPTABLE_TURN_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IS_ACCEPTABLE_TURN_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_order.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+template
+<
+    typename Geometry,
+    order_selector Order = geometry::point_order<Geometry>::value,
+    typename Tag = typename tag<Geometry>::type
+>
+struct acceptable_operation
+{};
+
+template <typename Polygon>
+struct acceptable_operation<Polygon, counterclockwise, polygon_tag>
+{
+    static const detail::overlay::operation_type value =
+        detail::overlay::operation_union;
+};
+
+template <typename Polygon>
+struct acceptable_operation<Polygon, clockwise, polygon_tag>
+{
+    static const detail::overlay::operation_type value =
+        detail::overlay::operation_intersection;
+};
+
+template <typename MultiPolygon>
+struct acceptable_operation<MultiPolygon, counterclockwise, multi_polygon_tag>
+{
+    static const detail::overlay::operation_type value =
+        detail::overlay::operation_intersection;
+};
+
+template <typename MultiPolygon>
+struct acceptable_operation<MultiPolygon, clockwise, multi_polygon_tag>
+{
+    static const detail::overlay::operation_type value =
+        detail::overlay::operation_union;
+};
+
+
+
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct is_acceptable_turn
+{};
+
+template <typename Ring>
+struct is_acceptable_turn<Ring, ring_tag>
+{
+    template <typename Turn>
+    static inline bool apply(Turn const&)
+    {
+        return false;
+    }
+};
+
+template <typename Polygon>
+class is_acceptable_turn<Polygon, polygon_tag>
+{
+protected:
+    template <typename Turn, typename Method, typename Operation>
+    static inline bool check_turn(Turn const& turn,
+                                  Method method,
+                                  Operation operation)
+    {
+        return turn.method == method
+            && turn.operations[0].operation == operation
+            && turn.operations[1].operation == operation;
+    }
+
+
+public:
+    template <typename Turn>
+    static inline bool apply(Turn const& turn)
+    {
+        using namespace detail::overlay;
+
+        if ( turn.operations[0].seg_id.ring_index
+             == turn.operations[1].seg_id.ring_index )
+        {
+            return false;
+        }
+
+        operation_type const op = acceptable_operation<Polygon>::value;
+
+        return check_turn(turn, method_touch_interior, op)
+            || check_turn(turn, method_touch, op)
+            ;
+    }
+};
+
+template <typename MultiPolygon>
+class is_acceptable_turn<MultiPolygon, multi_polygon_tag>
+    : is_acceptable_turn<typename boost::range_value<MultiPolygon>::type>
+{
+private:
+    typedef typename boost::range_value<MultiPolygon>::type polygon;
+    typedef is_acceptable_turn<polygon> base;
+
+public:
+    template <typename Turn>
+    static inline bool apply(Turn const& turn)
+    {
+        using namespace detail::overlay;
+
+        if ( turn.operations[0].seg_id.multi_index
+             == turn.operations[1].seg_id.multi_index )
+        {
+            return base::apply(turn);
+        }
+
+        operation_type const op = acceptable_operation<MultiPolygon>::value;
+
+        return base::check_turn(turn, method_touch_interior, op)
+            || base::check_turn(turn, method_touch, op)
+            ;
+    }
+};   
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_IS_ACCEPTABLE_TURN_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,164 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_LINEAR_HPP
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
+#include <boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+template <typename Linestring>
+struct is_valid_linestring
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Linestring const& linestring,
+                             VisitPolicy& visitor)
+    {
+        if (boost::size(linestring) < 2)
+        {
+            return visitor.template apply<failure_few_points>();
+        }
+
+        std::size_t num_distinct = detail::num_distinct_consecutive_points
+            <
+                Linestring,
+                3u,
+                true,
+                not_equal_to<typename point_type<Linestring>::type>
+            >::apply(linestring);
+
+        if (num_distinct < 2u)
+        {
+            return
+                visitor.template apply<failure_wrong_topological_dimension>();
+        }
+
+        if (num_distinct == 2u)
+        {
+            return visitor.template apply<no_failure>();
+        }
+        return ! has_spikes<Linestring, closed>::apply(linestring, visitor);
+    }
+};
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A linestring is a curve.
+// A curve is 1-dimensional so it has to have at least two distinct
+// points.
+// A curve is simple if it does not pass through the same point twice,
+// with the possible exception of its two endpoints
+//
+// There is an option here as to whether spikes are allowed for linestrings; 
+// here we pass this as an additional template parameter: allow_spikes
+// If allow_spikes is set to true, spikes are allowed, false otherwise.
+// By default, spikes are disallowed
+//
+// Reference: OGC 06-103r4 (6.1.6.1)
+template <typename Linestring, bool AllowEmptyMultiGeometries>
+struct is_valid
+    <
+        Linestring, linestring_tag, AllowEmptyMultiGeometries
+    > : detail::is_valid::is_valid_linestring<Linestring>
+{};
+
+
+// A MultiLinestring is a MultiCurve
+// A MultiCurve is simple if all of its elements are simple and the
+// only intersections between any two elements occur at Points that
+// are on the boundaries of both elements.
+//
+// Reference: OGC 06-103r4 (6.1.8.1; Fig. 9)
+template <typename MultiLinestring, bool AllowEmptyMultiGeometries>
+class is_valid
+    <
+        MultiLinestring, multi_linestring_tag, AllowEmptyMultiGeometries
+    >
+{
+private:
+    template <typename VisitPolicy>
+    struct per_linestring
+    {
+        per_linestring(VisitPolicy& policy) : m_policy(policy) {}
+
+        template <typename Linestring>
+        inline bool apply(Linestring const& linestring) const
+        {
+            return detail::is_valid::is_valid_linestring
+                <
+                    Linestring
+                >::apply(linestring, m_policy);
+        }
+
+        VisitPolicy& m_policy;
+    };
+
+public:
+    template <typename VisitPolicy>
+    static inline bool apply(MultiLinestring const& multilinestring,
+                             VisitPolicy& visitor)
+    {
+        if (AllowEmptyMultiGeometries && boost::empty(multilinestring))
+        {
+            return visitor.template apply<no_failure>();
+        }
+
+        return detail::check_iterator_range
+            <
+                per_linestring<VisitPolicy>,
+                false // do not check for empty multilinestring (done above)
+            >::apply(boost::begin(multilinestring),
+                     boost::end(multilinestring),
+                     per_linestring<VisitPolicy>(visitor));
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,358 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_MULTIPOLYGON_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_MULTIPOLYGON_HPP
+
+#include <deque>
+#include <vector>
+
+#include <boost/iterator/filter_iterator.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/within.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/partition.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/is_acceptable_turn.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/polygon.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/debug_print_turns.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/debug_validity_phase.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+template <typename MultiPolygon, bool AllowEmptyMultiGeometries>
+class is_valid_multipolygon
+    : is_valid_polygon
+        <
+            typename boost::range_value<MultiPolygon>::type,
+            true // check only the validity of rings
+        >
+{
+private:
+    typedef is_valid_polygon
+        <
+            typename boost::range_value<MultiPolygon>::type,
+            true
+        > base;
+
+
+
+    template
+    <
+        typename PolygonIterator,
+        typename TurnIterator,
+        typename VisitPolicy
+    >
+    static inline
+    bool are_polygon_interiors_disjoint(PolygonIterator polygons_first,
+                                        PolygonIterator polygons_beyond,
+                                        TurnIterator turns_first,
+                                        TurnIterator turns_beyond,
+                                        VisitPolicy& visitor)
+    {
+        // collect all polygons that have turns
+        std::set<signed_index_type> multi_indices;
+        for (TurnIterator tit = turns_first; tit != turns_beyond; ++tit)
+        {
+            multi_indices.insert(tit->operations[0].seg_id.multi_index);
+            multi_indices.insert(tit->operations[1].seg_id.multi_index);
+        }
+
+        // put polygon iterators without turns in a vector
+        std::vector<PolygonIterator> polygon_iterators;
+        signed_index_type multi_index = 0;
+        for (PolygonIterator it = polygons_first; it != polygons_beyond;
+             ++it, ++multi_index)
+        {
+            if (multi_indices.find(multi_index) == multi_indices.end())
+            {
+                polygon_iterators.push_back(it);
+            }
+        }
+
+        typename base::item_visitor_type item_visitor;
+
+        geometry::partition
+            <
+                geometry::model::box<typename point_type<MultiPolygon>::type>,
+                typename base::expand_box,
+                typename base::overlaps_box
+            >::apply(polygon_iterators, item_visitor);
+
+        if (item_visitor.items_overlap)
+        {
+            return visitor.template apply<failure_intersecting_interiors>();
+        }
+        else
+        {
+            return visitor.template apply<no_failure>();
+        }
+    }
+
+
+
+    class has_multi_index
+    {
+    public:
+        has_multi_index(signed_index_type multi_index)
+            : m_multi_index(multi_index)
+        {}
+
+        template <typename Turn>
+        inline bool operator()(Turn const& turn) const
+        {
+            return turn.operations[0].seg_id.multi_index == m_multi_index
+                && turn.operations[1].seg_id.multi_index == m_multi_index;
+        }
+
+    private:
+        signed_index_type const m_multi_index;
+    };
+
+
+
+    template <typename Predicate>
+    struct has_property_per_polygon
+    {
+        template
+        <
+            typename PolygonIterator,
+            typename TurnIterator,
+            typename VisitPolicy
+        >
+        static inline bool apply(PolygonIterator polygons_first,
+                                 PolygonIterator polygons_beyond,
+                                 TurnIterator turns_first,
+                                 TurnIterator turns_beyond,
+                                 VisitPolicy& visitor)
+        {
+            signed_index_type multi_index = 0;
+            for (PolygonIterator it = polygons_first; it != polygons_beyond;
+                 ++it, ++multi_index)
+            {
+                has_multi_index index_predicate(multi_index);
+
+                typedef boost::filter_iterator
+                    <
+                        has_multi_index, TurnIterator
+                    > filtered_turn_iterator;
+
+                filtered_turn_iterator filtered_turns_first(index_predicate,
+                                                            turns_first,
+                                                            turns_beyond);
+
+                filtered_turn_iterator filtered_turns_beyond(index_predicate,
+                                                             turns_beyond,
+                                                             turns_beyond);
+
+                if (! Predicate::apply(*it,
+                                       filtered_turns_first,
+                                       filtered_turns_beyond,
+                                       visitor))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+    };
+
+
+
+    template
+    <
+        typename PolygonIterator,
+        typename TurnIterator,
+        typename VisitPolicy
+    >
+    static inline bool have_holes_inside(PolygonIterator polygons_first,
+                                         PolygonIterator polygons_beyond,
+                                         TurnIterator turns_first,
+                                         TurnIterator turns_beyond,
+                                         VisitPolicy& visitor)
+    {
+        return has_property_per_polygon
+            <
+                typename base::has_holes_inside
+            >::apply(polygons_first, polygons_beyond,
+                     turns_first, turns_beyond, visitor);
+    }
+
+
+
+    template
+    <
+        typename PolygonIterator,
+        typename TurnIterator,
+        typename VisitPolicy
+    >
+    static inline bool have_connected_interior(PolygonIterator polygons_first,
+                                               PolygonIterator polygons_beyond,
+                                               TurnIterator turns_first,
+                                               TurnIterator turns_beyond,
+                                               VisitPolicy& visitor)
+    {
+        return has_property_per_polygon
+            <
+                typename base::has_connected_interior
+            >::apply(polygons_first, polygons_beyond,
+                     turns_first, turns_beyond, visitor);
+    }
+
+
+    template <typename VisitPolicy>
+    struct per_polygon
+    {
+        per_polygon(VisitPolicy& policy) : m_policy(policy) {}
+
+        template <typename Polygon>
+        inline bool apply(Polygon const& polygon) const
+        {
+            return base::apply(polygon, m_policy);
+        }
+
+        VisitPolicy& m_policy;
+    };
+public:
+    template <typename VisitPolicy>
+    static inline bool apply(MultiPolygon const& multipolygon,
+                             VisitPolicy& visitor)
+    {
+        typedef debug_validity_phase<MultiPolygon> debug_phase;
+
+        if (AllowEmptyMultiGeometries && boost::empty(multipolygon))
+        {
+            return visitor.template apply<no_failure>();
+        }
+
+        // check validity of all polygons ring
+        debug_phase::apply(1);
+
+        if (! detail::check_iterator_range
+                  <
+                      per_polygon<VisitPolicy>,
+                      false // do not check for empty multipolygon (done above)
+                  >::apply(boost::begin(multipolygon),
+                           boost::end(multipolygon),
+                           per_polygon<VisitPolicy>(visitor)))
+        {
+            return false;
+        }
+
+
+        // compute turns and check if all are acceptable
+        debug_phase::apply(2);
+
+        typedef has_valid_self_turns<MultiPolygon> has_valid_turns;
+
+        std::deque<typename has_valid_turns::turn_type> turns;
+        bool has_invalid_turns =
+            ! has_valid_turns::apply(multipolygon, turns, visitor);
+        debug_print_turns(turns.begin(), turns.end());
+
+        if (has_invalid_turns)
+        {
+            return false;
+        }
+
+
+        // check if each polygon's interior rings are inside the
+        // exterior and not one inside the other
+        debug_phase::apply(3);
+
+        if (! have_holes_inside(boost::begin(multipolygon),
+                                boost::end(multipolygon),
+                                turns.begin(),
+                                turns.end(),
+                                visitor))
+        {
+            return false;
+        }
+
+
+        // check that each polygon's interior is connected
+        debug_phase::apply(4);
+
+        if (! have_connected_interior(boost::begin(multipolygon),
+                                      boost::end(multipolygon),
+                                      turns.begin(),
+                                      turns.end(),
+                                      visitor))
+        {
+            return false;
+        }
+
+
+        // check if polygon interiors are disjoint
+        debug_phase::apply(5);
+        return are_polygon_interiors_disjoint(boost::begin(multipolygon),
+                                              boost::end(multipolygon),
+                                              turns.begin(),
+                                              turns.end(),
+                                              visitor);
+    }
+};
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// Not clear what the definition is.
+// Right now we check that each element is simple (in fact valid), and
+// that the MultiPolygon is also valid.
+//
+// Reference (for validity of MultiPolygons): OGC 06-103r4 (6.1.14)
+template <typename MultiPolygon, bool AllowEmptyMultiGeometries>
+struct is_valid
+    <
+        MultiPolygon, multi_polygon_tag, AllowEmptyMultiGeometries
+    > : detail::is_valid::is_valid_multipolygon
+        <
+            MultiPolygon, AllowEmptyMultiGeometries
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_MULTIPOLYGON_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,76 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POINTLIKE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POINTLIKE_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+// A point is always simple
+template <typename Point>
+struct is_valid<Point, point_tag>
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Point const&, VisitPolicy& visitor)
+    {
+        return visitor.template apply<no_failure>();
+    }
+};
+
+
+
+// A MultiPoint is simple if no two Points in the MultiPoint are equal
+// (have identical coordinate values in X and Y)
+//
+// Reference: OGC 06-103r4 (6.1.5)
+template <typename MultiPoint, bool AllowEmptyMultiGeometries>
+struct is_valid<MultiPoint, multi_point_tag, AllowEmptyMultiGeometries>
+{
+    template <typename VisitPolicy>
+    static inline bool apply(MultiPoint const& multipoint,
+                             VisitPolicy& visitor)
+    {
+        if (AllowEmptyMultiGeometries || boost::size(multipoint) > 0)
+        {
+            // we allow empty multi-geometries, so an empty multipoint
+            // is considered valid
+            return visitor.template apply<no_failure>();
+        }
+        else
+        {
+            // we do not allow an empty multipoint
+            return visitor.template apply<failure_few_points>();
+        }
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POINTLIKE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,415 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POLYGON_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POLYGON_HPP
+
+#include <cstddef>
+
+#include <algorithm>
+#include <deque>
+#include <iterator>
+#include <set>
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+
+#include <boost/geometry/algorithms/covered_by.hpp>
+#include <boost/geometry/algorithms/disjoint.hpp>
+#include <boost/geometry/algorithms/expand.hpp>
+#include <boost/geometry/algorithms/num_interior_rings.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/within.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/partition.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/complement_graph.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/is_acceptable_turn.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/ring.hpp>
+
+#include <boost/geometry/algorithms/detail/is_valid/debug_print_turns.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/debug_validity_phase.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/debug_complement_graph.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+template <typename Polygon, bool CheckRingValidityOnly = false>
+class is_valid_polygon
+{
+protected:
+    typedef debug_validity_phase<Polygon> debug_phase;
+
+    template <typename VisitPolicy>
+    struct per_ring
+    {
+        per_ring(VisitPolicy& policy) : m_policy(policy) {}
+
+        template <typename Ring>
+        inline bool apply(Ring const& ring) const
+        {
+            return detail::is_valid::is_valid_ring
+                <
+                    Ring, false, true
+                >::apply(ring, m_policy);
+        }
+
+        VisitPolicy& m_policy;
+    };
+
+    template <typename InteriorRings, typename VisitPolicy>
+    static bool has_valid_interior_rings(InteriorRings const& interior_rings,
+                                         VisitPolicy& visitor)
+    {
+        return
+            detail::check_iterator_range
+                <
+                    per_ring<VisitPolicy>,
+                    true // allow for empty interior ring range
+                >::apply(boost::begin(interior_rings),
+                         boost::end(interior_rings),
+                         per_ring<VisitPolicy>(visitor));
+    }
+
+    struct has_valid_rings
+    {
+        template <typename VisitPolicy>
+        static inline bool apply(Polygon const& polygon, VisitPolicy& visitor)
+        {
+            typedef typename ring_type<Polygon>::type ring_type;
+
+            // check validity of exterior ring
+            debug_phase::apply(1);
+
+            if (! detail::is_valid::is_valid_ring
+                     <
+                         ring_type,
+                         false // do not check self intersections
+                     >::apply(exterior_ring(polygon), visitor))
+            {
+                return false;
+            }
+
+            // check validity of interior rings
+            debug_phase::apply(2);
+
+            return has_valid_interior_rings(geometry::interior_rings(polygon),
+                                            visitor);
+        }
+    };
+
+
+    // structs for partition -- start
+    struct expand_box
+    {
+        template <typename Box, typename Iterator>
+        static inline void apply(Box& total, Iterator const& it)
+        {
+            geometry::expand(total, geometry::return_envelope<Box>(*it));
+        }
+
+    };
+
+    struct overlaps_box
+    {
+        template <typename Box, typename Iterator>
+        static inline bool apply(Box const& box, Iterator const& it)
+        {
+            return ! geometry::disjoint(*it, box);
+        }
+    };
+
+
+    struct item_visitor_type
+    {
+        bool items_overlap;
+
+        item_visitor_type() : items_overlap(false) {}
+
+        template <typename Item1, typename Item2>
+        inline void apply(Item1 const& item1, Item2 const& item2)
+        {
+            if (! items_overlap
+                && (geometry::within(*points_begin(*item1), *item2)
+                    || geometry::within(*points_begin(*item2), *item1))
+                )
+            {
+                items_overlap = true;
+            }
+        }
+    };
+    // structs for partition -- end
+
+
+    template
+    <
+        typename RingIterator,
+        typename ExteriorRing,
+        typename TurnIterator,
+        typename VisitPolicy
+    >
+    static inline bool are_holes_inside(RingIterator rings_first,
+                                        RingIterator rings_beyond,
+                                        ExteriorRing const& exterior_ring,
+                                        TurnIterator turns_first,
+                                        TurnIterator turns_beyond,
+                                        VisitPolicy& visitor)
+    {
+        // collect the interior ring indices that have turns with the
+        // exterior ring
+        std::set<signed_index_type> ring_indices;
+        for (TurnIterator tit = turns_first; tit != turns_beyond; ++tit)
+        {
+            if (tit->operations[0].seg_id.ring_index == -1)
+            {
+                BOOST_ASSERT(tit->operations[1].seg_id.ring_index != -1);
+                ring_indices.insert(tit->operations[1].seg_id.ring_index);
+            }
+            else if (tit->operations[1].seg_id.ring_index == -1)
+            {
+                BOOST_ASSERT(tit->operations[0].seg_id.ring_index != -1);
+                ring_indices.insert(tit->operations[0].seg_id.ring_index);
+            }
+        }
+
+        signed_index_type ring_index = 0;
+        for (RingIterator it = rings_first; it != rings_beyond;
+             ++it, ++ring_index)
+        {
+            // do not examine interior rings that have turns with the
+            // exterior ring
+            if (ring_indices.find(ring_index) == ring_indices.end()
+                && ! geometry::covered_by(range::front(*it), exterior_ring))
+            {
+                return visitor.template apply<failure_interior_rings_outside>();
+            }
+        }
+
+        // collect all rings (exterior and/or interior) that have turns
+        for (TurnIterator tit = turns_first; tit != turns_beyond; ++tit)
+        {
+            ring_indices.insert(tit->operations[0].seg_id.ring_index);
+            ring_indices.insert(tit->operations[1].seg_id.ring_index);
+        }
+
+        // put iterators for interior rings without turns in a vector
+        std::vector<RingIterator> ring_iterators;
+        ring_index = 0;
+        for (RingIterator it = rings_first; it != rings_beyond;
+             ++it, ++ring_index)
+        {
+            if (ring_indices.find(ring_index) == ring_indices.end())
+            {
+                ring_iterators.push_back(it);
+            }
+        }
+
+        // call partition to check is interior rings are disjoint from
+        // each other
+        item_visitor_type item_visitor;
+
+        geometry::partition
+            <
+                geometry::model::box<typename point_type<Polygon>::type>,
+                expand_box,
+                overlaps_box
+            >::apply(ring_iterators, item_visitor);
+
+        if (item_visitor.items_overlap)
+        {
+            return visitor.template apply<failure_nested_interior_rings>();
+        }
+        else
+        {
+            return visitor.template apply<no_failure>();
+        }
+    }
+
+    template
+    <
+        typename InteriorRings,
+        typename ExteriorRing,
+        typename TurnIterator,
+        typename VisitPolicy
+    >
+    static inline bool are_holes_inside(InteriorRings const& interior_rings,
+                                        ExteriorRing const& exterior_ring,
+                                        TurnIterator first,
+                                        TurnIterator beyond,
+                                        VisitPolicy& visitor)
+    {
+        return are_holes_inside(boost::begin(interior_rings),
+                                boost::end(interior_rings),
+                                exterior_ring,
+                                first,
+                                beyond,
+                                visitor);
+    }
+
+    struct has_holes_inside
+    {    
+        template <typename TurnIterator, typename VisitPolicy>
+        static inline bool apply(Polygon const& polygon,
+                                 TurnIterator first,
+                                 TurnIterator beyond,
+                                 VisitPolicy& visitor)
+        {
+            return are_holes_inside(geometry::interior_rings(polygon),
+                                    geometry::exterior_ring(polygon),
+                                    first,
+                                    beyond,
+                                    visitor);
+        }
+    };
+
+
+
+
+    struct has_connected_interior
+    {
+        template <typename TurnIterator, typename VisitPolicy>
+        static inline bool apply(Polygon const& polygon,
+                                 TurnIterator first,
+                                 TurnIterator beyond,
+                                 VisitPolicy& visitor)
+        {
+            typedef typename std::iterator_traits
+                <
+                    TurnIterator
+                >::value_type turn_type;
+            typedef complement_graph<typename turn_type::point_type> graph;
+
+            graph g(geometry::num_interior_rings(polygon) + 1);
+            for (TurnIterator tit = first; tit != beyond; ++tit)
+            {
+                typename graph::vertex_handle v1 = g.add_vertex
+                    ( tit->operations[0].seg_id.ring_index + 1 );
+                typename graph::vertex_handle v2 = g.add_vertex
+                    ( tit->operations[1].seg_id.ring_index + 1 );
+                typename graph::vertex_handle vip = g.add_vertex(tit->point);
+
+                g.add_edge(v1, vip);
+                g.add_edge(v2, vip);
+            }
+
+            debug_print_complement_graph(std::cout, g);
+
+            if (g.has_cycles())
+            {
+                return visitor.template apply<failure_disconnected_interior>();
+            }
+            else
+            {
+                return visitor.template apply<no_failure>();
+            }
+        }
+    };
+
+public:
+    template <typename VisitPolicy>
+    static inline bool apply(Polygon const& polygon, VisitPolicy& visitor)
+    {
+        if (! has_valid_rings::apply(polygon, visitor))
+        {
+            return false;
+        }
+
+        if (BOOST_GEOMETRY_CONDITION(CheckRingValidityOnly))
+        {
+            return true;
+        }
+
+        // compute turns and check if all are acceptable
+        debug_phase::apply(3);
+
+        typedef has_valid_self_turns<Polygon> has_valid_turns;
+
+        std::deque<typename has_valid_turns::turn_type> turns;
+        bool has_invalid_turns
+            = ! has_valid_turns::apply(polygon, turns, visitor);
+        debug_print_turns(turns.begin(), turns.end());
+
+        if (has_invalid_turns)
+        {
+            return false;
+        }
+
+        // check if all interior rings are inside the exterior ring
+        debug_phase::apply(4);
+
+        if (! has_holes_inside::apply(polygon,
+                                      turns.begin(), turns.end(),
+                                      visitor))
+        {
+            return false;
+        }
+
+        // check whether the interior of the polygon is a connected set
+        debug_phase::apply(5);
+
+        return has_connected_interior::apply(polygon,
+                                             turns.begin(),
+                                             turns.end(),
+                                             visitor);
+    }
+};
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A Polygon is always a simple geometric object provided that it is valid.
+//
+// Reference (for validity of Polygons): OGC 06-103r4 (6.1.11.1)
+template <typename Polygon, bool AllowEmptyMultiGeometries>
+struct is_valid
+    <
+        Polygon, polygon_tag, AllowEmptyMultiGeometries
+    > : detail::is_valid::is_valid_polygon<Polygon>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POLYGON_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/ring.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,219 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_RING_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_RING_HPP
+
+#include <deque>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/point_order.hpp>
+
+#include <boost/geometry/util/order_as_direction.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/equals.hpp>
+
+#include <boost/geometry/views/closeable_view.hpp>
+
+#include <boost/geometry/algorithms/area.hpp>
+#include <boost/geometry/algorithms/intersects.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp>
+
+#include <boost/geometry/strategies/area.hpp>
+
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+#include <boost/geometry/io/dsv/write.hpp>
+#endif
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+
+// struct to check whether a ring is topologically closed
+template <typename Ring, closure_selector Closure /* open */>
+struct is_topologically_closed
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Ring const&, VisitPolicy& visitor)
+    {
+        return visitor.template apply<no_failure>();
+    }
+};
+
+template <typename Ring>
+struct is_topologically_closed<Ring, closed>
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Ring const& ring, VisitPolicy& visitor)
+    {
+        if (geometry::equals(range::front(ring), range::back(ring)))
+        {
+            return visitor.template apply<no_failure>();
+        }
+        else
+        {
+            return visitor.template apply<failure_not_closed>();
+        }
+    }
+};
+
+
+
+template <typename ResultType, bool IsInteriorRing /* false */>
+struct ring_area_predicate
+{
+    typedef std::greater<ResultType> type;
+};
+
+template <typename ResultType>
+struct ring_area_predicate<ResultType, true>
+{
+    typedef std::less<ResultType> type;
+};
+
+
+
+template <typename Ring, bool IsInteriorRing>
+struct is_properly_oriented
+{
+    typedef typename point_type<Ring>::type point_type;
+
+    typedef typename strategy::area::services::default_strategy
+        <
+            typename cs_tag<point_type>::type,
+            point_type
+        >::type strategy_type;
+
+    typedef detail::area::ring_area
+        <
+            order_as_direction<geometry::point_order<Ring>::value>::value,
+            geometry::closure<Ring>::value
+        > ring_area_type;
+
+    typedef typename default_area_result<Ring>::type area_result_type;
+
+    template <typename VisitPolicy>
+    static inline bool apply(Ring const& ring, VisitPolicy& visitor)
+    {
+        typename ring_area_predicate
+            <
+                area_result_type, IsInteriorRing
+            >::type predicate;
+
+        // Check area
+        area_result_type const zero = area_result_type();
+        if (predicate(ring_area_type::apply(ring, strategy_type()), zero))
+        {
+            return visitor.template apply<no_failure>();
+        }
+        else
+        {
+            return visitor.template apply<failure_wrong_orientation>();
+        }
+    }
+};
+
+
+
+template
+<
+    typename Ring,
+    bool CheckSelfIntersections = true,
+    bool IsInteriorRing = false
+>
+struct is_valid_ring
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Ring const& ring, VisitPolicy& visitor)
+    {
+        // return invalid if any of the following condition holds:
+        // (a) the ring's size is below the minimal one
+        // (b) the ring consists of at most two distinct points
+        // (c) the ring is not topologically closed
+        // (d) the ring has spikes
+        // (e) the ring has duplicate points (if AllowDuplicates is false)
+        // (f) the boundary of the ring has self-intersections
+        // (g) the order of the points is inconsistent with the defined order
+        //
+        // Note: no need to check if the area is zero. If this is the
+        // case, then the ring must have at least two spikes, which is
+        // checked by condition (c).
+
+        closure_selector const closure = geometry::closure<Ring>::value;
+        typedef typename closeable_view<Ring const, closure>::type view_type;
+
+        if (boost::size(ring)
+            < core_detail::closure::minimum_ring_size<closure>::value)
+        {
+            return visitor.template apply<failure_few_points>();
+        }
+
+        view_type const view(ring);
+        if (detail::num_distinct_consecutive_points
+                <
+                    view_type, 4u, true,
+                    not_equal_to<typename point_type<Ring>::type>
+                >::apply(view)
+            < 4u)
+        {
+            return
+                visitor.template apply<failure_wrong_topological_dimension>();
+        }
+
+        return
+            is_topologically_closed<Ring, closure>::apply(ring, visitor)
+            && ! has_duplicates<Ring, closure>::apply(ring, visitor)
+            && ! has_spikes<Ring, closure>::apply(ring, visitor)
+            && (! CheckSelfIntersections
+                || has_valid_self_turns<Ring>::apply(ring, visitor))
+            && is_properly_oriented<Ring, IsInteriorRing>::apply(ring, visitor);
+    }
+};
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+// A Ring is a Polygon with exterior boundary only.
+// The Ring's boundary must be a LinearRing (see OGC 06-103-r4,
+// 6.1.7.1, for the definition of LinearRing)
+//
+// Reference (for polygon validity): OGC 06-103r4 (6.1.11.1)
+template <typename Ring, bool AllowEmptyMultiGeometries>
+struct is_valid
+    <
+        Ring, ring_tag, AllowEmptyMultiGeometries
+    > : detail::is_valid::is_valid_ring<Ring>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_RING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/is_valid/segment.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,71 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_SEGMENT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_SEGMENT_HPP
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/algorithms/equals.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+
+#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// A segment is a curve.
+// A curve is simple if it does not pass through the same point twice,
+// with the possible exception of its two endpoints
+// A curve is 1-dimensional, hence we have to check is the two
+// endpoints of the segment coincide, since in this case it is
+// 0-dimensional.
+//
+// Reference: OGC 06-103r4 (6.1.6.1)
+template <typename Segment>
+struct is_valid<Segment, segment_tag>
+{
+    template <typename VisitPolicy>
+    static inline bool apply(Segment const& segment, VisitPolicy& visitor)
+    {
+        typename point_type<Segment>::type p[2];
+        detail::assign_point_from_index<0>(segment, p[0]);
+        detail::assign_point_from_index<1>(segment, p[1]);
+
+        if(! geometry::equals(p[0], p[1]))
+        {
+            return visitor.template apply<no_failure>();
+        }
+        else
+        {
+            return
+                visitor.template apply<failure_wrong_topological_dimension>();
+        }
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_SEGMENT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_modify.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,53 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_HPP
+
+
+#include <boost/range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+
+template <typename MultiGeometry, typename Policy>
+struct multi_modify
+{
+    static inline void apply(MultiGeometry& multi)
+    {
+        typedef typename boost::range_iterator<MultiGeometry>::type iterator_type;
+        for (iterator_type it = boost::begin(multi);
+            it != boost::end(multi);
+            ++it)
+        {
+            Policy::apply(*it);
+        }
+    }
+};
+
+
+} // namespace detail
+#endif
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_modify_with_predicate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_WITH_PREDICATE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_WITH_PREDICATE_HPP
+
+
+#include <boost/range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename MultiGeometry, typename Predicate, typename Policy>
+struct multi_modify_with_predicate
+{
+    static inline void apply(MultiGeometry& multi, Predicate const& predicate)
+    {
+        typedef typename boost::range_iterator<MultiGeometry>::type iterator_type;
+        for (iterator_type it = boost::begin(multi);
+            it != boost::end(multi);
+            ++it)
+        {
+            Policy::apply(*it, predicate);
+        }
+    }
+};
+
+
+} // namespace detail
+#endif
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_MODIFY_WITH_PREDICATE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/multi_sum.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_SUM_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_SUM_HPP
+
+#include <boost/range.hpp>
+
+
+namespace boost { namespace geometry
+{
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+struct multi_sum
+{
+    template <typename ReturnType, typename Policy, typename MultiGeometry, typename Strategy>
+    static inline ReturnType apply(MultiGeometry const& geometry, Strategy const& strategy)
+    {
+        ReturnType sum = ReturnType();
+        for (typename boost::range_iterator
+                <
+                    MultiGeometry const
+                >::type it = boost::begin(geometry);
+            it != boost::end(geometry);
+            ++it)
+        {
+            sum += Policy::apply(*it, strategy);
+        }
+        return sum;
+    }
+};
+
+
+} // namespace detail
+#endif
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_MULTI_SUM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,93 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
+
+#include <cstddef>
+
+#include <algorithm>
+
+#include <boost/range.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+
+// returns the number of distinct values in the range;
+// return values are 0u through MaximumNumber, where MaximumNumber
+// corresponds to MaximumNumber or more distinct values
+//
+// FUTURE: take into account topologically closed ranges;
+//         add appropriate template parameter(s) to control whether
+//         the closing point for topologically closed ranges is to be
+//         accounted for separately or not
+template
+<
+    typename Range,
+    std::size_t MaximumNumber,
+    bool AllowDuplicates /* true */,
+    typename NotEqualTo
+>
+struct num_distinct_consecutive_points
+{
+    static inline std::size_t apply(Range const& range)
+    {
+        typedef typename boost::range_iterator<Range const>::type iterator;
+
+        std::size_t const size = boost::size(range);
+
+        if ( size < 2u )
+        {
+            return (size < MaximumNumber) ? size : MaximumNumber;
+        }
+
+        iterator current = boost::begin(range);
+        std::size_t counter(0);
+        do
+        {
+            ++counter;
+            iterator next = std::find_if(current,
+                                         boost::end(range),
+                                         NotEqualTo(*current));
+            current = next;
+        }
+        while ( current != boost::end(range) && counter <= MaximumNumber );
+
+        return counter;
+    }
+};
+
+
+template <typename Range, std::size_t MaximumNumber, typename NotEqualTo>
+struct num_distinct_consecutive_points<Range, MaximumNumber, false, NotEqualTo>
+{
+    static inline std::size_t apply(Range const& range)
+    {
+        std::size_t const size = boost::size(range);
+        return (size < MaximumNumber) ? size : MaximumNumber;
+    }
+};
+
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/calculate_distance_policy.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CALCULATE_DISTANCE_POLICY_HPP
-#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CALCULATE_DISTANCE_POLICY_HPP
-
-
-#include <boost/geometry/algorithms/comparable_distance.hpp>
-
-
-namespace boost { namespace geometry
-{
-
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace overlay
-{
-
-
-/*!
-    \brief Policy calculating distance
-    \details get_turn_info has an optional policy to get some
-        extra information.
-        This policy calculates the distance (using default distance strategy)
- */
-struct calculate_distance_policy
-{
-    static bool const include_no_turn = false;
-    static bool const include_degenerate = false;
-    static bool const include_opposite = false;
-
-    template 
-    <
-        typename Info,
-        typename Point1,
-        typename Point2,
-        typename IntersectionInfo,
-        typename DirInfo
-    >
-    static inline void apply(Info& info, Point1 const& p1, Point2 const& p2,
-                IntersectionInfo const&, DirInfo const&)
-    {
-        info.operations[0].enriched.distance
-                    = geometry::comparable_distance(info.point, p1);
-        info.operations[1].enriched.distance
-                    = geometry::comparable_distance(info.point, p2);
-    }
-
-};
-
-
-}} // namespace detail::overlay
-#endif //DOXYGEN_NO_DETAIL
-
-
-}} // namespace boost::geometry
-
-
-#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CALCULATE_DISTANCE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/do_reverse.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_DO_REVERSE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_DO_REVERSE_HPP
+
+#include <boost/geometry/core/point_order.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+// Metafunction helper for intersection and union
+template <order_selector Selector, bool Reverse = false>
+struct do_reverse {};
+
+template <>
+struct do_reverse<clockwise, false> : boost::false_type {};
+
+template <>
+struct do_reverse<clockwise, true> : boost::true_type {};
+
+template <>
+struct do_reverse<counterclockwise, false> : boost::true_type {};
+
+template <>
+struct do_reverse<counterclockwise, true> : boost::false_type {};
+
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_DO_REVERSE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,560 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_FOLLOW_LINEAR_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_FOLLOW_LINEAR_LINEAR_HPP
+
+#include <cstddef>
+#include <algorithm>
+#include <iterator>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/copy_segments.hpp>
+#include <boost/geometry/algorithms/detail/overlay/follow.hpp>
+#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
+#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+#include <boost/geometry/algorithms/detail/turns/debug_turn.hpp>
+
+#include <boost/geometry/algorithms/convert.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
+class inconsistent_turns_exception : public geometry::exception
+{
+public:
+
+    inline inconsistent_turns_exception() {}
+
+    virtual ~inconsistent_turns_exception() throw()
+    {}
+
+    virtual char const* what() const throw()
+    {
+        return "Boost.Geometry Inconsistent Turns exception";
+    }
+};
+#endif
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+namespace following { namespace linear
+{
+
+
+
+
+// follower for linear/linear geometries set operations
+
+template <typename Turn, typename Operation>
+static inline bool is_entering(Turn const& turn,
+                               Operation const& operation)
+{
+    if ( turn.method != method_touch && turn.method != method_touch_interior )
+    {
+        return false;
+    }
+    return operation.operation == operation_intersection;
+}
+
+
+
+template <typename Turn, typename Operation>
+static inline bool is_staying_inside(Turn const& turn,
+                                     Operation const& operation, 
+                                     bool entered)
+{
+    if ( !entered )
+    {
+        return false;
+    }
+
+    if ( turn.method != method_equal && turn.method != method_collinear )
+    {
+        return false;
+    }
+    return operation.operation == operation_continue;
+}
+
+
+
+template <typename Turn, typename Operation>
+static inline bool is_leaving(Turn const& turn,
+                              Operation const& operation,
+                              bool entered)
+{
+    if ( !entered )
+    {
+        return false;
+    }
+
+    if ( turn.method != method_touch
+         && turn.method != method_touch_interior
+         && turn.method != method_equal
+         && turn.method != method_collinear )
+    {
+        return false;
+    }
+
+    if ( operation.operation == operation_blocked )
+    {
+        return true;
+    }
+
+    if ( operation.operation != operation_union )
+    {
+        return false;
+    }
+
+    return operation.is_collinear;
+}
+
+
+
+template <typename Turn, typename Operation>
+static inline bool is_isolated_point(Turn const& turn,
+                                     Operation const& operation,
+                                     bool entered)
+{
+    if ( entered )
+    {
+        return false;
+    }
+
+    if ( turn.method == method_none )
+    {
+        BOOST_ASSERT( operation.operation == operation_continue );
+        return true;
+    }
+
+    if ( turn.method == method_crosses )
+    {
+        return true;
+    }
+
+    if ( turn.method != method_touch && turn.method != method_touch_interior )
+    {
+        return false;
+    }
+
+    if ( operation.operation == operation_blocked )
+    {
+        return true;
+    }
+
+    if ( operation.operation != operation_union )
+    {
+        return false;
+    }
+
+    return !operation.is_collinear;
+}
+
+
+
+
+
+
+
+
+
+template
+<
+    typename LinestringOut,
+    typename Linestring,
+    typename Linear,
+    overlay_type OverlayType,
+    bool FollowIsolatedPoints,
+    bool FollowContinueTurns
+>
+class follow_linestring_linear_linestring
+{
+protected:
+    // allow spikes (false indicates: do not remove spikes)
+    typedef following::action_selector<OverlayType, false> action;
+
+    template
+    <
+        typename TurnIterator,
+        typename TurnOperationIterator,
+        typename SegmentIdentifier,
+        typename OutputIterator
+    >
+    static inline OutputIterator
+    process_turn(TurnIterator it,
+                 TurnOperationIterator op_it,
+                 bool& entered,
+                 std::size_t& enter_count,
+                 Linestring const& linestring,
+                 LinestringOut& current_piece,
+                 SegmentIdentifier& current_segment_id,
+                 OutputIterator oit)
+    {
+        // We don't rescale linear/linear
+        detail::no_rescale_policy robust_policy;
+
+        if ( is_entering(*it, *op_it) )
+        {
+            detail::turns::debug_turn(*it, *op_it, "-> Entering");
+
+            entered = true;
+            if ( enter_count == 0 )
+            {
+                action::enter(current_piece, linestring,
+                              current_segment_id,
+                              op_it->seg_id.segment_index,
+                              it->point, *op_it, robust_policy, oit);
+            }
+            ++enter_count;
+        }
+        else if ( is_leaving(*it, *op_it, entered) )
+        {
+            detail::turns::debug_turn(*it, *op_it, "-> Leaving");
+
+            --enter_count;
+            if ( enter_count == 0 )
+            {
+                entered = false;
+                action::leave(current_piece, linestring,
+                              current_segment_id,
+                              op_it->seg_id.segment_index,
+                              it->point, *op_it, robust_policy, oit);
+            }
+        }
+        else if ( FollowIsolatedPoints
+                  && is_isolated_point(*it, *op_it, entered) )
+        {
+            detail::turns::debug_turn(*it, *op_it, "-> Isolated point");
+
+            action::isolated_point(current_piece, linestring,
+                                   current_segment_id,
+                                   op_it->seg_id.segment_index,
+                                   it->point, *op_it, oit);
+        }
+        else if ( FollowContinueTurns
+                  && is_staying_inside(*it, *op_it, entered) )
+        {
+            detail::turns::debug_turn(*it, *op_it, "-> Staying inside");
+
+            entered = true;
+        }
+        return oit;
+    }
+
+    template
+    <
+        typename SegmentIdentifier,
+        typename OutputIterator
+    >
+    static inline OutputIterator
+    process_end(bool entered,
+                Linestring const& linestring,
+                SegmentIdentifier const& current_segment_id,
+                LinestringOut& current_piece,
+                OutputIterator oit)
+    {
+        if ( action::is_entered(entered) )
+        {
+            // We don't rescale linear/linear
+            detail::no_rescale_policy robust_policy;
+
+            detail::copy_segments::copy_segments_linestring
+                <
+                    false, false // do not reverse; do not remove spikes
+                >::apply(linestring,
+                         current_segment_id,
+                         static_cast<signed_index_type>(boost::size(linestring) - 1),
+                         robust_policy,
+                         current_piece);
+        }
+
+        // Output the last one, if applicable
+        if (::boost::size(current_piece) > 1)
+        {
+            *oit++ = current_piece;
+        }
+
+        return oit;
+    }
+
+public:
+    template <typename TurnIterator, typename OutputIterator>
+    static inline OutputIterator
+    apply(Linestring const& linestring, Linear const&,
+          TurnIterator first, TurnIterator beyond,
+          OutputIterator oit)
+    {
+        // Iterate through all intersection points (they are
+        // ordered along the each line)
+
+        LinestringOut current_piece;
+        geometry::segment_identifier current_segment_id(0, -1, -1, -1);
+
+        bool entered = false;
+        std::size_t enter_count = 0;
+
+        for (TurnIterator it = first; it != beyond; ++it)
+        {
+            oit = process_turn(it, boost::begin(it->operations),
+                               entered, enter_count, 
+                               linestring,
+                               current_piece, current_segment_id,
+                               oit);
+        }
+
+#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
+        if (enter_count != 0)
+        {
+            throw inconsistent_turns_exception();
+        }
+#else
+        BOOST_ASSERT(enter_count == 0);
+#endif
+
+        return process_end(entered, linestring,
+                           current_segment_id, current_piece,
+                           oit);
+    }
+};
+
+
+
+
+template
+<
+    typename LinestringOut,
+    typename MultiLinestring,
+    typename Linear,
+    overlay_type OverlayType,
+    bool FollowIsolatedPoints,
+    bool FollowContinueTurns
+>
+class follow_multilinestring_linear_linestring
+    : follow_linestring_linear_linestring
+        <
+            LinestringOut,
+            typename boost::range_value<MultiLinestring>::type,
+            Linear,
+            OverlayType,
+            FollowIsolatedPoints,
+            FollowContinueTurns
+        >
+{
+protected:
+    typedef typename boost::range_value<MultiLinestring>::type Linestring;
+
+    typedef follow_linestring_linear_linestring
+        <
+            LinestringOut, Linestring, Linear,
+            OverlayType, FollowIsolatedPoints, FollowContinueTurns
+        > Base;
+
+    typedef following::action_selector<OverlayType> action;
+
+    typedef typename boost::range_iterator
+        <
+            MultiLinestring const
+        >::type linestring_iterator;
+
+
+    template <typename OutputIt, overlay_type OT>
+    struct copy_linestrings_in_range
+    {
+        static inline OutputIt
+        apply(linestring_iterator, linestring_iterator, OutputIt oit)
+        {
+            return oit;
+        }
+    };
+
+    template <typename OutputIt>
+    struct copy_linestrings_in_range<OutputIt, overlay_difference>
+    {
+        static inline OutputIt
+        apply(linestring_iterator first, linestring_iterator beyond,
+              OutputIt oit)
+        {
+            for (linestring_iterator ls_it = first; ls_it != beyond; ++ls_it)
+            {
+                LinestringOut line_out;
+                geometry::convert(*ls_it, line_out);
+                *oit++ = line_out;
+            }
+            return oit;
+        }
+    };
+
+    template <typename TurnIterator>
+    static inline signed_index_type get_multi_index(TurnIterator it)
+    {
+        return boost::begin(it->operations)->seg_id.multi_index;
+    }
+
+    class has_other_multi_id
+    {
+    private:
+        signed_index_type m_multi_id;
+
+    public:
+        has_other_multi_id(signed_index_type multi_id)
+            : m_multi_id(multi_id) {}
+
+        template <typename Turn>
+        bool operator()(Turn const& turn) const
+        {
+            return boost::begin(turn.operations)->seg_id.multi_index
+                != m_multi_id;
+        }
+    };
+
+public:
+    template <typename TurnIterator, typename OutputIterator>
+    static inline OutputIterator
+    apply(MultiLinestring const& multilinestring, Linear const& linear,
+          TurnIterator first, TurnIterator beyond,
+          OutputIterator oit)
+    {
+        BOOST_ASSERT( first != beyond );
+
+        typedef copy_linestrings_in_range
+            <
+                OutputIterator, OverlayType
+            > copy_linestrings;
+
+        linestring_iterator ls_first = boost::begin(multilinestring);
+        linestring_iterator ls_beyond = boost::end(multilinestring);
+
+        // Iterate through all intersection points (they are
+        // ordered along the each linestring)
+
+        signed_index_type current_multi_id = get_multi_index(first);
+
+        oit = copy_linestrings::apply(ls_first,
+                                      ls_first + current_multi_id,
+                                      oit);
+
+        TurnIterator per_ls_next = first;
+        do {
+            TurnIterator per_ls_current = per_ls_next;
+
+            // find turn with different multi-index
+            per_ls_next = std::find_if(per_ls_current, beyond,
+                                       has_other_multi_id(current_multi_id));
+
+            oit = Base::apply(*(ls_first + current_multi_id),
+                              linear, per_ls_current, per_ls_next, oit);
+
+            signed_index_type next_multi_id(-1);
+            linestring_iterator ls_next = ls_beyond;
+            if ( per_ls_next != beyond )
+            {
+                next_multi_id = get_multi_index(per_ls_next);
+                ls_next = ls_first + next_multi_id;
+            }
+            oit = copy_linestrings::apply(ls_first + current_multi_id + 1,
+                                          ls_next,
+                                          oit);
+
+            current_multi_id = next_multi_id;
+        }
+        while ( per_ls_next != beyond );
+
+        return oit;
+    }
+};
+
+
+
+
+
+
+template
+<
+    typename LinestringOut,
+    typename Geometry1,
+    typename Geometry2,
+    overlay_type OverlayType,
+    bool FollowIsolatedPoints,
+    bool FollowContinueTurns,
+    typename TagOut = typename tag<LinestringOut>::type,
+    typename TagIn1 = typename tag<Geometry1>::type
+>
+struct follow
+    : not_implemented<LinestringOut, Geometry1>
+{};
+
+
+
+template
+<
+    typename LinestringOut,
+    typename Linestring,
+    typename Linear,
+    overlay_type OverlayType,
+    bool FollowIsolatedPoints,
+    bool FollowContinueTurns
+>
+struct follow
+    <
+        LinestringOut, Linestring, Linear,
+        OverlayType, FollowIsolatedPoints, FollowContinueTurns,
+        linestring_tag, linestring_tag
+    > : follow_linestring_linear_linestring
+        <
+            LinestringOut, Linestring, Linear,
+            OverlayType, FollowIsolatedPoints, FollowContinueTurns
+        >
+{};
+
+
+template
+<
+    typename LinestringOut,
+    typename MultiLinestring,
+    typename Linear,
+    overlay_type OverlayType,
+    bool FollowIsolatedPoints,
+    bool FollowContinueTurns
+>
+struct follow
+    <
+        LinestringOut, MultiLinestring, Linear,
+        OverlayType, FollowIsolatedPoints, FollowContinueTurns,
+        linestring_tag, multi_linestring_tag
+    > : follow_multilinestring_linear_linestring
+        <
+            LinestringOut, MultiLinestring, Linear,
+            OverlayType, FollowIsolatedPoints, FollowContinueTurns
+        >
+{};
+
+
+
+}} // namespace following::linear
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_FOLLOW_LINEAR_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_for_endpoint.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,659 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013-2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_FOR_ENDPOINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_FOR_ENDPOINT_HPP
+
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay {
+
+// SEGMENT_INTERSECTION RESULT
+
+//                   C  H0  H1  A0  A1   O              IP1 IP2
+
+// D0 and D1 == 0
+
+// |-------->        2   0   0   0   0   F              i/i x/x
+// |-------->
+//
+// |-------->        2   0   0   0   0   T              i/x x/i
+// <--------|
+//
+// |----->           1   0   0   0   0   T              x/x
+//       <-----|
+//
+
+// |--------->       2   0   0   0   1   T              i/x x/i
+//      <----|
+//
+// |--------->       2   0   0   0   0   F              i/i x/x
+//      |---->
+//
+// |--------->       2   0   0  -1   1   F              i/i u/x
+// |---->
+//
+// |--------->       2   0   0  -1   0   T              i/x u/i
+// <----|
+
+// |------->         2   0   0   1  -1   F   and        i/i x/u
+//     |------->     2   0   0  -1   1   F   symetric   i/i u/x
+// |------->
+//
+//     |------->     2   0   0  -1  -1   T              i/u u/i
+// <-------|
+//
+// |------->         2   0   0   1   1   T              i/x x/i
+//     <-------|
+//
+// |-------->        2   0   0  -1   1   F              i/i u/x
+//   |---->
+//
+// |-------->        2   0   0  -1   1   T              i/x u/i
+//   <----|
+
+//       |----->     1  -1  -1  -1  -1   T              u/u
+// <-----|
+//
+//       |----->     1  -1   0  -1   0   F   and        u/x
+// |----->           1   0  -1   0  -1   F   symetric   x/u
+//       |----->
+
+// D0 or D1 != 0
+
+//          ^
+//          |
+//          +        1  -1   1  -1   1   F   and        u/x  (P is vertical)
+// |-------->        1   1  -1   1  -1   F   symetric   x/u  (P is horizontal)
+// ^
+// |
+// +
+//
+//          +
+//          |
+//          v
+// |-------->        1   1   1   1   1   F              x/x  (P is vertical)
+//
+// ^
+// |
+// +
+// |-------->        1  -1  -1  -1  -1   F              u/u  (P is vertical)
+//
+//      ^
+//      |
+//      +
+// |-------->        1   0  -1   0  -1   F              u/u  (P is vertical)
+//
+//      +
+//      |
+//      v
+// |-------->        1   0   1   0   1   F              u/x  (P is vertical)
+//
+
+class linear_intersections
+{
+public:
+    template <typename Point1, typename Point2, typename IntersectionResult>
+    linear_intersections(Point1 const& pi,
+                         Point2 const& qi,
+                         IntersectionResult const& result,
+                         bool is_p_last, bool is_q_last)
+    {
+        int arrival_a = result.template get<1>().arrival[0];
+        int arrival_b = result.template get<1>().arrival[1];
+        bool same_dirs = result.template get<1>().dir_a == 0
+                      && result.template get<1>().dir_b == 0;
+
+        if ( same_dirs )
+        {
+            if ( result.template get<0>().count == 2 )
+            {
+                if ( ! result.template get<1>().opposite )
+                {
+                    ips[0].p_operation = operation_intersection;
+                    ips[0].q_operation = operation_intersection;
+                    ips[1].p_operation = union_or_blocked_same_dirs(arrival_a, is_p_last);
+                    ips[1].q_operation = union_or_blocked_same_dirs(arrival_b, is_q_last);
+
+                    ips[0].is_pi
+                        = equals::equals_point_point(
+                            pi, result.template get<0>().intersections[0]);
+                    ips[0].is_qi
+                        = equals::equals_point_point(
+                            qi, result.template get<0>().intersections[0]);
+                    ips[1].is_pj = arrival_a != -1;
+                    ips[1].is_qj = arrival_b != -1;
+                }
+                else
+                {
+                    ips[0].p_operation = operation_intersection;
+                    ips[0].q_operation = union_or_blocked_same_dirs(arrival_b, is_q_last);
+                    ips[1].p_operation = union_or_blocked_same_dirs(arrival_a, is_p_last);
+                    ips[1].q_operation = operation_intersection;
+
+                    ips[0].is_pi = arrival_b != 1;
+                    ips[0].is_qj = arrival_b != -1;
+                    ips[1].is_pj = arrival_a != -1;
+                    ips[1].is_qi = arrival_a != 1;
+                }
+            }
+            else
+            {
+                BOOST_ASSERT(result.template get<0>().count == 1);
+                ips[0].p_operation = union_or_blocked_same_dirs(arrival_a, is_p_last);
+                ips[0].q_operation = union_or_blocked_same_dirs(arrival_b, is_q_last);
+
+                ips[0].is_pi = arrival_a == -1;
+                ips[0].is_qi = arrival_b == -1;
+                ips[0].is_pj = arrival_a == 0;
+                ips[0].is_qj = arrival_b == 0;
+            }
+        }
+        else
+        {
+            ips[0].p_operation = union_or_blocked_different_dirs(arrival_a, is_p_last);
+            ips[0].q_operation = union_or_blocked_different_dirs(arrival_b, is_q_last);
+
+            ips[0].is_pi = arrival_a == -1;
+            ips[0].is_qi = arrival_b == -1;
+            ips[0].is_pj = arrival_a == 1;
+            ips[0].is_qj = arrival_b == 1;
+        }
+    }
+
+    struct ip_info
+    {
+        inline ip_info()
+            : p_operation(operation_none), q_operation(operation_none)
+            , is_pi(false), is_pj(false), is_qi(false), is_qj(false)
+        {}
+
+        operation_type p_operation, q_operation;
+        bool is_pi, is_pj, is_qi, is_qj;
+    };
+
+    template <std::size_t I>
+    ip_info const& get() const
+    {
+        BOOST_STATIC_ASSERT(I < 2);
+        return ips[I];
+    }
+    
+private:
+
+    // only if collinear (same_dirs)
+    static inline operation_type union_or_blocked_same_dirs(int arrival, bool is_last)
+    {
+        if ( arrival == 1 )
+            return operation_blocked;
+        else if ( arrival == -1 )
+            return operation_union;
+        else
+            return is_last ? operation_blocked : operation_union;
+            //return operation_blocked;
+    }
+
+    // only if not collinear (!same_dirs)
+    static inline operation_type union_or_blocked_different_dirs(int arrival, bool is_last)
+    {
+        if ( arrival == 1 )
+            //return operation_blocked;
+            return is_last ? operation_blocked : operation_union;
+        else
+            return operation_union;
+    }
+
+    ip_info ips[2];
+};
+
+template <typename AssignPolicy, bool EnableFirst, bool EnableLast>
+struct get_turn_info_for_endpoint
+{
+    BOOST_STATIC_ASSERT(EnableFirst || EnableLast);
+
+    template<typename Point1,
+             typename Point2,
+             typename TurnInfo,
+             typename IntersectionInfo,
+             typename OutputIterator
+    >
+    static inline bool apply(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                             Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                             bool is_p_first, bool is_p_last,
+                             bool is_q_first, bool is_q_last,
+                             TurnInfo const& tp_model,
+                             IntersectionInfo const& inters,
+                             method_type /*method*/,
+                             OutputIterator out)
+    {
+        std::size_t ip_count = inters.i_info().count;
+        // no intersection points
+        if ( ip_count == 0 )
+            return false;
+
+        if ( !is_p_first && !is_p_last && !is_q_first && !is_q_last )
+            return false;
+
+        linear_intersections intersections(pi, qi, inters.result(), is_p_last, is_q_last);
+
+        bool append0_last
+            = analyse_segment_and_assign_ip(pi, pj, pk, qi, qj, qk,
+                                            is_p_first, is_p_last, is_q_first, is_q_last,
+                                            intersections.template get<0>(),
+                                            tp_model, inters, 0, out);
+
+        // NOTE: opposite && ip_count == 1 may be true!
+        bool opposite = inters.d_info().opposite;
+
+        // don't ignore only for collinear opposite
+        bool result_ignore_ip0 = append0_last && ( ip_count == 1 || !opposite );
+
+        if ( intersections.template get<1>().p_operation == operation_none )
+            return result_ignore_ip0;
+        
+        bool append1_last
+            = analyse_segment_and_assign_ip(pi, pj, pk, qi, qj, qk,
+                                            is_p_first, is_p_last, is_q_first, is_q_last,
+                                            intersections.template get<1>(),
+                                            tp_model, inters, 1, out);
+
+        // don't ignore only for collinear opposite
+        bool result_ignore_ip1 = append1_last && !opposite /*&& ip_count == 2*/;
+
+        return result_ignore_ip0 || result_ignore_ip1;
+    }
+
+    template <typename Point1,
+              typename Point2,
+              typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutputIterator>
+    static inline
+    bool analyse_segment_and_assign_ip(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                                       Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                                       bool is_p_first, bool is_p_last,
+                                       bool is_q_first, bool is_q_last,
+                                       linear_intersections::ip_info const& ip_info,
+                                       TurnInfo const& tp_model,
+                                       IntersectionInfo const& inters,
+                                       unsigned int ip_index,
+                                       OutputIterator out)
+    {
+#ifdef BOOST_GEOMETRY_DEBUG_GET_TURNS_LINEAR_LINEAR
+        // may this give false positives for INTs?
+        typename IntersectionResult::point_type const&
+            inters_pt = result.template get<0>().intersections[ip_index];
+        BOOST_ASSERT(ip_info.is_pi == equals::equals_point_point(pi, inters_pt));
+        BOOST_ASSERT(ip_info.is_qi == equals::equals_point_point(qi, inters_pt));
+        BOOST_ASSERT(ip_info.is_pj == equals::equals_point_point(pj, inters_pt));
+        BOOST_ASSERT(ip_info.is_qj == equals::equals_point_point(qj, inters_pt));
+#endif
+
+        // TODO - calculate first/last only if needed
+        bool is_p_first_ip = is_p_first && ip_info.is_pi;
+        bool is_p_last_ip = is_p_last && ip_info.is_pj;
+        bool is_q_first_ip = is_q_first && ip_info.is_qi;
+        bool is_q_last_ip = is_q_last && ip_info.is_qj;
+        bool append_first = EnableFirst && (is_p_first_ip || is_q_first_ip);
+        bool append_last = EnableLast && (is_p_last_ip || is_q_last_ip);
+
+        operation_type p_operation = ip_info.p_operation;
+        operation_type q_operation = ip_info.q_operation;
+
+        if ( append_first || append_last )
+        {
+            bool handled = handle_internal<0>(pi, pj, pk, qi, qj, qk,
+                                              inters.rpi(), inters.rpj(), inters.rpk(),
+                                              inters.rqi(), inters.rqj(), inters.rqk(),
+                                              is_p_first_ip, is_p_last_ip,
+                                              is_q_first_ip, is_q_last_ip,
+                                              ip_info.is_qi, ip_info.is_qj,
+                                              tp_model, inters, ip_index,
+                                              p_operation, q_operation);
+            if ( !handled )
+            {
+                handle_internal<1>(qi, qj, qk, pi, pj, pk,
+                                   inters.rqi(), inters.rqj(), inters.rqk(),
+                                   inters.rpi(), inters.rpj(), inters.rpk(),
+                                   is_q_first_ip, is_q_last_ip,
+                                   is_p_first_ip, is_p_last_ip,
+                                   ip_info.is_pi, ip_info.is_pj,
+                                   tp_model, inters, ip_index,
+                                   q_operation, p_operation);
+            }
+
+            if ( p_operation != operation_none )
+            {
+                method_type method = endpoint_ip_method(ip_info.is_pi, ip_info.is_pj,
+                                                        ip_info.is_qi, ip_info.is_qj);
+                turn_position p_pos = ip_position(is_p_first_ip, is_p_last_ip);
+                turn_position q_pos = ip_position(is_q_first_ip, is_q_last_ip);
+
+                // handle spikes
+
+                // P is spike and should be handled
+                if ( !is_p_last
+                  && ip_info.is_pj // this check is redundant (also in is_spike_p) but faster
+                  && inters.i_info().count == 2
+                  && inters.is_spike_p() )
+                {
+                    assign(pi, qi, inters.result(), ip_index, method, operation_blocked, q_operation,
+                           p_pos, q_pos, is_p_first_ip, is_q_first_ip, true, false, tp_model, out);
+                    assign(pi, qi, inters.result(), ip_index, method, operation_intersection, q_operation,
+                           p_pos, q_pos, is_p_first_ip, is_q_first_ip, true, false, tp_model, out);
+                }
+                // Q is spike and should be handled
+                else if ( !is_q_last
+                       && ip_info.is_qj // this check is redundant (also in is_spike_q) but faster
+                       && inters.i_info().count == 2
+                       && inters.is_spike_q() )
+                {
+                    assign(pi, qi, inters.result(), ip_index, method, p_operation, operation_blocked,
+                           p_pos, q_pos, is_p_first_ip, is_q_first_ip, false, true, tp_model, out);
+                    assign(pi, qi, inters.result(), ip_index, method, p_operation, operation_intersection,
+                           p_pos, q_pos, is_p_first_ip, is_q_first_ip, false, true, tp_model, out);
+                }
+                // no spikes
+                else
+                {
+                    assign(pi, qi, inters.result(), ip_index, method, p_operation, q_operation,
+                           p_pos, q_pos, is_p_first_ip, is_q_first_ip, false, false, tp_model, out);
+                }
+            }
+        }
+
+        return append_last;
+    }
+
+    // TODO: IT'S ALSO PROBABLE THAT ALL THIS FUNCTION COULD BE INTEGRATED WITH handle_segment
+    //       however now it's lazily calculated and then it would be always calculated
+
+    template<std::size_t G1Index,
+             typename Point1,
+             typename Point2,
+             typename RobustPoint1,
+             typename RobustPoint2,
+             typename TurnInfo,
+             typename IntersectionInfo
+    >
+    static inline bool handle_internal(Point1 const& /*i1*/, Point1 const& /*j1*/, Point1 const& /*k1*/,
+                                       Point2 const& i2, Point2 const& j2, Point2 const& /*k2*/,
+                                       RobustPoint1 const& ri1, RobustPoint1 const& rj1, RobustPoint1 const& /*rk1*/,
+                                       RobustPoint2 const& ri2, RobustPoint2 const& rj2, RobustPoint2 const& rk2,
+                                       bool first1, bool last1, bool first2, bool last2,
+                                       bool ip_i2, bool ip_j2, TurnInfo const& tp_model,
+                                       IntersectionInfo const& inters, unsigned int ip_index,
+                                       operation_type & op1, operation_type & op2)
+    {
+        boost::ignore_unused_variable_warning(i2);
+        boost::ignore_unused_variable_warning(j2);
+        boost::ignore_unused_variable_warning(ip_index);
+        boost::ignore_unused_variable_warning(tp_model);
+
+        if ( !first2 && !last2 )
+        {
+            if ( first1 )
+            {
+#ifdef BOOST_GEOMETRY_DEBUG_GET_TURNS_LINEAR_LINEAR
+                // may this give false positives for INTs?
+                typename IntersectionResult::point_type const&
+                    inters_pt = inters.i_info().intersections[ip_index];
+                BOOST_ASSERT(ip_i2 == equals::equals_point_point(i2, inters_pt));
+                BOOST_ASSERT(ip_j2 == equals::equals_point_point(j2, inters_pt));
+#endif
+                if ( ip_i2 )
+                {
+                    // don't output this IP - for the first point of other geometry segment
+                    op1 = operation_none;
+                    op2 = operation_none;
+                    return true;
+                }
+                else if ( ip_j2 )
+                {
+                    side_calculator<RobustPoint1, RobustPoint2, RobustPoint2>
+                        side_calc(ri2, ri1, rj1, ri2, rj2, rk2);
+
+                    std::pair<operation_type, operation_type>
+                        operations = operations_of_equal(side_calc);
+
+// TODO: must the above be calculated?
+// wouldn't it be enough to check if segments are collinear?
+
+                    if ( operations_both(operations, operation_continue) )
+                    {
+                        if ( op1 != operation_union 
+                          || op2 != operation_union
+                          || ! ( G1Index == 0 ? inters.is_spike_q() : inters.is_spike_p() ) )
+                        {
+                            // THIS IS WRT THE ORIGINAL SEGMENTS! NOT THE ONES ABOVE!
+                            bool opposite = inters.d_info().opposite;
+
+                            op1 = operation_intersection;
+                            op2 = opposite ? operation_union : operation_intersection;
+                        }
+                    }
+                    else
+                    {
+                        BOOST_ASSERT(operations_combination(operations, operation_intersection, operation_union));
+                        //op1 = operation_union;
+                        //op2 = operation_union;
+                    }
+
+                    return true;
+                }
+                // else do nothing - shouldn't be handled this way
+            }
+            else if ( last1 )
+            {
+#ifdef BOOST_GEOMETRY_DEBUG_GET_TURNS_LINEAR_LINEAR
+                // may this give false positives for INTs?
+                typename IntersectionResult::point_type const&
+                    inters_pt = inters.i_info().intersections[ip_index];
+                BOOST_ASSERT(ip_i2 == equals::equals_point_point(i2, inters_pt));
+                BOOST_ASSERT(ip_j2 == equals::equals_point_point(j2, inters_pt));
+#endif
+                if ( ip_i2 )
+                {
+                    // don't output this IP - for the first point of other geometry segment
+                    op1 = operation_none;
+                    op2 = operation_none;
+                    return true;
+                }
+                else if ( ip_j2 )
+                {
+                    side_calculator<RobustPoint1, RobustPoint2, RobustPoint2>
+                        side_calc(ri2, rj1, ri1, ri2, rj2, rk2);
+                    
+                    std::pair<operation_type, operation_type>
+                        operations = operations_of_equal(side_calc);
+
+// TODO: must the above be calculated?
+// wouldn't it be enough to check if segments are collinear?
+
+                    if ( operations_both(operations, operation_continue) )
+                    {
+                        if ( op1 != operation_blocked
+                          || op2 != operation_union
+                          || ! ( G1Index == 0 ? inters.is_spike_q() : inters.is_spike_p() ) )
+                        {
+                            // THIS IS WRT THE ORIGINAL SEGMENTS! NOT THE ONES ABOVE!
+                            bool second_going_out = inters.i_info().count > 1;
+
+                            op1 = operation_blocked;
+                            op2 = second_going_out ? operation_union : operation_intersection;
+                        }
+                    }
+                    else
+                    {
+                        BOOST_ASSERT(operations_combination(operations, operation_intersection, operation_union));
+                        //op1 = operation_blocked;
+                        //op2 = operation_union;
+                    }
+
+                    return true;
+                }
+                // else do nothing - shouldn't be handled this way
+            }
+            // else do nothing - shouldn't be handled this way
+        }
+
+        return false;
+    }
+
+    static inline method_type endpoint_ip_method(bool ip_pi, bool ip_pj, bool ip_qi, bool ip_qj)
+    {
+        if ( (ip_pi || ip_pj) && (ip_qi || ip_qj) )
+            return method_touch;
+        else
+            return method_touch_interior;
+    }
+
+    static inline turn_position ip_position(bool is_ip_first_i, bool is_ip_last_j)
+    {
+        return is_ip_first_i ? position_front :
+               ( is_ip_last_j ? position_back : position_middle );
+    }
+
+    template <typename Point1,
+              typename Point2,
+              typename IntersectionResult,
+              typename TurnInfo,
+              typename OutputIterator>
+    static inline void assign(Point1 const& pi, Point2 const& qi,
+                              IntersectionResult const& result,
+                              unsigned int ip_index,
+                              method_type method,
+                              operation_type op0, operation_type op1,
+                              turn_position pos0, turn_position pos1,
+                              bool is_p_first_ip, bool is_q_first_ip,
+                              bool is_p_spike, bool is_q_spike,
+                              TurnInfo const& tp_model,
+                              OutputIterator out)
+    {
+        TurnInfo tp = tp_model;
+        
+        //geometry::convert(ip, tp.point);
+        //tp.method = method;
+        base_turn_handler::assign_point(tp, method, result.template get<0>(), ip_index);
+
+        tp.operations[0].operation = op0;
+        tp.operations[1].operation = op1;
+        tp.operations[0].position = pos0;
+        tp.operations[1].position = pos1;
+
+        if ( result.template get<0>().count > 1 )
+        {
+            // NOTE: is_collinear is NOT set for the first endpoint
+            // for which there is no preceding segment
+
+            //BOOST_ASSERT( result.template get<1>().dir_a == 0 && result.template get<1>().dir_b == 0 );
+            if ( ! is_p_first_ip )
+            {
+                tp.operations[0].is_collinear = op0 != operation_intersection
+                                             || is_p_spike;
+            }
+
+            if ( ! is_q_first_ip )
+            {
+                tp.operations[1].is_collinear = op1 != operation_intersection
+                                             || is_q_spike;
+            }
+        }
+        else //if ( result.template get<0>().count == 1 )
+        {
+            if ( op0 == operation_blocked && op1 == operation_intersection )
+            {
+                tp.operations[0].is_collinear = true;
+            }
+            else if ( op0 == operation_intersection && op1 == operation_blocked )
+            {
+                tp.operations[1].is_collinear = true;
+            }
+        }
+
+        // TODO: this should get an intersection_info, which is unavailable here
+        // Because the assign_null policy accepts any structure, we pass the result instead for now
+        AssignPolicy::apply(tp, pi, qi, result);
+        *out++ = tp;
+    }
+
+    template <typename SidePolicy>
+    static inline std::pair<operation_type, operation_type> operations_of_equal(SidePolicy const& side)
+    {
+        int const side_pk_q2 = side.pk_wrt_q2();
+        int const side_pk_p = side.pk_wrt_p1();
+        int const side_qk_p = side.qk_wrt_p1();
+
+        // If pk is collinear with qj-qk, they continue collinearly.
+        // This can be on either side of p1 (== q1), or collinear
+        // The second condition checks if they do not continue
+        // oppositely
+        if ( side_pk_q2 == 0 && side_pk_p == side_qk_p )
+        {
+            return std::make_pair(operation_continue, operation_continue);
+        }
+
+        // If they turn to same side (not opposite sides)
+        if ( ! base_turn_handler::opposite(side_pk_p, side_qk_p) )
+        {
+            // If pk is left of q2 or collinear: p: union, q: intersection
+            if ( side_pk_q2 != -1 )
+            {
+                return std::make_pair(operation_union, operation_intersection);
+            }
+            else
+            {
+               return std::make_pair(operation_intersection, operation_union);
+            }
+        }
+        else
+        {
+            // They turn opposite sides. If p turns left (or collinear),
+           // p: union, q: intersection
+            if ( side_pk_p != -1 )
+            {
+                return std::make_pair(operation_union, operation_intersection);
+            }
+           else
+            {
+                return std::make_pair(operation_intersection, operation_union);
+            }
+        }
+   }
+
+    static inline bool operations_both(
+                            std::pair<operation_type, operation_type> const& operations,
+                            operation_type const op)
+    {
+        return operations.first == op && operations.second == op;
+    }
+
+    static inline bool operations_combination(
+                            std::pair<operation_type, operation_type> const& operations,
+                            operation_type const op1, operation_type const op2)
+    {
+        return ( operations.first == op1 && operations.second == op2 )
+            || ( operations.first == op2 && operations.second == op1 );
+    }
+};
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_FOR_ENDPOINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,329 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_HELPERS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_HELPERS_HPP
+
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay {
+
+enum turn_position { position_middle, position_front, position_back };
+
+template <typename SegmentRatio>
+struct turn_operation_linear
+    : public turn_operation<SegmentRatio>
+{
+    turn_operation_linear()
+        : position(position_middle)
+        , is_collinear(false)
+    {}
+
+    turn_position position;
+    bool is_collinear; // valid only for Linear geometry
+};
+
+template <typename PointP, typename PointQ,
+          typename Pi = PointP, typename Pj = PointP, typename Pk = PointP,
+          typename Qi = PointQ, typename Qj = PointQ, typename Qk = PointQ
+>
+struct side_calculator
+{
+    typedef boost::geometry::strategy::side::side_by_triangle<> side; // todo: get from coordinate system
+
+    inline side_calculator(Pi const& pi, Pj const& pj, Pk const& pk,
+                           Qi const& qi, Qj const& qj, Qk const& qk)
+        : m_pi(pi), m_pj(pj), m_pk(pk)
+        , m_qi(qi), m_qj(qj), m_qk(qk)
+    {}
+
+    inline int pk_wrt_p1() const { return side::apply(m_pi, m_pj, m_pk); }
+    inline int pk_wrt_q1() const { return side::apply(m_qi, m_qj, m_pk); }
+    inline int qk_wrt_p1() const { return side::apply(m_pi, m_pj, m_qk); }
+    inline int qk_wrt_q1() const { return side::apply(m_qi, m_qj, m_qk); }
+
+    inline int pk_wrt_q2() const { return side::apply(m_qj, m_qk, m_pk); }
+    inline int qk_wrt_p2() const { return side::apply(m_pj, m_pk, m_qk); }
+
+    Pi const& m_pi;
+    Pj const& m_pj;
+    Pk const& m_pk;
+    Qi const& m_qi;
+    Qj const& m_qj;
+    Qk const& m_qk;
+};
+
+template <typename Point1, typename Point2, typename RobustPolicy>
+struct robust_points
+{
+    typedef typename geometry::robust_point_type
+        <
+        Point1, RobustPolicy
+        >::type robust_point1_type;
+    // TODO: define robust_point2_type using Point2?
+    typedef robust_point1_type robust_point2_type;
+
+    inline robust_points(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                         Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                         RobustPolicy const& robust_policy)
+    {
+        geometry::recalculate(m_rpi, pi, robust_policy);
+        geometry::recalculate(m_rpj, pj, robust_policy);
+        geometry::recalculate(m_rpk, pk, robust_policy);
+        geometry::recalculate(m_rqi, qi, robust_policy);
+        geometry::recalculate(m_rqj, qj, robust_policy);
+        geometry::recalculate(m_rqk, qk, robust_policy);
+    }
+
+    robust_point1_type m_rpi, m_rpj, m_rpk;
+    robust_point2_type m_rqi, m_rqj, m_rqk;
+};
+
+template <typename Point1, typename Point2, typename RobustPolicy>
+class intersection_info_base
+    : private robust_points<Point1, Point2, RobustPolicy>
+{
+    typedef robust_points<Point1, Point2, RobustPolicy> base_t;
+
+public:
+    typedef Point1 point1_type;
+    typedef Point2 point2_type;
+
+    typedef typename base_t::robust_point1_type robust_point1_type;
+    typedef typename base_t::robust_point2_type robust_point2_type;
+
+    typedef side_calculator<robust_point1_type, robust_point2_type> side_calculator_type;
+    
+    intersection_info_base(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                           Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                           RobustPolicy const& robust_policy)
+        : base_t(pi, pj, pk, qi, qj, qk, robust_policy)
+        , m_side_calc(base_t::m_rpi, base_t::m_rpj, base_t::m_rpk,
+                      base_t::m_rqi, base_t::m_rqj, base_t::m_rqk)
+        , m_pi(pi), m_pj(pj), m_pk(pk)
+        , m_qi(qi), m_qj(qj), m_qk(qk)
+    {}
+
+    inline Point1 const& pi() const { return m_pi; }
+    inline Point1 const& pj() const { return m_pj; }
+    inline Point1 const& pk() const { return m_pk; }
+
+    inline Point2 const& qi() const { return m_qi; }
+    inline Point2 const& qj() const { return m_qj; }
+    inline Point2 const& qk() const { return m_qk; }
+
+    inline robust_point1_type const& rpi() const { return base_t::m_rpi; }
+    inline robust_point1_type const& rpj() const { return base_t::m_rpj; }
+    inline robust_point1_type const& rpk() const { return base_t::m_rpk; }
+
+    inline robust_point2_type const& rqi() const { return base_t::m_rqi; }
+    inline robust_point2_type const& rqj() const { return base_t::m_rqj; }
+    inline robust_point2_type const& rqk() const { return base_t::m_rqk; }
+
+    inline side_calculator_type const& sides() const { return m_side_calc; }
+    
+private:
+    side_calculator_type m_side_calc;
+
+    point1_type const& m_pi;
+    point1_type const& m_pj;
+    point1_type const& m_pk;
+    point2_type const& m_qi;
+    point2_type const& m_qj;
+    point2_type const& m_qk;
+};
+
+template <typename Point1, typename Point2>
+class intersection_info_base<Point1, Point2, detail::no_rescale_policy>
+{
+public:
+    typedef Point1 point1_type;
+    typedef Point2 point2_type;
+
+    typedef Point1 robust_point1_type;
+    typedef Point2 robust_point2_type;
+
+    typedef side_calculator<Point1, Point2> side_calculator_type;
+    
+    intersection_info_base(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                           Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                           no_rescale_policy const& /*robust_policy*/)
+        : m_side_calc(pi, pj, pk, qi, qj, qk)
+    {}
+
+    inline Point1 const& pi() const { return m_side_calc.m_pi; }
+    inline Point1 const& pj() const { return m_side_calc.m_pj; }
+    inline Point1 const& pk() const { return m_side_calc.m_pk; }
+
+    inline Point2 const& qi() const { return m_side_calc.m_qi; }
+    inline Point2 const& qj() const { return m_side_calc.m_qj; }
+    inline Point2 const& qk() const { return m_side_calc.m_qk; }
+
+    inline Point1 const& rpi() const { return pi(); }
+    inline Point1 const& rpj() const { return pj(); }
+    inline Point1 const& rpk() const { return pk(); }
+
+    inline Point2 const& rqi() const { return qi(); }
+    inline Point2 const& rqj() const { return qj(); }
+    inline Point2 const& rqk() const { return qk(); }
+
+    inline side_calculator_type const& sides() const { return m_side_calc; }
+    
+private:
+    side_calculator_type m_side_calc;
+};
+
+
+template <typename Point1, typename Point2, typename TurnPoint, typename RobustPolicy>
+class intersection_info
+    : public intersection_info_base<Point1, Point2, RobustPolicy>
+{
+    typedef intersection_info_base<Point1, Point2, RobustPolicy> base_t;
+
+    typedef typename strategy_intersection
+        <
+            typename cs_tag<TurnPoint>::type,
+            Point1,
+            Point2,
+            TurnPoint,
+            RobustPolicy
+        >::segment_intersection_strategy_type strategy;
+
+public:
+    typedef model::referring_segment<Point1 const> segment_type1;
+    typedef model::referring_segment<Point2 const> segment_type2;
+    typedef typename base_t::side_calculator_type side_calculator_type;
+    
+    typedef typename strategy::return_type result_type;
+    typedef typename boost::tuples::element<0, result_type>::type i_info_type; // intersection_info
+    typedef typename boost::tuples::element<1, result_type>::type d_info_type; // dir_info
+
+    intersection_info(Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                      Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                      RobustPolicy const& robust_policy)
+        : base_t(pi, pj, pk, qi, qj, qk, robust_policy)
+        , m_result(strategy::apply(segment_type1(pi, pj),
+                                   segment_type2(qi, qj),
+                                   robust_policy))
+        , m_robust_policy(robust_policy)
+    {}
+
+    inline result_type const& result() const { return m_result; }
+    inline i_info_type const& i_info() const { return m_result.template get<0>(); }
+    inline d_info_type const& d_info() const { return m_result.template get<1>(); }
+
+    // TODO: it's more like is_spike_ip_p
+    inline bool is_spike_p() const
+    {
+        if ( base_t::sides().pk_wrt_p1() == 0 )
+        {
+            if ( ! is_ip_j<0>() )
+                return false;
+
+            int const qk_p1 = base_t::sides().qk_wrt_p1();
+            int const qk_p2 = base_t::sides().qk_wrt_p2();
+                
+            if ( qk_p1 == -qk_p2 )
+            {
+                if ( qk_p1 == 0 )
+                {
+                    return is_spike_of_collinear(base_t::pi(), base_t::pj(), base_t::pk());
+                }
+                        
+                return true;
+            }
+        }
+        
+        return false;
+    }
+
+    // TODO: it's more like is_spike_ip_q
+    inline bool is_spike_q() const
+    {
+        if ( base_t::sides().qk_wrt_q1() == 0 )
+        {
+            if ( ! is_ip_j<1>() )
+                return false;
+
+            int const pk_q1 = base_t::sides().pk_wrt_q1();
+            int const pk_q2 = base_t::sides().pk_wrt_q2();
+                
+            if ( pk_q1 == -pk_q2 )
+            {
+                if ( pk_q1 == 0 )
+                {
+                    return is_spike_of_collinear(base_t::qi(), base_t::qj(), base_t::qk());
+                }
+                        
+                return true;
+            }
+        }
+        
+        return false;
+    }
+
+private:
+    template <typename Point>
+    inline bool is_spike_of_collinear(Point const& i, Point const& j, Point const& k) const
+    {
+        typedef model::referring_segment<Point const> seg_t;
+
+        typedef strategy_intersection
+            <
+                typename cs_tag<Point>::type, Point, Point, Point, RobustPolicy
+            > si;
+        
+        typedef typename si::segment_intersection_strategy_type strategy;
+        
+        typename strategy::return_type result
+            = strategy::apply(seg_t(i, j), seg_t(j, k), m_robust_policy);
+        
+        return result.template get<0>().count == 2;
+    }
+
+    template <std::size_t OpId>
+    bool is_ip_j() const
+    {
+        int arrival = d_info().arrival[OpId];
+        bool same_dirs = d_info().dir_a == 0 && d_info().dir_b == 0;
+
+        if ( same_dirs )
+        {
+            if ( i_info().count == 2 )
+            {
+                return arrival != -1;
+            }
+            else
+            {
+                return arrival == 0;
+            }
+        }
+        else
+        {
+            return arrival == 1;
+        }
+    }
+
+    result_type m_result;
+    RobustPolicy const& m_robust_policy;
+};
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_HELPERS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_la.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,872 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LA_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LA_HPP
+
+#include <boost/geometry/util/condition.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info_for_endpoint.hpp>
+
+// TEMP, for spikes detector
+//#include <boost/geometry/algorithms/detail/overlay/get_turn_info_ll.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay {
+
+template<typename AssignPolicy>
+struct get_turn_info_linear_areal
+{
+    // Currently only Linear spikes are handled
+    // Areal spikes are ignored
+    static const bool handle_spikes = true;
+
+    template
+    <
+        typename Point1,
+        typename Point2,
+        typename TurnInfo,
+        typename RobustPolicy,
+        typename OutputIterator
+    >
+    static inline OutputIterator apply(
+                Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                bool is_p_first, bool is_p_last,
+                bool is_q_first, bool is_q_last,
+                TurnInfo const& tp_model,
+                RobustPolicy const& robust_policy,
+                OutputIterator out)
+    {
+        typedef intersection_info<Point1, Point2, typename TurnInfo::point_type, RobustPolicy>
+            inters_info;
+
+        inters_info inters(pi, pj, pk, qi, qj, qk, robust_policy);
+
+        char const method = inters.d_info().how;
+
+        // Copy, to copy possibly extended fields
+        TurnInfo tp = tp_model;
+
+        // Select method and apply
+        switch(method)
+        {
+            case 'a' : // collinear, "at"
+            case 'f' : // collinear, "from"
+            case 's' : // starts from the middle
+                get_turn_info_for_endpoint<true, true>(
+                    pi, pj, pk, qi, qj, qk,
+                    is_p_first, is_p_last, is_q_first, is_q_last,
+                    tp_model, inters, method_none, out);
+                break;
+
+            case 'd' : // disjoint: never do anything
+                break;
+
+            case 'm' :
+            {
+                if ( get_turn_info_for_endpoint<false, true>(
+                        pi, pj, pk, qi, qj, qk,
+                        is_p_first, is_p_last, is_q_first, is_q_last,
+                        tp_model, inters, method_touch_interior, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    typedef touch_interior
+                        <
+                            TurnInfo
+                        > policy;
+
+                    // If Q (1) arrives (1)
+                    if ( inters.d_info().arrival[1] == 1 )
+                    {
+                        policy::template apply<0>(pi, pj, pk, qi, qj, qk,
+                                    tp, inters.i_info(), inters.d_info(),
+                                    inters.sides());
+                    }
+                    else
+                    {
+                        // Swap p/q
+                        side_calculator
+                            <
+                                typename inters_info::robust_point2_type,
+                                typename inters_info::robust_point1_type
+                            > swapped_side_calc(inters.rqi(), inters.rqj(), inters.rqk(),
+                                                inters.rpi(), inters.rpj(), inters.rpk());
+                        policy::template apply<1>(qi, qj, qk, pi, pj, pk,
+                                    tp, inters.i_info(), inters.d_info(),
+                                    swapped_side_calc);
+                    }
+
+                    if ( tp.operations[1].operation == operation_blocked )
+                    {
+                        tp.operations[0].is_collinear = true;
+                    }
+
+                    replace_method_and_operations_tm(tp.method,
+                                                     tp.operations[0].operation,
+                                                     tp.operations[1].operation);
+                    
+                    // this function assumes that 'u' must be set for a spike
+                    calculate_spike_operation(tp.operations[0].operation,
+                                              inters, is_p_last);
+                    
+                    AssignPolicy::apply(tp, pi, qi, inters);
+
+                    *out++ = tp;
+                }
+            }
+            break;
+            case 'i' :
+            {
+                crosses<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                         tp, inters.i_info(), inters.d_info());
+
+                replace_operations_i(tp.operations[0].operation, tp.operations[1].operation);
+
+                AssignPolicy::apply(tp, pi, qi, inters);
+                *out++ = tp;
+            }
+            break;
+            case 't' :
+            {
+                // Both touch (both arrive there)
+                if ( get_turn_info_for_endpoint<false, true>(
+                        pi, pj, pk, qi, qj, qk,
+                        is_p_first, is_p_last, is_q_first, is_q_last,
+                        tp_model, inters, method_touch, out) )
+                {
+                    // do nothing
+                }
+                else 
+                {
+                    touch<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                            tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                    if ( tp.operations[1].operation == operation_blocked )
+                    {
+                        tp.operations[0].is_collinear = true;
+                    }
+
+                    // workarounds for touch<> not taking spikes into account starts here
+                    // those was discovered empirically
+                    // touch<> is not symmetrical!
+                    // P spikes and Q spikes may produce various operations!
+                    // Only P spikes are valid for L/A
+                    // TODO: this is not optimal solution - think about rewriting touch<>
+
+                    if ( tp.operations[0].operation == operation_blocked )
+                    {
+                        // a spike on P on the same line with Q1
+                        if ( inters.is_spike_p() )
+                        {
+                            if ( inters.sides().qk_wrt_p1() == 0 )
+                            {
+                                tp.operations[0].is_collinear = true;
+                            }
+                            else
+                            {
+                                tp.operations[0].operation = operation_union;                                
+                            }
+                        }
+                    }
+                    else if ( tp.operations[0].operation == operation_continue
+                           && tp.operations[1].operation == operation_continue )
+                    {
+                        // P spike on the same line with Q2 (opposite)
+                        if ( inters.sides().pk_wrt_q1() == -inters.sides().qk_wrt_q1()
+                          && inters.is_spike_p() )
+                        {
+                            tp.operations[0].operation = operation_union;
+                            tp.operations[1].operation = operation_union;
+                        }
+                    }
+                    else if ( tp.operations[0].operation == operation_none
+                           && tp.operations[1].operation == operation_none )
+                    {
+                        // spike not handled by touch<>
+                        if ( inters.is_spike_p() )
+                        {
+                            tp.operations[0].operation = operation_intersection;
+                            tp.operations[1].operation = operation_union;
+
+                            if ( inters.sides().pk_wrt_q2() == 0 )
+                            {
+                                tp.operations[0].operation = operation_continue; // will be converted to i
+                                tp.operations[0].is_collinear = true;
+                            }
+                        }
+                    }
+
+                    // workarounds for touch<> not taking spikes into account ends here
+
+                    replace_method_and_operations_tm(tp.method,
+                                                     tp.operations[0].operation,
+                                                     tp.operations[1].operation);
+
+                    bool ignore_spike
+                        = calculate_spike_operation(tp.operations[0].operation,
+                                                    inters, is_p_last);
+
+// TODO: move this into the append_xxx and call for each turn?
+                    AssignPolicy::apply(tp, pi, qi, inters);
+
+                    if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                      || ignore_spike
+                      || ! append_opposite_spikes<append_touches>( // for 'i' or 'c' i???
+                                tp, inters, is_p_last, is_q_last, out) )
+                    {
+                        *out++ = tp;
+                    }
+                }
+            }
+            break;
+            case 'e':
+            {
+                if ( get_turn_info_for_endpoint<true, true>(
+                        pi, pj, pk, qi, qj, qk,
+                        is_p_first, is_p_last, is_q_first, is_q_last,
+                        tp_model, inters, method_equal, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    tp.operations[0].is_collinear = true;
+
+                    if ( ! inters.d_info().opposite )
+                    {
+                        // Both equal
+                        // or collinear-and-ending at intersection point
+                        equal<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                            tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                        turn_transformer_ec<false> transformer(method_touch);
+                        transformer(tp);
+                    
+// TODO: move this into the append_xxx and call for each turn?
+                        AssignPolicy::apply(tp, pi, qi, inters);
+                        
+                        // conditionally handle spikes
+                        if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                          || ! append_collinear_spikes(tp, inters, is_p_last, is_q_last,
+                                                       method_touch, append_equal, out) )
+                        {
+                            *out++ = tp; // no spikes
+                        }
+                    }
+                    else
+                    {
+                        equal_opposite
+                            <
+                                TurnInfo,
+                                AssignPolicy
+                            >::apply(pi, qi,
+                                     tp, out, inters);
+                    }
+                }
+            }
+            break;
+            case 'c' :
+            {
+                // Collinear
+                if ( get_turn_info_for_endpoint<true, true>(
+                        pi, pj, pk, qi, qj, qk,
+                        is_p_first, is_p_last, is_q_first, is_q_last,
+                        tp_model, inters, method_collinear, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    tp.operations[0].is_collinear = true;
+
+                    if ( ! inters.d_info().opposite )
+                    {
+                        method_type method_replace = method_touch_interior;
+                        append_version_c version = append_collinear;
+
+                        if ( inters.d_info().arrival[0] == 0 )
+                        {
+                            // Collinear, but similar thus handled as equal
+                            equal<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                    tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                            method_replace = method_touch;
+                            version = append_equal;
+                        }
+                        else
+                        {
+                            collinear<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                    tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                            //method_replace = method_touch_interior;
+                            //version = append_collinear;
+                        }
+
+                        turn_transformer_ec<false> transformer(method_replace);
+                        transformer(tp);
+
+// TODO: move this into the append_xxx and call for each turn?
+                        AssignPolicy::apply(tp, pi, qi, inters);
+                        
+                        // conditionally handle spikes
+                        if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                          || ! append_collinear_spikes(tp, inters, is_p_last, is_q_last,
+                                                       method_replace, version, out) )
+                        {
+                            // no spikes
+                            *out++ = tp;
+                        }
+                    }
+                    else
+                    {
+                        // Is this always 'm' ?
+                        turn_transformer_ec<false> transformer(method_touch_interior);
+
+                        // conditionally handle spikes
+                        if ( BOOST_GEOMETRY_CONDITION(handle_spikes) )
+                        {
+                            append_opposite_spikes<append_collinear_opposite>(
+                                    tp, inters, is_p_last, is_q_last, out);
+                        }
+
+                        // TODO: ignore for spikes?
+                        //       E.g. pass is_p_valid = !is_p_last && !is_pj_spike,
+                        //       the same with is_q_valid
+
+                        collinear_opposite
+                            <
+                                TurnInfo,
+                                AssignPolicy
+                            >::apply(pi, pj, pk, qi, qj, qk,
+                                tp, out, inters,
+                                inters.sides(), transformer,
+                                !is_p_last, true); // qk is always valid
+                    }
+                }
+            }
+            break;
+            case '0' :
+            {
+                // degenerate points
+                if ( BOOST_GEOMETRY_CONDITION(AssignPolicy::include_degenerate) )
+                {
+                    only_convert::apply(tp, inters.i_info());
+
+                    if ( is_p_first
+                      && equals::equals_point_point(pi, tp.point) )
+                    {
+                        tp.operations[0].position = position_front;
+                    }
+                    else if ( is_p_last
+                           && equals::equals_point_point(pj, tp.point) )
+                    {
+                        tp.operations[0].position = position_back;
+                    }
+                    // tp.operations[1].position = position_middle;
+
+                    AssignPolicy::apply(tp, pi, qi, inters);
+                    *out++ = tp;
+                }
+            }
+            break;
+            default :
+            {
+#if defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
+                std::cout << "TURN: Unknown method: " << method << std::endl;
+#endif
+#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
+                throw turn_info_exception(method);
+#endif
+            }
+            break;
+        }
+
+        return out;
+    }
+
+    template <typename Operation,
+              typename IntersectionInfo>
+    static inline bool calculate_spike_operation(Operation & op,
+                                                 IntersectionInfo const& inters,
+                                                 bool is_p_last)
+    {
+        bool is_p_spike = ( op == operation_union || op == operation_intersection )
+                       && ! is_p_last
+                       && inters.is_spike_p();
+
+        if ( is_p_spike )
+        {
+            int const pk_q1 = inters.sides().pk_wrt_q1();
+            
+            bool going_in = pk_q1 < 0; // Pk on the right
+            bool going_out = pk_q1 > 0; // Pk on the left
+
+            int const qk_q1 = inters.sides().qk_wrt_q1();
+
+            // special cases
+            if ( qk_q1 < 0 ) // Q turning R
+            { 
+                // spike on the edge point
+                // if it's already known that the spike is going out this musn't be checked
+                if ( ! going_out
+                  && equals::equals_point_point(inters.rpj(), inters.rqj()) )
+                {
+                    int const pk_q2 = inters.sides().pk_wrt_q2();
+                    going_in = pk_q1 < 0 && pk_q2 < 0; // Pk on the right of both
+                    going_out = pk_q1 > 0 || pk_q2 > 0; // Pk on the left of one of them
+                }
+            }
+            else if ( qk_q1 > 0 ) // Q turning L
+            {
+                // spike on the edge point
+                // if it's already known that the spike is going in this musn't be checked
+                if ( ! going_in
+                  && equals::equals_point_point(inters.rpj(), inters.rqj()) )
+                {
+                    int const pk_q2 = inters.sides().pk_wrt_q2();
+                    going_in = pk_q1 < 0 || pk_q2 < 0; // Pk on the right of one of them
+                    going_out = pk_q1 > 0 && pk_q2 > 0; // Pk on the left of both
+                }
+            }
+
+            if ( going_in )
+            {
+                op = operation_intersection;
+                return true;
+            }
+            else if ( going_out )
+            {
+                op = operation_union;
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    enum append_version_c { append_equal, append_collinear };
+
+    template <typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutIt>
+    static inline bool append_collinear_spikes(TurnInfo & tp,
+                                               IntersectionInfo const& inters,
+                                               bool is_p_last, bool /*is_q_last*/,
+                                               method_type method, append_version_c version,
+                                               OutIt out)
+    {
+        // method == touch || touch_interior
+        // both position == middle
+
+        bool is_p_spike = ( version == append_equal ?
+                            ( tp.operations[0].operation == operation_union
+                           || tp.operations[0].operation == operation_intersection ) :
+                            tp.operations[0].operation == operation_continue )
+                       && ! is_p_last
+                       && inters.is_spike_p();
+
+        // TODO: throw an exception for spike in Areal?
+        /*bool is_q_spike = tp.operations[1].operation == operation_continue
+                       && inters.is_spike_q();
+
+        // both are collinear spikes on the same IP, we can just follow both
+        if ( is_p_spike && is_q_spike )
+        {
+            return false;
+        }
+        // spike on Linear - it's turning back on the boundary of Areal
+        else*/
+        if ( is_p_spike )
+        {
+            tp.method = method;
+            tp.operations[0].operation = operation_blocked;
+            tp.operations[1].operation = operation_union;
+            *out++ = tp;
+            tp.operations[0].operation = operation_continue; // boundary
+            //tp.operations[1].operation = operation_union;
+            *out++ = tp;
+
+            return true;
+        }
+        // spike on Areal - Linear is going outside
+        /*else if ( is_q_spike )
+        {
+            tp.method = method;
+            tp.operations[0].operation = operation_union;
+            tp.operations[1].operation = operation_continue;
+            *out++ = tp;
+            *out++ = tp;
+
+            return true;
+        }*/
+
+        return false;
+    }
+
+    enum append_version_o { append_touches, append_collinear_opposite };
+
+    template <append_version_o Version,
+              typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutIt>
+    static inline bool append_opposite_spikes(TurnInfo & tp,
+                                              IntersectionInfo const& inters,
+                                              bool is_p_last, bool /*is_q_last*/,
+                                              OutIt out)
+    {
+        static const bool is_version_touches = (Version == append_touches);
+
+        bool is_p_spike = ( is_version_touches ?
+                            ( tp.operations[0].operation == operation_continue
+                           || tp.operations[0].operation == operation_intersection ) : // i ???
+                            true )
+                       && ! is_p_last
+                       && inters.is_spike_p();
+        
+        // TODO: throw an exception for spike in Areal?
+        /*bool is_q_spike = ( ( Version == append_touches
+                           && tp.operations[1].operation == operation_continue )
+                         || ( Version == append_collinear_opposite
+                           && tp.operations[1].operation == operation_none ) )
+                       && inters.is_spike_q();
+
+        if ( is_p_spike && is_q_spike )
+        {
+            // u/u or nothing?
+            return false;
+        }
+        else*/
+        if ( is_p_spike )
+        {
+            if ( BOOST_GEOMETRY_CONDITION(is_version_touches)
+              || inters.d_info().arrival[0] == 1 )
+            {
+                if ( BOOST_GEOMETRY_CONDITION(is_version_touches) )
+                {
+                    tp.operations[0].is_collinear = true;
+                    //tp.operations[1].is_collinear = false;
+                    tp.method = method_touch;
+                }
+                else
+                {
+                    tp.operations[0].is_collinear = true;
+                    //tp.operations[1].is_collinear = false;
+
+                    BOOST_ASSERT(inters.i_info().count > 1);
+                    base_turn_handler::assign_point(tp, method_touch_interior, inters.i_info(), 1);
+
+                    AssignPolicy::apply(tp, inters.pi(), inters.qi(), inters);
+                }
+
+                tp.operations[0].operation = operation_blocked;
+                tp.operations[1].operation = operation_continue; // boundary
+                *out++ = tp;
+                tp.operations[0].operation = operation_continue; // boundary
+                //tp.operations[1].operation = operation_continue; // boundary
+                *out++ = tp;
+
+                return true;
+            }
+        }
+        /*else if ( is_q_spike )
+        {
+            tp.operations[0].is_collinear = true;
+            tp.method = is_version_touches ? method_touch : method_touch_interior;
+            tp.operations[0].operation = operation_continue;
+            tp.operations[1].operation = operation_continue; // boundary
+            *out++ = tp;
+            *out++ = tp;
+
+            return true;
+        }*/
+
+        return false;
+    }
+
+    static inline void replace_method_and_operations_tm(method_type & method,
+                                                        operation_type & op0,
+                                                        operation_type & op1)
+    {
+        if ( op0 == operation_blocked && op1 == operation_blocked )
+        {
+            // NOTE: probably only if methods are WRT IPs, not segments!
+            method = (method == method_touch ? method_equal : method_collinear);
+        }
+
+        // Assuming G1 is always Linear
+        if ( op0 == operation_blocked )
+        {
+            op0 = operation_continue;
+        }
+
+        if ( op1 == operation_blocked )
+        {
+            op1 = operation_continue;
+        }
+        else if ( op1 == operation_intersection )
+        {
+            op1 = operation_union;
+        }
+
+        // spikes in 'm'
+        if ( method == method_error )
+        {
+            method = method_touch_interior;
+            op0 = operation_union;
+            op1 = operation_union;
+        }
+    }
+
+    template <bool IsFront>
+    class turn_transformer_ec
+    {
+    public:
+        explicit turn_transformer_ec(method_type method_t_or_m)
+            : m_method(method_t_or_m)
+        {}
+
+        template <typename Turn>
+        void operator()(Turn & turn) const
+        {
+            operation_type & op0 = turn.operations[0].operation;
+            operation_type & op1 = turn.operations[1].operation;
+
+            // NOTE: probably only if methods are WRT IPs, not segments!
+            if ( BOOST_GEOMETRY_CONDITION(IsFront)
+              || op0 == operation_intersection || op0 == operation_union
+              || op1 == operation_intersection || op1 == operation_union )
+            {
+                turn.method = m_method;
+            }
+
+            turn.operations[0].is_collinear = op0 != operation_blocked;
+
+            // Assuming G1 is always Linear
+            if ( op0 == operation_blocked )
+            {
+                op0 = operation_continue;
+            }
+
+            if ( op1 == operation_blocked )
+            {
+                op1 = operation_continue;
+            }
+            else if ( op1 == operation_intersection )
+            {
+                op1 = operation_union;
+            }
+        }
+
+    private:
+        method_type m_method;
+    };
+
+    static inline void replace_operations_i(operation_type & /*op0*/, operation_type & op1)
+    {
+        // assuming Linear is always the first one
+        op1 = operation_union;
+    }
+
+    // NOTE: Spikes may NOT be handled for Linear endpoints because it's not
+    //       possible to define a spike on an endpoint. Areal geometries must
+    //       NOT have spikes at all. One thing that could be done is to throw
+    //       an exception when spike is detected in Areal geometry.
+    
+    template <bool EnableFirst,
+              bool EnableLast,
+              typename Point1,
+              typename Point2,
+              typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutputIterator>
+    static inline bool get_turn_info_for_endpoint(
+                            Point1 const& pi, Point1 const& /*pj*/, Point1 const& /*pk*/,
+                            Point2 const& qi, Point2 const& /*qj*/, Point2 const& /*qk*/,
+                            bool is_p_first, bool is_p_last,
+                            bool /*is_q_first*/, bool is_q_last,
+                            TurnInfo const& tp_model,
+                            IntersectionInfo const& inters,
+                            method_type /*method*/,
+                            OutputIterator out)
+    {
+        namespace ov = overlay;
+        typedef ov::get_turn_info_for_endpoint<AssignPolicy, EnableFirst, EnableLast> get_info_e;
+
+        const std::size_t ip_count = inters.i_info().count;
+        // no intersection points
+        if ( ip_count == 0 )
+            return false;
+
+        if ( !is_p_first && !is_p_last )
+            return false;
+
+// TODO: is_q_last could probably be replaced by false and removed from parameters
+
+        linear_intersections intersections(pi, qi, inters.result(), is_p_last, is_q_last);
+        linear_intersections::ip_info const& ip0 = intersections.template get<0>();
+        linear_intersections::ip_info const& ip1 = intersections.template get<1>();
+
+        const bool opposite = inters.d_info().opposite;
+
+        // ANALYSE AND ASSIGN FIRST
+
+        // IP on the first point of Linear Geometry
+        bool was_first_point_handled = false;
+        if ( BOOST_GEOMETRY_CONDITION(EnableFirst)
+          && is_p_first && ip0.is_pi && !ip0.is_qi ) // !q0i prevents duplication
+        {
+            TurnInfo tp = tp_model;
+            tp.operations[0].position = position_front;
+            tp.operations[1].position = position_middle;
+
+            if ( opposite ) // opposite -> collinear
+            {
+                tp.operations[0].operation = operation_continue;
+                tp.operations[1].operation = operation_union;
+                tp.method = ip0.is_qj ? method_touch : method_touch_interior;
+            }
+            else
+            {
+                method_type replaced_method = method_touch_interior;
+
+                if ( ip0.is_qj )
+                {
+                    side_calculator
+                        <
+                            typename IntersectionInfo::robust_point1_type,
+                            typename IntersectionInfo::robust_point2_type,
+                            typename IntersectionInfo::robust_point2_type
+                        > side_calc(inters.rqi(), inters.rpi(), inters.rpj(),
+                                    inters.rqi(), inters.rqj(), inters.rqk());
+
+                    std::pair<operation_type, operation_type>
+                        operations = get_info_e::operations_of_equal(side_calc);
+
+                    tp.operations[0].operation = operations.first;
+                    tp.operations[1].operation = operations.second;
+
+                    replaced_method = method_touch;
+                }
+                else
+                {
+                    side_calculator
+                        <
+                            typename IntersectionInfo::robust_point1_type,
+                            typename IntersectionInfo::robust_point2_type,
+                            typename IntersectionInfo::robust_point2_type,
+                            typename IntersectionInfo::robust_point1_type,
+                            typename IntersectionInfo::robust_point1_type,
+                            typename IntersectionInfo::robust_point2_type,
+                            typename IntersectionInfo::robust_point1_type,
+                            typename IntersectionInfo::robust_point2_type
+                        > side_calc(inters.rqi(), inters.rpi(), inters.rpj(),
+                                    inters.rqi(), inters.rpi(), inters.rqj());
+
+                    std::pair<operation_type, operation_type>
+                        operations = get_info_e::operations_of_equal(side_calc);
+
+                    tp.operations[0].operation = operations.first;
+                    tp.operations[1].operation = operations.second;
+                }
+
+                turn_transformer_ec<true> transformer(replaced_method);
+                transformer(tp);
+            }
+
+            // equals<> or collinear<> will assign the second point,
+            // we'd like to assign the first one
+            base_turn_handler::assign_point(tp, tp.method, inters.i_info(), 0);
+
+            // NOTE: is_collinear is not set for the first endpoint of L
+            // for which there is no preceding segment
+            // here is_p_first_ip == true
+            tp.operations[0].is_collinear = false;
+
+            AssignPolicy::apply(tp, pi, qi, inters);
+            *out++ = tp;
+
+            was_first_point_handled = true;
+        }
+
+        // ANALYSE AND ASSIGN LAST
+
+        // IP on the last point of Linear Geometry
+        if ( BOOST_GEOMETRY_CONDITION(EnableLast)
+          && is_p_last
+          && ( ip_count > 1 ? (ip1.is_pj && !ip1.is_qi) : (ip0.is_pj && !ip0.is_qi) ) ) // prevents duplication
+        {
+            TurnInfo tp = tp_model;
+            
+            if ( inters.i_info().count > 1 )
+            {
+                //BOOST_ASSERT( result.template get<1>().dir_a == 0 && result.template get<1>().dir_b == 0 );
+                tp.operations[0].is_collinear = true;
+                tp.operations[1].operation = opposite ? operation_continue : operation_union;
+            }
+            else //if ( result.template get<0>().count == 1 )
+            {
+                side_calculator
+                    <
+                        typename IntersectionInfo::robust_point1_type,
+                        typename IntersectionInfo::robust_point2_type,
+                        typename IntersectionInfo::robust_point2_type
+                    > side_calc(inters.rqi(), inters.rpj(), inters.rpi(),
+                                inters.rqi(), inters.rqj(), inters.rqk());
+
+                std::pair<operation_type, operation_type>
+                    operations = get_info_e::operations_of_equal(side_calc);
+
+                tp.operations[0].operation = operations.first;
+                tp.operations[1].operation = operations.second;
+
+                turn_transformer_ec<false> transformer(method_none);
+                transformer(tp);
+
+                tp.operations[0].is_collinear = tp.both(operation_continue);
+            }
+
+            tp.method = ( ip_count > 1 ? ip1.is_qj : ip0.is_qj ) ? method_touch : method_touch_interior;
+            tp.operations[0].operation = operation_blocked;
+            tp.operations[0].position = position_back;
+            tp.operations[1].position = position_middle;
+            
+            // equals<> or collinear<> will assign the second point,
+            // we'd like to assign the first one
+            unsigned int ip_index = ip_count > 1 ? 1 : 0;
+            base_turn_handler::assign_point(tp, tp.method, inters.i_info(), ip_index);
+
+            AssignPolicy::apply(tp, pi, qi, inters);
+            *out++ = tp;
+
+            // don't ignore the first IP if the segment is opposite
+            return !( opposite && ip_count > 1 ) || was_first_point_handled;
+        }
+
+        // don't ignore anything for now
+        return false;
+    }
+};
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LA_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/get_turn_info_ll.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,744 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LL_HPP
+
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info_for_endpoint.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay {
+
+template<typename AssignPolicy>
+struct get_turn_info_linear_linear
+{
+    static const bool handle_spikes = true;
+
+    template
+    <
+        typename Point1,
+        typename Point2,
+        typename TurnInfo,
+        typename RobustPolicy,
+        typename OutputIterator
+    >
+    static inline OutputIterator apply(
+                Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                bool is_p_first, bool is_p_last,
+                bool is_q_first, bool is_q_last,
+                TurnInfo const& tp_model,
+                RobustPolicy const& robust_policy,
+                OutputIterator out)
+    {
+        typedef intersection_info<Point1, Point2, typename TurnInfo::point_type, RobustPolicy>
+            inters_info;
+
+        inters_info inters(pi, pj, pk, qi, qj, qk, robust_policy);
+
+        char const method = inters.d_info().how;
+
+        // Copy, to copy possibly extended fields
+        TurnInfo tp = tp_model;
+
+        // Select method and apply
+        switch(method)
+        {
+            case 'a' : // collinear, "at"
+            case 'f' : // collinear, "from"
+            case 's' : // starts from the middle
+                get_turn_info_for_endpoint<AssignPolicy, true, true>
+                    ::apply(pi, pj, pk, qi, qj, qk,
+                            is_p_first, is_p_last, is_q_first, is_q_last,
+                            tp_model, inters, method_none, out);
+                break;
+
+            case 'd' : // disjoint: never do anything
+                break;
+
+            case 'm' :
+            {
+                if ( get_turn_info_for_endpoint<AssignPolicy, false, true>
+                        ::apply(pi, pj, pk, qi, qj, qk,
+                                is_p_first, is_p_last, is_q_first, is_q_last,
+                                tp_model, inters, method_touch_interior, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    typedef touch_interior
+                        <
+                            TurnInfo
+                        > policy;
+
+                    // If Q (1) arrives (1)
+                    if ( inters.d_info().arrival[1] == 1)
+                    {
+                        policy::template apply<0>(pi, pj, pk, qi, qj, qk,
+                                                  tp, inters.i_info(), inters.d_info(),
+                                                  inters.sides());
+                    }
+                    else
+                    {
+                        // Swap p/q
+                        side_calculator
+                            <
+                                typename inters_info::robust_point2_type,
+                                typename inters_info::robust_point1_type
+                            > swapped_side_calc(inters.rqi(), inters.rqj(), inters.rqk(),
+                                                inters.rpi(), inters.rpj(), inters.rpk());
+
+                        policy::template apply<1>(qi, qj, qk, pi, pj, pk,
+                                                  tp, inters.i_info(), inters.d_info(),
+                                                  swapped_side_calc);
+                    }
+                    
+                    if ( tp.operations[0].operation == operation_blocked )
+                    {
+                        tp.operations[1].is_collinear = true;
+                    }
+                    if ( tp.operations[1].operation == operation_blocked )
+                    {
+                        tp.operations[0].is_collinear = true;
+                    }
+
+                    replace_method_and_operations_tm(tp.method,
+                                                     tp.operations[0].operation,
+                                                     tp.operations[1].operation);
+                    
+                    AssignPolicy::apply(tp, pi, qi, inters);
+                    *out++ = tp;
+                }
+            }
+            break;
+            case 'i' :
+            {
+                crosses<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                         tp, inters.i_info(), inters.d_info());
+
+                replace_operations_i(tp.operations[0].operation, tp.operations[1].operation);
+
+                AssignPolicy::apply(tp, pi, qi, inters);
+                *out++ = tp;
+            }
+            break;
+            case 't' :
+            {
+                // Both touch (both arrive there)
+                if ( get_turn_info_for_endpoint<AssignPolicy, false, true>
+                        ::apply(pi, pj, pk, qi, qj, qk,
+                                is_p_first, is_p_last, is_q_first, is_q_last,
+                                tp_model, inters, method_touch, out) )
+                {
+                    // do nothing
+                }
+                else 
+                {
+                    touch<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                           tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                    // workarounds for touch<> not taking spikes into account starts here
+                    // those was discovered empirically
+                    // touch<> is not symmetrical!
+                    // P spikes and Q spikes may produce various operations!
+                    // TODO: this is not optimal solution - think about rewriting touch<>
+
+                    if ( tp.operations[0].operation == operation_blocked
+                      && tp.operations[1].operation == operation_blocked )
+                    {
+                        // two touching spikes on the same line
+                        if ( inters.is_spike_p() && inters.is_spike_q() )
+                        {
+                            tp.operations[0].operation = operation_union;
+                            tp.operations[1].operation = operation_union; 
+                        }
+                        else
+                        {
+                            tp.operations[0].is_collinear = true;
+                            tp.operations[1].is_collinear = true;
+                        }
+                    }
+                    else if ( tp.operations[0].operation == operation_blocked )
+                    {
+                        // a spike on P on the same line with Q1
+                        if ( inters.is_spike_p() )
+                        {
+                            if ( inters.sides().qk_wrt_p1() == 0 )
+                            {
+                                tp.operations[0].is_collinear = true;
+                            }
+                            else
+                            {
+                                tp.operations[0].operation = operation_union;                                
+                            }
+                        }
+                        else
+                        {
+                            tp.operations[1].is_collinear = true;
+                        }
+                    }
+                    else if ( tp.operations[1].operation == operation_blocked )
+                    {
+                        // a spike on Q on the same line with P1
+                        if ( inters.is_spike_q() )
+                        {
+                            if ( inters.sides().pk_wrt_q1() == 0 )
+                            {
+                                tp.operations[1].is_collinear = true;
+                            }
+                            else
+                            {
+                                tp.operations[1].operation = operation_union;                                
+                            }
+                        }
+                        else
+                        {
+                            tp.operations[0].is_collinear = true;
+                        }
+                    }
+                    else if ( tp.operations[0].operation == operation_continue
+                           && tp.operations[1].operation == operation_continue )
+                    {
+                        // P spike on the same line with Q2 (opposite)
+                        if ( inters.sides().pk_wrt_q1() == -inters.sides().qk_wrt_q1()
+                          && inters.is_spike_p() )
+                        {
+                            tp.operations[0].operation = operation_union;
+                            tp.operations[1].operation = operation_union; 
+                        }
+                    }
+                    else if ( tp.operations[0].operation == operation_none
+                           && tp.operations[1].operation == operation_none )
+                    {
+                        // spike not handled by touch<>
+                        bool const is_p = inters.is_spike_p();
+                        bool const is_q = inters.is_spike_q();
+
+                        if ( is_p || is_q )
+                        {
+                            tp.operations[0].operation = operation_union;
+                            tp.operations[1].operation = operation_union;
+
+                            if ( inters.sides().pk_wrt_q2() == 0 )
+                            {
+                                tp.operations[0].operation = operation_continue; // will be converted to i
+                                if ( is_p )
+                                {
+                                    tp.operations[0].is_collinear = true;
+                                }
+                            }
+
+                            if ( inters.sides().qk_wrt_p2() == 0 )
+                            {
+                                tp.operations[1].operation = operation_continue; // will be converted to i
+                                if ( is_q )
+                                {
+                                    tp.operations[1].is_collinear = true;
+                                }
+                            }
+                        }
+                    }
+
+                    // workarounds for touch<> not taking spikes into account ends here
+
+                    replace_method_and_operations_tm(tp.method,
+                                                     tp.operations[0].operation,
+                                                     tp.operations[1].operation);
+
+// TODO: move this into the append_xxx and call for each turn?
+                    AssignPolicy::apply(tp, pi, qi, inters);
+
+                    if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                      || ! append_opposite_spikes<append_touches>(tp, inters,
+                                                                  is_p_last, is_q_last,
+                                                                  out) )
+                    {
+                        *out++ = tp;
+                    }
+                }
+            }
+            break;
+            case 'e':
+            {
+                if ( get_turn_info_for_endpoint<AssignPolicy, true, true>
+                        ::apply(pi, pj, pk, qi, qj, qk,
+                                is_p_first, is_p_last, is_q_first, is_q_last,
+                                tp_model, inters, method_equal, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    tp.operations[0].is_collinear = true;
+                    tp.operations[1].is_collinear = true;
+
+                    if ( ! inters.d_info().opposite )
+                    {
+                        // Both equal
+                        // or collinear-and-ending at intersection point
+                        equal<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                            tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                        operation_type spike_op
+                            = ( tp.operations[0].operation != operation_continue
+                             || tp.operations[1].operation != operation_continue ) ?
+                                operation_union :
+                                operation_continue;
+
+                        // transform turn
+                        turn_transformer_ec transformer(method_touch);
+                        transformer(tp);
+
+// TODO: move this into the append_xxx and call for each turn?
+                        AssignPolicy::apply(tp, pi, qi, inters);
+
+                        // conditionally handle spikes
+                        if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                          || ! append_collinear_spikes(tp, inters,
+                                                       is_p_last, is_q_last,
+                                                       method_touch, spike_op,
+                                                       out) )
+                        {
+                            *out++ = tp; // no spikes
+                        }
+                    }
+                    else
+                    {
+                        // TODO: ignore for spikes or generate something else than opposite?
+
+                        equal_opposite
+                            <
+                                TurnInfo,
+                                AssignPolicy
+                            >::apply(pi, qi, tp, out, inters);
+                    }
+                }
+            }
+            break;
+            case 'c' :
+            {
+                // Collinear
+                if ( get_turn_info_for_endpoint<AssignPolicy, true, true>
+                        ::apply(pi, pj, pk, qi, qj, qk,
+                                is_p_first, is_p_last, is_q_first, is_q_last,
+                                tp_model, inters, method_collinear, out) )
+                {
+                    // do nothing
+                }
+                else
+                {
+                    // NOTE: this is for spikes since those are set in the turn_transformer_ec
+                    tp.operations[0].is_collinear = true;
+                    tp.operations[1].is_collinear = true;
+
+                    if ( ! inters.d_info().opposite )
+                    {
+                        method_type method_replace = method_touch_interior;
+                        operation_type spike_op = operation_continue;
+
+                        if ( inters.d_info().arrival[0] == 0 )
+                        {
+                            // Collinear, but similar thus handled as equal
+                            equal<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                    tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                            method_replace = method_touch;
+                            if ( tp.operations[0].operation != operation_continue
+                              || tp.operations[1].operation != operation_continue )
+                            {
+                                spike_op = operation_union;
+                            }
+                        }
+                        else
+                        {
+                            collinear<TurnInfo>::apply(pi, pj, pk, qi, qj, qk,
+                                    tp, inters.i_info(), inters.d_info(), inters.sides());
+
+                            //method_replace = method_touch_interior;
+                            //spike_op = operation_continue;
+                        }
+
+                        // transform turn
+                        turn_transformer_ec transformer(method_replace);
+                        transformer(tp);
+                        
+// TODO: move this into the append_xxx and call for each turn?
+                        AssignPolicy::apply(tp, pi, qi, inters);
+
+                        // conditionally handle spikes
+                        if ( ! BOOST_GEOMETRY_CONDITION(handle_spikes)
+                          || ! append_collinear_spikes(tp, inters,
+                                                       is_p_last, is_q_last,
+                                                       method_replace, spike_op,
+                                                       out) )
+                        {
+                            // no spikes
+                            *out++ = tp;
+                        }
+                    }
+                    else
+                    {
+                        // If this always 'm' ?
+                        turn_transformer_ec transformer(method_touch_interior);
+
+                        // conditionally handle spikes
+                        if ( BOOST_GEOMETRY_CONDITION(handle_spikes) )
+                        {
+                            append_opposite_spikes<append_collinear_opposite>(tp, inters,
+                                                                              is_p_last, is_q_last,
+                                                                              out);
+                        }
+
+                        // TODO: ignore for spikes?
+                        //       E.g. pass is_p_valid = !is_p_last && !is_pj_spike,
+                        //       the same with is_q_valid
+
+                        collinear_opposite
+                            <
+                                TurnInfo,
+                                AssignPolicy
+                            >::apply(pi, pj, pk, qi, qj, qk,
+                                tp, out, inters, inters.sides(),
+                                transformer, !is_p_last, !is_q_last);
+                    }
+                }
+            }
+            break;
+            case '0' :
+            {
+                // degenerate points
+                if ( BOOST_GEOMETRY_CONDITION(AssignPolicy::include_degenerate) )
+                {
+                    only_convert::apply(tp, inters.i_info());
+
+                    // if any, only one of those should be true
+                    if ( is_p_first
+                      && equals::equals_point_point(pi, tp.point) )
+                    {
+                        tp.operations[0].position = position_front;
+                    }
+                    else if ( is_p_last
+                           && equals::equals_point_point(pj, tp.point) )
+                    {
+                        tp.operations[0].position = position_back;
+                    }
+                    else if ( is_q_first
+                           && equals::equals_point_point(qi, tp.point) )
+                    {
+                        tp.operations[1].position = position_front;
+                    }
+                    else if ( is_q_last
+                           && equals::equals_point_point(qj, tp.point) )
+                    {
+                        tp.operations[1].position = position_back;
+                    }
+
+                    AssignPolicy::apply(tp, pi, qi, inters);
+                    *out++ = tp;
+                }
+            }
+            break;
+            default :
+            {
+#if defined(BOOST_GEOMETRY_DEBUG_ROBUSTNESS)
+                std::cout << "TURN: Unknown method: " << method << std::endl;
+#endif
+#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
+                throw turn_info_exception(method);
+#endif
+            }
+            break;
+        }
+
+        return out;
+    }
+
+    template <typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutIt>
+    static inline bool append_collinear_spikes(TurnInfo & tp,
+                                               IntersectionInfo const& inters_info,
+                                               bool is_p_last, bool is_q_last,
+                                               method_type method, operation_type spike_op,
+                                               OutIt out)
+    {
+        // method == touch || touch_interior
+        // both position == middle
+
+        bool is_p_spike = tp.operations[0].operation == spike_op
+                       && ! is_p_last
+                       && inters_info.is_spike_p();
+        bool is_q_spike = tp.operations[1].operation == spike_op
+                       && ! is_q_last
+                       && inters_info.is_spike_q();
+
+        if ( is_p_spike && is_q_spike )
+        {
+            if ( tp.method == method_equal
+              && tp.operations[0].operation == operation_continue
+              && tp.operations[1].operation == operation_continue )
+            {
+                // treat both non-opposite collinear spikes as no-spikes
+                return false;
+            }
+
+            tp.method = method;
+            tp.operations[0].operation = operation_blocked;
+            tp.operations[1].operation = operation_blocked;
+            *out++ = tp;
+            tp.operations[0].operation = operation_intersection;
+            tp.operations[1].operation = operation_intersection;
+            *out++ = tp;
+
+            return true;
+        }
+        else if ( is_p_spike )
+        {
+            tp.method = method;
+            tp.operations[0].operation = operation_blocked;
+            tp.operations[1].operation = operation_union;
+            *out++ = tp;
+            tp.operations[0].operation = operation_intersection;
+            //tp.operations[1].operation = operation_union;
+            *out++ = tp;
+
+            return true;
+        }
+        else if ( is_q_spike )
+        {
+            tp.method = method;
+            tp.operations[0].operation = operation_union;
+            tp.operations[1].operation = operation_blocked;
+            *out++ = tp;
+            //tp.operations[0].operation = operation_union;
+            tp.operations[1].operation = operation_intersection;
+            *out++ = tp;
+
+            return true;
+        }
+        
+        return false;
+    }
+
+    enum append_version { append_touches, append_collinear_opposite };
+
+    template <append_version Version,
+              typename TurnInfo,
+              typename IntersectionInfo,
+              typename OutIt>
+    static inline bool append_opposite_spikes(TurnInfo & tp,
+                                              IntersectionInfo const& inters,
+                                              bool is_p_last, bool is_q_last,
+                                              OutIt out)
+    {
+        static const bool is_version_touches = (Version == append_touches);
+
+        bool is_p_spike = ( is_version_touches ?
+                            ( tp.operations[0].operation == operation_continue
+                           || tp.operations[0].operation == operation_intersection ) :
+                            true )
+                       && ! is_p_last
+                       && inters.is_spike_p();
+        bool is_q_spike = ( is_version_touches ?
+                            ( tp.operations[1].operation == operation_continue
+                           || tp.operations[1].operation == operation_intersection ) :
+                            true )
+                       && ! is_q_last
+                       && inters.is_spike_q();
+
+        bool res = false;
+
+        if ( is_p_spike
+          && ( BOOST_GEOMETRY_CONDITION(is_version_touches)
+            || inters.d_info().arrival[0] == 1 ) )
+        {
+            if ( BOOST_GEOMETRY_CONDITION(is_version_touches) )
+            {
+                tp.operations[0].is_collinear = true;
+                tp.operations[1].is_collinear = false;
+                tp.method = method_touch;
+            }
+            else // Version == append_collinear_opposite
+            {
+                tp.operations[0].is_collinear = true;
+                tp.operations[1].is_collinear = false;
+                
+                BOOST_ASSERT(inters.i_info().count > 1);
+                
+                base_turn_handler::assign_point(tp, method_touch_interior,
+                                                inters.i_info(), 1);
+
+                AssignPolicy::apply(tp, inters.pi(), inters.qi(), inters);
+            }
+
+            tp.operations[0].operation = operation_blocked;
+            tp.operations[1].operation = operation_intersection;
+            *out++ = tp;
+            tp.operations[0].operation = operation_intersection;
+            //tp.operations[1].operation = operation_intersection;
+            *out++ = tp;
+
+            res = true;
+        }
+
+        if ( is_q_spike
+          && ( BOOST_GEOMETRY_CONDITION(is_version_touches)
+            || inters.d_info().arrival[1] == 1 ) )
+        {
+            if ( BOOST_GEOMETRY_CONDITION(is_version_touches) )
+            {
+                tp.operations[0].is_collinear = false;
+                tp.operations[1].is_collinear = true;
+                tp.method = method_touch;
+            }
+            else // Version == append_collinear_opposite
+            {
+                tp.operations[0].is_collinear = false;
+                tp.operations[1].is_collinear = true;
+                
+                BOOST_ASSERT(inters.i_info().count > 0);
+
+                base_turn_handler::assign_point(tp, method_touch_interior, inters.i_info(), 0);
+
+                AssignPolicy::apply(tp, inters.pi(), inters.qi(), inters);
+            }
+
+            tp.operations[0].operation = operation_intersection;
+            tp.operations[1].operation = operation_blocked;
+            *out++ = tp;
+            //tp.operations[0].operation = operation_intersection;
+            tp.operations[1].operation = operation_intersection;
+            *out++ = tp;
+
+            res = true;
+        }
+        
+        return res;
+    }
+
+    static inline void replace_method_and_operations_tm(method_type & method,
+                                                        operation_type & op0,
+                                                        operation_type & op1)
+    {
+        if ( op0 == operation_blocked && op1 == operation_blocked )
+        {
+            // NOTE: probably only if methods are WRT IPs, not segments!
+            method = (method == method_touch ? method_equal : method_collinear);
+            op0 = operation_continue;
+            op1 = operation_continue;
+        }
+        else
+        {
+            if ( op0 == operation_continue || op0 == operation_blocked )
+            {
+                op0 = operation_intersection;
+            }
+            else if ( op0 == operation_intersection )
+            {
+                op0 = operation_union;
+            }
+
+            if ( op1 == operation_continue || op1 == operation_blocked )
+            {
+                op1 = operation_intersection;
+            }
+            else if ( op1 == operation_intersection )
+            {
+                op1 = operation_union;
+            }
+
+            // spikes in 'm'
+            if ( method == method_error )
+            {
+                method = method_touch_interior;
+                op0 = operation_union;
+                op1 = operation_union;
+            }
+        }
+    }
+
+    class turn_transformer_ec
+    {
+    public:
+        explicit turn_transformer_ec(method_type method_t_or_m)
+            : m_method(method_t_or_m)
+        {}
+
+        template <typename Turn>
+        void operator()(Turn & turn) const
+        {
+            operation_type & op0 = turn.operations[0].operation;
+            operation_type & op1 = turn.operations[1].operation;
+
+            BOOST_ASSERT(op0 != operation_blocked || op1 != operation_blocked );
+
+            if ( op0 == operation_blocked )
+            {
+                op0 = operation_intersection;
+            }
+            else if ( op0 == operation_intersection )
+            {
+                op0 = operation_union;
+            }
+
+            if ( op1 == operation_blocked )
+            {
+                op1 = operation_intersection;
+            }
+            else if ( op1 == operation_intersection )
+            {
+                op1 = operation_union;
+            }
+
+            if ( op0 == operation_intersection || op0 == operation_union
+              || op1 == operation_intersection || op1 == operation_union )
+            {
+                turn.method = m_method;
+            }
+
+// TODO: is this correct?
+//       it's equivalent to comparing to operation_blocked at the beginning of the function
+            turn.operations[0].is_collinear = op0 != operation_intersection;
+            turn.operations[1].is_collinear = op1 != operation_intersection;
+        }
+
+    private:
+        method_type m_method;
+    };
+
+    static inline void replace_operations_i(operation_type & op0, operation_type & op1)
+    {
+        if ( op0 == operation_intersection )
+        {
+            op0 = operation_union;
+        }
+
+        if ( op1 == operation_intersection )
+        {
+            op1 = operation_union;
+        }
+    }
+};
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_TURN_INFO_LL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,84 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INTERSECTION_BOX_BOX_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INTERSECTION_BOX_BOX_HPP
+
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace intersection
+{
+
+template <std::size_t Dimension, std::size_t DimensionCount>
+struct intersection_box_box
+{
+    template
+    <
+        typename Box1, typename Box2,
+        typename RobustPolicy,
+        typename BoxOut,
+        typename Strategy
+    >
+    static inline bool apply(Box1 const& box1,
+            Box2 const& box2,
+            RobustPolicy const& robust_policy,
+            BoxOut& box_out,
+            Strategy const& strategy)
+    {
+        typedef typename coordinate_type<BoxOut>::type ct;
+
+        ct min1 = get<min_corner, Dimension>(box1);
+        ct min2 = get<min_corner, Dimension>(box2);
+        ct max1 = get<max_corner, Dimension>(box1);
+        ct max2 = get<max_corner, Dimension>(box2);
+
+        if (max1 < min2 || max2 < min1)
+        {
+            return false;
+        }
+        // Set dimensions of output coordinate
+        set<min_corner, Dimension>(box_out, min1 < min2 ? min2 : min1);
+        set<max_corner, Dimension>(box_out, max1 > max2 ? max2 : max1);
+
+        return intersection_box_box<Dimension + 1, DimensionCount>
+               ::apply(box1, box2, robust_policy, box_out, strategy);
+    }
+};
+
+template <std::size_t DimensionCount>
+struct intersection_box_box<DimensionCount, DimensionCount>
+{
+    template
+    <
+        typename Box1, typename Box2,
+        typename RobustPolicy,
+        typename BoxOut,
+        typename Strategy
+    >
+    static inline bool apply(Box1 const&, Box2 const&,
+            RobustPolicy const&, BoxOut&, Strategy const&)
+    {
+        return true;
+    }
+};
+
+
+}} // namespace detail::intersection
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INTERSECTION_BOX_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/linear_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,325 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_LINEAR_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_LINEAR_LINEAR_HPP
+
+#include <algorithm>
+#include <vector>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/turns.hpp>
+
+#include <boost/geometry/algorithms/detail/turns/compare_turns.hpp>
+#include <boost/geometry/algorithms/detail/turns/filter_continue_turns.hpp>
+#include <boost/geometry/algorithms/detail/turns/remove_duplicate_turns.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
+#include <boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp>
+
+#include <boost/geometry/algorithms/convert.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+
+template
+<
+    typename LineStringOut,
+    overlay_type OverlayType,
+    typename Geometry,
+    typename GeometryTag
+>
+struct linear_linear_no_intersections;
+
+
+template <typename LineStringOut, typename LineString>
+struct linear_linear_no_intersections
+    <
+        LineStringOut, overlay_difference, LineString, linestring_tag
+    >
+{
+    template <typename OutputIterator>
+    static inline OutputIterator apply(LineString const& linestring,
+                                       OutputIterator oit)
+    {
+        LineStringOut ls_out;
+        geometry::convert(linestring, ls_out);
+        *oit++ = ls_out;
+        return oit;
+    }
+};
+
+
+template <typename LineStringOut, typename MultiLineString>
+struct linear_linear_no_intersections
+    <
+        LineStringOut,
+        overlay_difference,
+        MultiLineString,
+        multi_linestring_tag
+    >
+{
+    template <typename OutputIterator>
+    static inline OutputIterator apply(MultiLineString const& multilinestring,
+                                       OutputIterator oit)
+    {
+        for (typename boost::range_iterator<MultiLineString const>::type
+                 it = boost::begin(multilinestring);
+             it != boost::end(multilinestring); ++it)
+        {
+            LineStringOut ls_out;
+            geometry::convert(*it, ls_out);
+            *oit++ = ls_out;
+        }
+        return oit;
+    }
+};
+
+
+template <typename LineStringOut, typename Geometry, typename GeometryTag>
+struct linear_linear_no_intersections
+    <
+        LineStringOut, overlay_intersection, Geometry, GeometryTag
+    >
+{
+    template <typename OutputIterator>
+    static inline OutputIterator apply(Geometry const&,
+                                       OutputIterator oit)
+    {
+        return oit;
+    }
+};
+
+
+
+
+
+
+
+template
+<
+    typename Linear1,
+    typename Linear2,
+    typename LinestringOut,
+    overlay_type OverlayType,
+    bool EnableFilterContinueTurns = false,
+    bool EnableRemoveDuplicateTurns = false,
+    bool EnableDegenerateTurns = true,
+#ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
+    bool EnableFollowIsolatedPoints = false
+#else
+    bool EnableFollowIsolatedPoints = true
+#endif
+>
+class linear_linear_linestring
+{
+protected:
+    struct assign_policy
+    {
+        static bool const include_no_turn = false;
+        static bool const include_degenerate = EnableDegenerateTurns;
+        static bool const include_opposite = false;
+
+        template
+        <
+            typename Info,
+            typename Point1,
+            typename Point2,
+            typename IntersectionInfo
+        >
+        static inline void apply(Info& , Point1 const& , Point2 const& ,
+                                 IntersectionInfo const& )
+        {
+        }
+    };
+
+
+    template
+    <
+        typename Turns,
+        typename LinearGeometry1,
+        typename LinearGeometry2
+    >
+    static inline void compute_turns(Turns& turns,
+                                     LinearGeometry1 const& linear1,
+                                     LinearGeometry2 const& linear2)
+    {
+        turns.clear();
+        geometry::detail::relate::turns::get_turns
+            <
+                LinearGeometry1,
+                LinearGeometry2,
+                detail::get_turns::get_turn_info_type
+                <
+                    LinearGeometry1,
+                    LinearGeometry2,
+                    assign_policy
+                >
+            >::apply(turns, linear1, linear2);
+    }
+
+
+    template
+    <
+        overlay_type OverlayTypeForFollow,
+        bool FollowIsolatedPoints,
+        typename Turns,
+        typename LinearGeometry1,
+        typename LinearGeometry2,
+        typename OutputIterator
+    >
+    static inline OutputIterator
+    sort_and_follow_turns(Turns& turns,
+                          LinearGeometry1 const& linear1,
+                          LinearGeometry2 const& linear2,
+                          OutputIterator oit)
+    {
+        // remove turns that have no added value
+        turns::filter_continue_turns
+            <
+                Turns,
+                EnableFilterContinueTurns && OverlayType != overlay_intersection
+            >::apply(turns);
+
+        // sort by seg_id, distance, and operation
+        std::sort(boost::begin(turns), boost::end(turns),
+                  detail::turns::less_seg_fraction_other_op<>());
+
+        // remove duplicate turns
+        turns::remove_duplicate_turns
+            <
+                Turns, EnableRemoveDuplicateTurns
+            >::apply(turns);
+
+        return detail::overlay::following::linear::follow
+            <
+                LinestringOut,
+                LinearGeometry1,
+                LinearGeometry2,
+                OverlayTypeForFollow,
+                FollowIsolatedPoints,
+                !EnableFilterContinueTurns || OverlayType == overlay_intersection
+            >::apply(linear1, linear2, boost::begin(turns), boost::end(turns),
+                     oit);
+    }
+
+public:
+    template
+    <
+        typename RobustPolicy, typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(Linear1 const& linear1,
+                                       Linear2 const& linear2,
+                                       RobustPolicy const&,
+                                       OutputIterator oit,
+                                       Strategy const& )
+    {
+        typedef typename detail::relate::turns::get_turns
+            <
+                Linear1, Linear2
+            >::turn_info turn_info;
+
+        typedef std::vector<turn_info> turns_container;
+
+        turns_container turns;
+        compute_turns(turns, linear1, linear2);
+
+        if ( turns.empty() )
+        {
+            // the two linear geometries are disjoint
+            return linear_linear_no_intersections
+                <
+                    LinestringOut,
+                    OverlayType,
+                    Linear1,
+                    typename tag<Linear1>::type
+                >::apply(linear1, oit);
+        }
+
+        return sort_and_follow_turns
+            <
+                OverlayType,
+                EnableFollowIsolatedPoints
+                && OverlayType == overlay_intersection
+            >(turns, linear1, linear2, oit);
+    }
+};
+
+
+
+
+template
+<
+    typename Linear1,
+    typename Linear2,
+    typename LinestringOut,
+    bool EnableFilterContinueTurns,
+    bool EnableRemoveDuplicateTurns,
+    bool EnableDegenerateTurns,
+    bool EnableFollowIsolatedPoints
+>
+struct linear_linear_linestring
+    <
+        Linear1, Linear2, LinestringOut, overlay_union,
+        EnableFilterContinueTurns, EnableRemoveDuplicateTurns,
+        EnableDegenerateTurns, EnableFollowIsolatedPoints
+    >
+{
+    template
+    <
+        typename RobustPolicy, typename OutputIterator, typename Strategy
+    >
+    static inline OutputIterator apply(Linear1 const& linear1,
+                                       Linear2 const& linear2,
+                                       RobustPolicy const& robust_policy,
+                                       OutputIterator oit,
+                                       Strategy const& strategy)
+    {
+        oit = linear_linear_no_intersections
+            <
+                LinestringOut,
+                overlay_difference,
+                Linear1,
+                typename tag<Linear1>::type
+            >::apply(linear1, oit);
+
+        return linear_linear_linestring
+            <
+                Linear2, Linear1, LinestringOut, overlay_difference,
+                EnableFilterContinueTurns, EnableRemoveDuplicateTurns,
+                EnableDegenerateTurns, EnableFollowIsolatedPoints
+            >::apply(linear2, linear1, robust_policy, oit, strategy);
+    }
+};
+
+
+
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_LINEAR_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,435 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_POINTLIKE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_POINTLIKE_HPP
+
+#include <algorithm>
+#include <vector>
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/convert.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/less.hpp>
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+
+// struct for copying points of the pointlike geometries to output
+template
+<
+    typename PointOut,
+    typename GeometryIn,
+    typename TagIn = typename tag<GeometryIn>::type
+>
+struct copy_points
+    : not_implemented<PointOut, GeometryIn>
+{};
+
+template <typename PointOut, typename PointIn>
+struct copy_points<PointOut, PointIn, point_tag>
+{
+    template <typename OutputIterator>
+    static inline void apply(PointIn const& point_in,
+                             OutputIterator& oit)
+    {
+        PointOut point_out;
+        geometry::convert(point_in, point_out);
+        *oit++ = point_out;
+    }
+};
+
+
+template <typename PointOut, typename MultiPointIn>
+struct copy_points<PointOut, MultiPointIn, multi_point_tag>
+{
+    template <typename OutputIterator>
+    static inline void apply(MultiPointIn const& multi_point_in,
+                             OutputIterator& oit)
+    {
+        for (typename boost::range_iterator<MultiPointIn const>::type
+                 it = boost::begin(multi_point_in);
+             it != boost::end(multi_point_in); ++it)
+        {
+            PointOut point_out;
+            geometry::convert(*it, point_out);
+            *oit++ = point_out;
+        }
+    }
+};
+
+
+
+// action struct for difference/intersection
+template <typename PointOut, overlay_type OverlayType>
+struct action_selector_pl_pl
+{};
+
+template <typename PointOut>
+struct action_selector_pl_pl<PointOut, overlay_intersection>
+{
+    template
+    <
+        typename Point,
+        typename OutputIterator
+    >
+    static inline void apply(Point const& point,
+                             bool is_common,
+                             OutputIterator& oit)
+    {
+        if ( is_common )
+        {
+            copy_points<PointOut, Point>::apply(point, oit);
+        }
+    }
+};
+
+
+
+template <typename PointOut>
+struct action_selector_pl_pl<PointOut, overlay_difference>
+{
+    template
+    <
+        typename Point,
+        typename OutputIterator
+    >
+    static inline void apply(Point const& point,
+                             bool is_common,
+                             OutputIterator& oit)
+    {
+        if ( !is_common )
+        {
+            copy_points<PointOut, Point>::apply(point, oit);
+        }
+    }
+};
+
+
+//===========================================================================
+
+// difference/intersection of point-point
+template
+<
+    typename Point1,
+    typename Point2,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct point_point_point
+{
+    template <typename RobustPolicy, typename OutputIterator, typename Strategy>
+    static inline OutputIterator apply(Point1 const& point1,
+                                       Point2 const& point2,
+                                       RobustPolicy const& ,
+                                       OutputIterator oit,
+                                       Strategy const&)
+    {
+        action_selector_pl_pl
+            <
+                PointOut, OverlayType
+            >::apply(point1,
+                     detail::equals::equals_point_point(point1, point2),
+                     oit);
+
+        return oit;
+    }
+};
+
+
+
+// difference of multipoint-point
+//
+// the apply method in the following struct is called only for
+// difference; for intersection the reversal will
+// always call the point-multipoint version
+template
+<
+    typename MultiPoint,
+    typename Point,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct multipoint_point_point
+{
+    template <typename RobustPolicy, typename OutputIterator, typename Strategy>
+    static inline OutputIterator apply(MultiPoint const& multipoint,
+                                       Point const& point,
+                                       RobustPolicy const& ,
+                                       OutputIterator oit,
+                                       Strategy const&)
+    {
+        BOOST_ASSERT( OverlayType == overlay_difference );
+
+        for (typename boost::range_iterator<MultiPoint const>::type
+                 it = boost::begin(multipoint);
+             it != boost::end(multipoint); ++it)
+        {
+            action_selector_pl_pl
+                <
+                    PointOut, OverlayType
+                >::apply(*it,
+                         detail::equals::equals_point_point(*it, point),
+                         oit);
+        }
+
+        return oit;
+    }
+};
+
+
+// difference/intersection of point-multipoint
+template
+<
+    typename Point,
+    typename MultiPoint,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct point_multipoint_point
+{
+    template <typename RobustPolicy, typename OutputIterator, typename Strategy>
+    static inline OutputIterator apply(Point const& point,
+                                       MultiPoint const& multipoint,
+                                       RobustPolicy const& ,
+                                       OutputIterator oit,
+                                       Strategy const&)
+    {
+        typedef action_selector_pl_pl<PointOut, OverlayType> action;
+
+        for (typename boost::range_iterator<MultiPoint const>::type
+                 it = boost::begin(multipoint);
+             it != boost::end(multipoint); ++it)
+        {
+            if ( detail::equals::equals_point_point(*it, point) )
+            {
+                action::apply(point, true, oit);
+                return oit;
+            }
+        }
+
+        action::apply(point, false, oit);
+        return oit;
+    }
+};
+
+
+
+// difference/intersection of multipoint-multipoint
+template
+<
+    typename MultiPoint1,
+    typename MultiPoint2,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct multipoint_multipoint_point
+{
+    template <typename RobustPolicy, typename OutputIterator, typename Strategy>
+    static inline OutputIterator apply(MultiPoint1 const& multipoint1,
+                                       MultiPoint2 const& multipoint2,
+                                       RobustPolicy const& robust_policy,
+                                       OutputIterator oit,
+                                       Strategy const& strategy)
+    {
+        if ( OverlayType != overlay_difference
+             && boost::size(multipoint1) > boost::size(multipoint2) )
+        {
+            return multipoint_multipoint_point
+                <
+                    MultiPoint2, MultiPoint1, PointOut, OverlayType
+                >::apply(multipoint2, multipoint1, robust_policy, oit, strategy);
+        }
+
+        std::vector<typename point_type<MultiPoint2>::type>
+            points2(boost::begin(multipoint2), boost::end(multipoint2));
+
+        std::sort(points2.begin(), points2.end(), detail::relate::less());
+
+        for (typename boost::range_iterator<MultiPoint1 const>::type
+                 it1 = boost::begin(multipoint1);
+             it1 != boost::end(multipoint1); ++it1)
+        {
+            bool found = std::binary_search(points2.begin(), points2.end(),
+                                            *it1, detail::relate::less());
+
+            action_selector_pl_pl
+                <
+                    PointOut, OverlayType
+                >::apply(*it1, found, oit);
+        }
+        return oit;
+    }
+};
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+
+//===========================================================================
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch { namespace overlay
+{
+
+// dispatch struct for pointlike-pointlike difference/intersection
+// computation
+template
+<
+    typename PointLike1,
+    typename PointLike2,
+    typename PointOut,
+    overlay_type OverlayType,
+    typename Tag1,
+    typename Tag2
+>
+struct pointlike_pointlike_point
+    : not_implemented<PointLike1, PointLike2, PointOut>
+{};
+
+
+template
+<
+    typename Point1,
+    typename Point2,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct pointlike_pointlike_point
+    <
+        Point1, Point2, PointOut, OverlayType,
+        point_tag, point_tag
+    > : detail::overlay::point_point_point
+        <
+            Point1, Point2, PointOut, OverlayType
+        >
+{};
+
+
+template
+<
+    typename Point,
+    typename MultiPoint,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct pointlike_pointlike_point
+    <
+        Point, MultiPoint, PointOut, OverlayType,
+        point_tag, multi_point_tag
+    > : detail::overlay::point_multipoint_point
+        <
+            Point, MultiPoint, PointOut, OverlayType
+        >
+{};
+
+
+template
+<
+    typename MultiPoint,
+    typename Point,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct pointlike_pointlike_point
+    <
+        MultiPoint, Point, PointOut, OverlayType,
+        multi_point_tag, point_tag
+    > : detail::overlay::multipoint_point_point
+        <
+            MultiPoint, Point, PointOut, OverlayType
+        >
+{};
+
+
+template
+<
+    typename MultiPoint1,
+    typename MultiPoint2,
+    typename PointOut,
+    overlay_type OverlayType
+>
+struct pointlike_pointlike_point
+    <
+        MultiPoint1, MultiPoint2, PointOut, OverlayType,
+        multi_point_tag, multi_point_tag
+    > : detail::overlay::multipoint_multipoint_point
+        <
+            MultiPoint1, MultiPoint2, PointOut, OverlayType
+        >
+{};
+
+
+}} // namespace detail_dispatch::overlay
+#endif // DOXYGEN_NO_DISPATCH
+
+
+//===========================================================================
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+
+// generic pointlike-pointlike union implementation
+template
+<
+    typename PointLike1,
+    typename PointLike2,
+    typename PointOut
+>
+struct union_pointlike_pointlike_point
+{
+    template <typename RobustPolicy, typename OutputIterator, typename Strategy>
+    static inline OutputIterator apply(PointLike1 const& pointlike1,
+                                       PointLike2 const& pointlike2,
+                                       RobustPolicy const& robust_policy,
+                                       OutputIterator oit,
+                                       Strategy const& strategy)
+    {
+        copy_points<PointOut, PointLike1>::apply(pointlike1, oit);
+
+        return detail_dispatch::overlay::pointlike_pointlike_point
+            <
+                PointLike2, PointLike1, PointOut, overlay_difference,
+                typename tag<PointLike2>::type,
+                typename tag<PointLike1>::type
+            >::apply(pointlike2, pointlike1, robust_policy, oit, strategy);
+    }
+
+};
+
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_POINTLIKE_POINTLIKE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/recalculate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,231 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RECALCULATE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RECALCULATE_HPP
+
+
+#include <cstddef>
+
+#include <boost/concept/requires.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/numeric/conversion/bounds.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/type_traits.hpp>
+
+#include <boost/geometry/arithmetic/arithmetic.hpp>
+#include <boost/geometry/algorithms/append.hpp>
+#include <boost/geometry/algorithms/clear.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace recalculate
+{
+
+template <std::size_t Dimension>
+struct recalculate_point
+{
+    template <typename Point1, typename Point2, typename Strategy>
+    static inline void apply(Point1& point1, Point2 const& point2, Strategy const& strategy)
+    {
+        std::size_t const dim = Dimension - 1;
+        geometry::set<dim>(point1, strategy.template apply<dim>(geometry::get<dim>(point2)));
+        recalculate_point<dim>::apply(point1, point2, strategy);
+    }
+};
+
+template <>
+struct recalculate_point<0>
+{
+    template <typename Point1, typename Point2, typename Strategy>
+    static inline void apply(Point1&, Point2 const&, Strategy const&)
+    {
+    }
+};
+
+
+template <std::size_t Dimension>
+struct recalculate_indexed
+{
+    template <typename Geometry1, typename Geometry2, typename Strategy>
+    static inline void apply(Geometry1& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        // Do it for both indices in one dimension
+        static std::size_t const dim = Dimension - 1;
+        geometry::set<0, dim>(geometry1, strategy.template apply<dim>(geometry::get<0, dim>(geometry2)));
+        geometry::set<1, dim>(geometry1, strategy.template apply<dim>(geometry::get<1, dim>(geometry2)));
+        recalculate_indexed<dim>::apply(geometry1, geometry2, strategy);
+    }
+};
+
+template <>
+struct recalculate_indexed<0>
+{
+
+    template <typename Geometry1, typename Geometry2, typename Strategy>
+    static inline void apply(Geometry1& , Geometry2 const& , Strategy const& )
+    {
+    }
+};
+
+struct range_to_range
+{
+    template
+    <
+        typename Range1,
+        typename Range2,
+        typename Strategy
+    >
+    static inline void apply(Range1& destination, Range2 const& source,
+            Strategy const& strategy)
+    {
+        typedef typename geometry::point_type<Range2>::type point_type;
+        typedef recalculate_point<geometry::dimension<point_type>::value> per_point;
+        geometry::clear(destination);
+
+        for (typename boost::range_iterator<Range2 const>::type it
+                = boost::begin(source);
+            it != boost::end(source);
+            ++it)
+        {
+            point_type p;
+            per_point::apply(p, *it, strategy);
+            geometry::append(destination, p);
+        }
+    }
+};
+
+struct polygon_to_polygon
+{
+private:
+    template
+    <
+        typename IteratorIn,
+        typename IteratorOut,
+        typename Strategy
+    >
+    static inline void iterate(IteratorIn begin, IteratorIn end,
+                    IteratorOut it_out,
+                    Strategy const& strategy)
+    {
+        for (IteratorIn it_in = begin; it_in != end;  ++it_in, ++it_out)
+        {
+            range_to_range::apply(*it_out, *it_in, strategy);
+        }
+    }
+
+    template
+    <
+        typename InteriorRingsOut,
+        typename InteriorRingsIn,
+        typename Strategy
+    >
+    static inline void apply_interior_rings(
+                    InteriorRingsOut& interior_rings_out,
+                    InteriorRingsIn const& interior_rings_in,
+                    Strategy const& strategy)
+    {
+        traits::resize<InteriorRingsOut>::apply(interior_rings_out,
+            boost::size(interior_rings_in));
+
+        iterate(
+            boost::begin(interior_rings_in), boost::end(interior_rings_in),
+            boost::begin(interior_rings_out),
+            strategy);
+    }
+
+public:
+    template
+    <
+        typename Polygon1,
+        typename Polygon2,
+        typename Strategy
+    >
+    static inline void apply(Polygon1& destination, Polygon2 const& source,
+            Strategy const& strategy)
+    {
+        range_to_range::apply(geometry::exterior_ring(destination),
+            geometry::exterior_ring(source), strategy);
+
+        apply_interior_rings(geometry::interior_rings(destination),
+            geometry::interior_rings(source), strategy);
+    }
+};
+
+}} // namespace detail::recalculate
+#endif // DOXYGEN_NO_DETAIL
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename Tag1 = typename geometry::tag<Geometry1>::type,
+    typename Tag2 = typename geometry::tag<Geometry2>::type
+>
+struct recalculate : not_implemented<Tag1, Tag2>
+{};
+
+template <typename Point1, typename Point2>
+struct recalculate<Point1, Point2, point_tag, point_tag>
+    : detail::recalculate::recalculate_point<geometry::dimension<Point1>::value>
+{};
+
+template <typename Box1, typename Box2>
+struct recalculate<Box1, Box2, box_tag, box_tag>
+    : detail::recalculate::recalculate_indexed<geometry::dimension<Box1>::value>
+{};
+
+template <typename Segment1, typename Segment2>
+struct recalculate<Segment1, Segment2, segment_tag, segment_tag>
+    : detail::recalculate::recalculate_indexed<geometry::dimension<Segment1>::value>
+{};
+
+template <typename Polygon1, typename Polygon2>
+struct recalculate<Polygon1, Polygon2, polygon_tag, polygon_tag>
+    : detail::recalculate::polygon_to_polygon
+{};
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+inline void recalculate(Geometry1& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+{
+    concept::check<Geometry1>();
+    concept::check<Geometry2 const>();
+
+    // static assert dimensions (/types) are the same
+
+    dispatch::recalculate<Geometry1, Geometry2>::apply(geometry1, geometry2, strategy);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RECALCULATE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/areal_areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,825 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_AREAL_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_AREAL_AREAL_HPP
+
+#include <boost/geometry/core/topological_dimension.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/num_interior_rings.hpp>
+#include <boost/geometry/algorithms/detail/point_on_border.hpp>
+#include <boost/geometry/algorithms/detail/sub_range.hpp>
+#include <boost/geometry/algorithms/detail/single_geometry.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/turns.hpp>
+#include <boost/geometry/algorithms/detail/relate/boundary_checker.hpp>
+#include <boost/geometry/algorithms/detail/relate/follow_helpers.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+    
+// WARNING!
+// TODO: In the worst case calling this Pred in a loop for MultiPolygon/MultiPolygon may take O(NM)
+// Use the rtree in this case!
+
+// may be used to set EI and EB for an Areal geometry for which no turns were generated
+template <typename OtherAreal, typename Result, bool TransposeResult>
+class no_turns_aa_pred
+{
+public:
+    no_turns_aa_pred(OtherAreal const& other_areal, Result & res)
+        : m_result(res)
+        , m_other_areal(other_areal)
+        , m_flags(0)
+    {
+        // check which relations must be analysed
+
+        if ( ! may_update<interior, interior, '2', TransposeResult>(m_result)
+          && ! may_update<boundary, interior, '1', TransposeResult>(m_result)
+          && ! may_update<exterior, interior, '2', TransposeResult>(m_result) )
+        {
+            m_flags |= 1;
+        }
+
+        if ( ! may_update<interior, exterior, '2', TransposeResult>(m_result)
+          && ! may_update<boundary, exterior, '1', TransposeResult>(m_result) )
+        {
+            m_flags |= 2;
+        }
+    }
+
+    template <typename Areal>
+    bool operator()(Areal const& areal)
+    {
+        // if those flags are set nothing will change
+        if ( m_flags == 3 )
+        {
+            return false;
+        }
+
+        typedef typename geometry::point_type<Areal>::type point_type;
+        point_type pt;
+        bool const ok = boost::geometry::point_on_border(pt, areal);
+
+        // TODO: for now ignore, later throw an exception?
+        if ( !ok )
+        {
+            return true;
+        }
+
+        // check if the areal is inside the other_areal
+        // TODO: This is O(N)
+        // Run in a loop O(NM) - optimize!
+        int const pig = detail::within::point_in_geometry(pt, m_other_areal);
+        //BOOST_ASSERT( pig != 0 );
+        
+        // inside
+        if ( pig > 0 )
+        {
+            update<interior, interior, '2', TransposeResult>(m_result);
+            update<boundary, interior, '1', TransposeResult>(m_result);
+            update<exterior, interior, '2', TransposeResult>(m_result);
+            m_flags |= 1;
+
+            // TODO: OPTIMIZE!
+            // Only the interior rings of other ONE single geometry must be checked
+            // NOT all geometries
+
+            // Check if any interior ring is outside
+            ring_identifier ring_id(0, -1, 0);
+            int const irings_count = boost::numeric_cast<int>(
+                                        geometry::num_interior_rings(areal) );
+            for ( ; ring_id.ring_index < irings_count ; ++ring_id.ring_index )
+            {
+                typename detail::sub_range_return_type<Areal const>::type
+                    range_ref = detail::sub_range(areal, ring_id);
+
+                if ( boost::empty(range_ref) )
+                {
+                    // TODO: throw exception?
+                    continue; // ignore
+                }
+
+                // TODO: O(N)
+                // Optimize!
+                int const hpig = detail::within::point_in_geometry(range::front(range_ref), m_other_areal);
+
+                // hole outside
+                if ( hpig < 0 )
+                {
+                    update<interior, exterior, '2', TransposeResult>(m_result);
+                    update<boundary, exterior, '1', TransposeResult>(m_result);
+                    m_flags |= 2;
+                    break;
+                }
+            }
+        }
+        // outside
+        else
+        {
+            update<interior, exterior, '2', TransposeResult>(m_result);
+            update<boundary, exterior, '1', TransposeResult>(m_result);
+            m_flags |= 2;
+
+            // Check if any interior ring is inside
+            ring_identifier ring_id(0, -1, 0);
+            int const irings_count = boost::numeric_cast<int>(
+                                        geometry::num_interior_rings(areal) );
+            for ( ; ring_id.ring_index < irings_count ; ++ring_id.ring_index )
+            {
+                typename detail::sub_range_return_type<Areal const>::type
+                    range_ref = detail::sub_range(areal, ring_id);
+
+                if ( boost::empty(range_ref) )
+                {
+                    // TODO: throw exception?
+                    continue; // ignore
+                }
+
+                // TODO: O(N)
+                // Optimize!
+                int const hpig = detail::within::point_in_geometry(range::front(range_ref), m_other_areal);
+
+                // hole inside
+                if ( hpig > 0 )
+                {
+                    update<interior, interior, '2', TransposeResult>(m_result);
+                    update<boundary, interior, '1', TransposeResult>(m_result);
+                    update<exterior, interior, '2', TransposeResult>(m_result);
+                    m_flags |= 1;
+                    break;
+                }
+            }
+        }
+                    
+        return m_flags != 3 && !m_result.interrupt;
+    }
+
+private:
+    Result & m_result;
+    OtherAreal const& m_other_areal;
+    int m_flags;
+};
+
+// The implementation of an algorithm calculating relate() for A/A
+template <typename Geometry1, typename Geometry2>
+struct areal_areal
+{
+    // check Linear / Areal
+    BOOST_STATIC_ASSERT(topological_dimension<Geometry1>::value == 2
+                     && topological_dimension<Geometry2>::value == 2);
+
+    static const bool interruption_enabled = true;
+
+    typedef typename geometry::point_type<Geometry1>::type point1_type;
+    typedef typename geometry::point_type<Geometry2>::type point2_type;
+    
+    template <typename Result>
+    static inline void apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Result & result)
+    {
+// TODO: If Areal geometry may have infinite size, change the following line:
+
+        // The result should be FFFFFFFFF
+        relate::set<exterior, exterior, result_dimension<Geometry2>::value>(result);// FFFFFFFFd, d in [1,9] or T
+
+        if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+            return;
+
+        // get and analyse turns
+        typedef typename turns::get_turns<Geometry1, Geometry2>::turn_info turn_type;
+        std::vector<turn_type> turns;
+
+        interrupt_policy_areal_areal<Result> interrupt_policy(geometry1, geometry2, result);
+
+        turns::get_turns<Geometry1, Geometry2>::apply(turns, geometry1, geometry2, interrupt_policy);
+        if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+            return;
+
+        no_turns_aa_pred<Geometry2, Result, false> pred1(geometry2, result);
+        for_each_disjoint_geometry_if<0, Geometry1>::apply(turns.begin(), turns.end(), geometry1, pred1);
+        if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+            return;
+
+        no_turns_aa_pred<Geometry1, Result, true> pred2(geometry1, result);
+        for_each_disjoint_geometry_if<1, Geometry2>::apply(turns.begin(), turns.end(), geometry2, pred2);
+        if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+            return;
+        
+        if ( turns.empty() )
+            return;
+
+        if ( may_update<interior, interior, '2'>(result)
+          || may_update<interior, exterior, '2'>(result)
+          || may_update<boundary, interior, '1'>(result)
+          || may_update<boundary, exterior, '1'>(result)
+          || may_update<exterior, interior, '2'>(result) )
+        {
+            // sort turns
+            typedef turns::less<0, turns::less_op_areal_areal<0> > less;
+            std::sort(turns.begin(), turns.end(), less());
+
+            /*if ( may_update<interior, exterior, '2'>(result)
+              || may_update<boundary, exterior, '1'>(result)
+              || may_update<boundary, interior, '1'>(result)
+              || may_update<exterior, interior, '2'>(result) )*/
+            {
+                // analyse sorted turns
+                turns_analyser<turn_type, 0> analyser;
+                analyse_each_turn(result, analyser, turns.begin(), turns.end());
+
+                if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+                    return;
+            }
+
+            if ( may_update<interior, interior, '2'>(result)
+              || may_update<interior, exterior, '2'>(result)
+              || may_update<boundary, interior, '1'>(result)
+              || may_update<boundary, exterior, '1'>(result)
+              || may_update<exterior, interior, '2'>(result) )
+            {
+                // analyse rings for which turns were not generated
+                // or only i/i or u/u was generated
+                uncertain_rings_analyser<0, Result, Geometry1, Geometry2> rings_analyser(result, geometry1, geometry2);
+                analyse_uncertain_rings<0>::apply(rings_analyser, turns.begin(), turns.end());
+
+                if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+                    return;
+            }
+        }
+
+        if ( may_update<interior, interior, '2', true>(result)
+          || may_update<interior, exterior, '2', true>(result)
+          || may_update<boundary, interior, '1', true>(result)
+          || may_update<boundary, exterior, '1', true>(result)
+          || may_update<exterior, interior, '2', true>(result) )
+        {
+            // sort turns
+            typedef turns::less<1, turns::less_op_areal_areal<1> > less;
+            std::sort(turns.begin(), turns.end(), less());
+
+            /*if ( may_update<interior, exterior, '2', true>(result)
+              || may_update<boundary, exterior, '1', true>(result)
+              || may_update<boundary, interior, '1', true>(result)
+              || may_update<exterior, interior, '2', true>(result) )*/
+            {
+                // analyse sorted turns
+                turns_analyser<turn_type, 1> analyser;
+                analyse_each_turn(result, analyser, turns.begin(), turns.end());
+
+                if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+                    return;
+            }
+
+            if ( may_update<interior, interior, '2', true>(result)
+              || may_update<interior, exterior, '2', true>(result)
+              || may_update<boundary, interior, '1', true>(result)
+              || may_update<boundary, exterior, '1', true>(result)
+              || may_update<exterior, interior, '2', true>(result) )
+            {
+                // analyse rings for which turns were not generated
+                // or only i/i or u/u was generated
+                uncertain_rings_analyser<1, Result, Geometry2, Geometry1> rings_analyser(result, geometry2, geometry1);
+                analyse_uncertain_rings<1>::apply(rings_analyser, turns.begin(), turns.end());
+
+                //if ( result.interrupt )
+                //    return;
+            }
+        }
+    }
+
+    // interrupt policy which may be passed to get_turns to interrupt the analysis
+    // based on the info in the passed result/mask
+    template <typename Result>
+    class interrupt_policy_areal_areal
+    {
+    public:
+        static bool const enabled = true;
+
+        interrupt_policy_areal_areal(Geometry1 const& geometry1,
+                                     Geometry2 const& geometry2,
+                                     Result & result)
+            : m_result(result)
+            , m_geometry1(geometry1)
+            , m_geometry2(geometry2)
+        {}
+
+        template <typename Range>
+        inline bool apply(Range const& turns)
+        {
+            typedef typename boost::range_iterator<Range const>::type iterator;
+            
+            for (iterator it = boost::begin(turns) ; it != boost::end(turns) ; ++it)
+            {
+                per_turn<0>(*it);
+                per_turn<1>(*it);
+            }
+
+            return m_result.interrupt;
+        }
+
+    private:
+        template <std::size_t OpId, typename Turn>
+        inline void per_turn(Turn const& turn)
+        {
+            static const std::size_t other_op_id = (OpId + 1) % 2;
+            static const bool transpose_result = OpId != 0;
+
+            overlay::operation_type const op = turn.operations[OpId].operation;
+
+            if ( op == overlay::operation_union )
+            {
+                // ignore u/u
+                /*if ( turn.operations[other_op_id].operation != overlay::operation_union )
+                {
+                    update<interior, exterior, '2', transpose_result>(m_result);
+                    update<boundary, exterior, '1', transpose_result>(m_result);
+                }*/
+
+                update<boundary, boundary, '0', transpose_result>(m_result);
+            }
+            else if ( op == overlay::operation_intersection )
+            {
+                // ignore i/i
+                if ( turn.operations[other_op_id].operation != overlay::operation_intersection )
+                {
+                    update<interior, interior, '2', transpose_result>(m_result);
+                    //update<boundary, interior, '1', transpose_result>(m_result);
+                }
+
+                update<boundary, boundary, '0', transpose_result>(m_result);
+            }
+            else if ( op == overlay::operation_continue )
+            {
+                update<boundary, boundary, '1', transpose_result>(m_result);
+                update<interior, interior, '2', transpose_result>(m_result);
+            }
+            else if ( op == overlay::operation_blocked )
+            {
+                update<boundary, boundary, '1', transpose_result>(m_result);
+                update<interior, exterior, '2', transpose_result>(m_result);
+            }
+        }
+
+        Result & m_result;
+        Geometry1 const& m_geometry1;
+        Geometry2 const& m_geometry2;
+    };
+
+    // This analyser should be used like Input or SinglePass Iterator
+    // IMPORTANT! It should be called also for the end iterator - last
+    template <typename TurnInfo, std::size_t OpId>
+    class turns_analyser
+    {
+        typedef typename TurnInfo::point_type turn_point_type;
+
+        static const std::size_t op_id = OpId;
+        static const std::size_t other_op_id = (OpId + 1) % 2;
+        static const bool transpose_result = OpId != 0;
+
+    public:
+        turns_analyser()
+            : m_previous_turn_ptr(0)
+            , m_previous_operation(overlay::operation_none)
+            , m_enter_detected(false)
+            , m_exit_detected(false)
+        {}
+
+        template <typename Result,
+                  typename TurnIt>
+        void apply(Result & result, TurnIt it)
+        {
+            //BOOST_ASSERT( it != last );
+
+            overlay::operation_type const op = it->operations[op_id].operation;
+
+            if ( op != overlay::operation_union
+              && op != overlay::operation_intersection
+              && op != overlay::operation_blocked
+              && op != overlay::operation_continue )
+            {
+                return;
+            }
+
+            segment_identifier const& seg_id = it->operations[op_id].seg_id;
+            //segment_identifier const& other_id = it->operations[other_op_id].seg_id;
+
+            const bool first_in_range = m_seg_watcher.update(seg_id);
+
+            if ( m_previous_turn_ptr )
+            {
+                if ( m_exit_detected /*m_previous_operation == overlay::operation_union*/ )
+                {
+                    // real exit point - may be multiple
+                    if ( first_in_range
+                      || ! turn_on_the_same_ip<op_id>(*m_previous_turn_ptr, *it) )
+                    {
+                        update_exit(result);
+                        m_exit_detected = false;
+                    }
+                    // fake exit point, reset state
+                    else if ( op != overlay::operation_union )
+                    {
+                        m_exit_detected = false;
+                    }
+                }                
+                /*else*/
+                if ( m_enter_detected /*m_previous_operation == overlay::operation_intersection*/ )
+                {
+                    // real entry point
+                    if ( first_in_range
+                      || ! turn_on_the_same_ip<op_id>(*m_previous_turn_ptr, *it) )
+                    {
+                        update_enter(result);
+                        m_enter_detected = false;
+                    }
+                    // fake entry point, reset state
+                    else if ( op != overlay::operation_intersection )
+                    {
+                        m_enter_detected = false;
+                    }
+                }
+            }
+
+            if ( op == overlay::operation_union )
+            {
+                // already set in interrupt policy
+                //update<boundary, boundary, '0', transpose_result>(m_result);
+
+                // ignore u/u
+                //if ( it->operations[other_op_id].operation != overlay::operation_union )
+                {
+                    m_exit_detected = true;
+                }
+            }
+            else if ( op == overlay::operation_intersection )
+            {
+                // ignore i/i
+                if ( it->operations[other_op_id].operation != overlay::operation_intersection )
+                {
+                    // already set in interrupt policy
+                    //update<interior, interior, '2', transpose_result>(result);
+                    //update<boundary, boundary, '0', transpose_result>(result);
+                    m_enter_detected = true;
+                }
+            }
+            else if ( op == overlay::operation_blocked )
+            {
+                // already set in interrupt policy
+            }
+            else // if ( op == overlay::operation_continue )
+            {
+                // already set in interrupt policy
+            }
+
+            // store ref to previously analysed (valid) turn
+            m_previous_turn_ptr = boost::addressof(*it);
+            // and previously analysed (valid) operation
+            m_previous_operation = op;
+        }
+
+        // it == last
+        template <typename Result>
+        void apply(Result & result)
+        {
+            //BOOST_ASSERT( first != last );
+
+            if ( m_exit_detected /*m_previous_operation == overlay::operation_union*/ )
+            {
+                update_exit(result);
+                m_exit_detected = false;
+            }
+
+            if ( m_enter_detected /*m_previous_operation == overlay::operation_intersection*/ )
+            {
+                update_enter(result);
+                m_enter_detected = false;
+            }
+        }
+
+        template <typename Result>
+        static inline void update_exit(Result & result)
+        {
+            update<interior, exterior, '2', transpose_result>(result);
+            update<boundary, exterior, '1', transpose_result>(result);
+        }
+
+        template <typename Result>
+        static inline void update_enter(Result & result)
+        {
+            update<boundary, interior, '1', transpose_result>(result);
+            update<exterior, interior, '2', transpose_result>(result);
+        }
+
+    private:
+        segment_watcher<same_ring> m_seg_watcher;
+        TurnInfo * m_previous_turn_ptr;
+        overlay::operation_type m_previous_operation;
+        bool m_enter_detected;
+        bool m_exit_detected;
+    };
+
+    // call analyser.apply() for each turn in range
+    // IMPORTANT! The analyser is also called for the end iterator - last
+    template <typename Result,
+              typename Analyser,
+              typename TurnIt>
+    static inline void analyse_each_turn(Result & res,
+                                         Analyser & analyser,
+                                         TurnIt first, TurnIt last)
+    {
+        if ( first == last )
+            return;
+
+        for ( TurnIt it = first ; it != last ; ++it )
+        {
+            analyser.apply(res, it);
+
+            if ( BOOST_GEOMETRY_CONDITION(res.interrupt) )
+                return;
+        }
+
+        analyser.apply(res);
+    }
+
+    template <std::size_t OpId, typename Result, typename Geometry, typename OtherGeometry>
+    class uncertain_rings_analyser
+    {
+        static const bool transpose_result = OpId != 0;
+        static const int other_id = (OpId + 1) % 2;
+
+    public:
+        inline uncertain_rings_analyser(Result & result,
+                                        Geometry const& geom,
+                                        OtherGeometry const& other_geom)
+            : geometry(geom), other_geometry(other_geom)
+            , interrupt(result.interrupt) // just in case, could be false as well
+            , m_result(result)
+            , m_flags(0)
+        {
+            // check which relations must be analysed
+
+            if ( ! may_update<interior, interior, '2', transpose_result>(m_result) )
+            {
+                m_flags |= 1;
+            }
+
+            if ( ! may_update<interior, exterior, '2', transpose_result>(m_result)
+              && ! may_update<boundary, exterior, '1', transpose_result>(m_result) )
+            {
+                m_flags |= 2;
+            }
+
+            if ( ! may_update<boundary, interior, '1', transpose_result>(m_result)
+              && ! may_update<exterior, interior, '2', transpose_result>(m_result) )
+            {
+                m_flags |= 4;
+            }
+        }
+
+        inline void no_turns(segment_identifier const& seg_id)
+        {
+            // if those flags are set nothing will change
+            if ( m_flags == 7 )
+            {
+                return;
+            }
+
+            typename detail::sub_range_return_type<Geometry const>::type
+                range_ref = detail::sub_range(geometry, seg_id);
+
+            if ( boost::empty(range_ref) )
+            {
+                // TODO: throw an exception?
+                return; // ignore
+            }
+                
+            // TODO: possible optimization
+            // if the range is an interior ring we may use other IPs generated for this single geometry
+            // to know which other single geometries should be checked
+
+            // TODO: optimize! e.g. use spatial index
+            // O(N) - running it in a loop gives O(NM)
+            int const pig = detail::within::point_in_geometry(range::front(range_ref), other_geometry);
+
+            //BOOST_ASSERT(pig != 0);
+            if ( pig > 0 )
+            {
+                update<interior, interior, '2', transpose_result>(m_result);
+                m_flags |= 1;
+
+                update<boundary, interior, '1', transpose_result>(m_result);
+                update<exterior, interior, '2', transpose_result>(m_result);
+                m_flags |= 4;
+            }
+            else
+            {
+                update<boundary, exterior, '1', transpose_result>(m_result);
+                update<interior, exterior, '2', transpose_result>(m_result);
+                m_flags |= 2;
+            }
+
+// TODO: break if all things are set
+// also some of them could be checked outside, before the analysis
+// In this case we shouldn't relay just on dummy flags
+// Flags should be initialized with proper values
+// or the result should be checked directly
+// THIS IS ALSO TRUE FOR OTHER ANALYSERS! in L/L and L/A
+
+            interrupt = m_flags == 7 || m_result.interrupt;
+        }
+
+        template <typename TurnIt>
+        inline void turns(TurnIt first, TurnIt last)
+        {
+            // if those flags are set nothing will change
+            if ( (m_flags & 6) == 6 )
+            {
+                return;
+            }
+
+            bool found_ii = false;
+            bool found_uu = false;
+
+            for ( TurnIt it = first ; it != last ; ++it )
+            {
+                if ( it->operations[0].operation == overlay::operation_intersection 
+                  && it->operations[1].operation == overlay::operation_intersection )
+                {
+                    // ignore exterior ring
+                    if ( it->operations[OpId].seg_id.ring_index >= 0 )
+                    {
+                        found_ii = true;
+                    }
+                }
+                else if ( it->operations[0].operation == overlay::operation_union 
+                       && it->operations[1].operation == overlay::operation_union )
+                {
+                    // ignore if u/u is for holes
+                    //if ( it->operations[OpId].seg_id.ring_index >= 0
+                    //  && it->operations[other_id].seg_id.ring_index >= 0 )
+                    {
+                        found_uu = true;
+                    }
+                }
+                else // ignore
+                {
+                    return; // don't interrupt
+                }
+            }
+
+            // only i/i was generated for this ring
+            if ( found_ii )
+            {
+                //update<interior, interior, '0', transpose_result>(m_result);
+                //update<boundary, boundary, '0', transpose_result>(m_result);
+                update<boundary, interior, '1', transpose_result>(m_result);
+                update<exterior, interior, '2', transpose_result>(m_result);
+                m_flags |= 4;
+            }
+
+            // only u/u was generated for this ring
+            if ( found_uu )
+            {
+                update<boundary, exterior, '1', transpose_result>(m_result);
+                update<interior, exterior, '2', transpose_result>(m_result);
+                m_flags |= 2;
+            }
+
+            interrupt = m_flags == 7 || m_result.interrupt; // interrupt if the result won't be changed in the future
+        }
+
+        Geometry const& geometry;
+        OtherGeometry const& other_geometry;
+        bool interrupt;
+
+    private:
+        Result & m_result;
+        int m_flags;
+    };
+
+    template <std::size_t OpId>
+    class analyse_uncertain_rings
+    {
+    public:
+        template <typename Analyser, typename TurnIt>
+        static inline void apply(Analyser & analyser, TurnIt first, TurnIt last)
+        {
+            if ( first == last )
+                return;
+
+            for_preceding_rings(analyser, *first);
+            //analyser.per_turn(*first);
+
+            TurnIt prev = first;
+            for ( ++first ; first != last ; ++first, ++prev )
+            {
+                // same multi
+                if ( prev->operations[OpId].seg_id.multi_index
+                  == first->operations[OpId].seg_id.multi_index )
+                {
+                    // same ring
+                    if ( prev->operations[OpId].seg_id.ring_index
+                      == first->operations[OpId].seg_id.ring_index )
+                    {
+                        //analyser.per_turn(*first);
+                    }
+                    // same multi, next ring
+                    else
+                    {
+                        //analyser.end_ring(*prev);
+                        analyser.turns(prev, first);
+
+                        //if ( prev->operations[OpId].seg_id.ring_index + 1
+                        //   < first->operations[OpId].seg_id.ring_index)
+                        {
+                            for_no_turns_rings(analyser,
+                                               *first,
+                                               prev->operations[OpId].seg_id.ring_index + 1,
+                                               first->operations[OpId].seg_id.ring_index);
+                        }
+
+                        //analyser.per_turn(*first);
+                    }
+                }
+                // next multi
+                else
+                {
+                    //analyser.end_ring(*prev);
+                    analyser.turns(prev, first);
+                    for_following_rings(analyser, *prev);
+                    for_preceding_rings(analyser, *first);
+                    //analyser.per_turn(*first);
+                }
+
+                if ( analyser.interrupt )
+                {
+                    return;
+                }
+            }
+
+            //analyser.end_ring(*prev);
+            analyser.turns(prev, first); // first == last
+            for_following_rings(analyser, *prev);
+        }
+
+    private:
+        template <typename Analyser, typename Turn>
+        static inline void for_preceding_rings(Analyser & analyser, Turn const& turn)
+        {
+            segment_identifier const& seg_id = turn.operations[OpId].seg_id;
+
+            for_no_turns_rings(analyser, turn, -1, seg_id.ring_index);
+        }
+
+        template <typename Analyser, typename Turn>
+        static inline void for_following_rings(Analyser & analyser, Turn const& turn)
+        {
+            segment_identifier const& seg_id = turn.operations[OpId].seg_id;
+
+            signed_index_type
+                count = boost::numeric_cast<signed_index_type>(
+                            geometry::num_interior_rings(
+                                detail::single_geometry(analyser.geometry, seg_id)));
+            
+            for_no_turns_rings(analyser, turn, seg_id.ring_index + 1, count);
+        }
+
+        template <typename Analyser, typename Turn>
+        static inline void for_no_turns_rings(Analyser & analyser,
+                                              Turn const& turn,
+                                              signed_index_type first,
+                                              signed_index_type last)
+        {
+            segment_identifier seg_id = turn.operations[OpId].seg_id;
+
+            for ( seg_id.ring_index = first ; seg_id.ring_index < last ; ++seg_id.ring_index )
+            {
+                analyser.no_turns(seg_id);
+            }
+        }
+    };
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_AREAL_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/boundary_checker.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,134 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_BOUNDARY_CHECKER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_BOUNDARY_CHECKER_HPP
+
+#include <boost/geometry/util/range.hpp>
+#include <boost/geometry/algorithms/num_points.hpp>
+#include <boost/geometry/algorithms/detail/sub_range.hpp>
+
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+enum boundary_query { boundary_front, boundary_back, boundary_any };
+
+template <typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type>
+class boundary_checker {};
+
+template <typename Geometry>
+class boundary_checker<Geometry, linestring_tag>
+{
+    typedef typename point_type<Geometry>::type point_type;
+
+public:
+    boundary_checker(Geometry const& g)
+        : has_boundary( boost::size(g) >= 2
+                     && !detail::equals::equals_point_point(range::front(g), range::back(g)) )
+        , geometry(g)
+    {}
+
+    template <boundary_query BoundaryQuery>
+    bool is_endpoint_boundary(point_type const& pt) const
+    {
+        boost::ignore_unused_variable_warning(pt);
+#ifdef BOOST_GEOMETRY_DEBUG_RELATE_BOUNDARY_CHECKER
+        // may give false positives for INT
+        BOOST_ASSERT( (BoundaryQuery == boundary_front || BoundaryQuery == boundary_any)
+                   && detail::equals::equals_point_point(pt, range::front(geometry))
+                   || (BoundaryQuery == boundary_back || BoundaryQuery == boundary_any)
+                   && detail::equals::equals_point_point(pt, range::back(geometry)) );
+#endif
+        return has_boundary;
+    }
+
+private:
+    bool has_boundary;
+    Geometry const& geometry;
+};
+
+template <typename Geometry>
+class boundary_checker<Geometry, multi_linestring_tag>
+{
+    typedef typename point_type<Geometry>::type point_type;
+
+public:
+    boundary_checker(Geometry const& g)
+        : is_filled(false), geometry(g)
+    {}
+
+    // First call O(NlogN)
+    // Each next call O(logN)
+    template <boundary_query BoundaryQuery>
+    bool is_endpoint_boundary(point_type const& pt) const
+    {
+        typedef typename boost::range_size<Geometry>::type size_type;
+        size_type multi_count = boost::size(geometry);
+
+        if ( multi_count < 1 )
+            return false;
+
+        if ( ! is_filled )
+        {
+            //boundary_points.clear();
+            boundary_points.reserve(multi_count * 2);
+
+            typedef typename boost::range_iterator<Geometry const>::type multi_iterator;
+            for ( multi_iterator it = boost::begin(geometry) ;
+                  it != boost::end(geometry) ; ++ it )
+            {
+                // empty or point - no boundary
+                if ( boost::size(*it) < 2 )
+                    continue;
+
+                // linear ring or point - no boundary
+                if ( equals::equals_point_point(range::front(*it), range::back(*it)) )
+                    continue;
+
+                boundary_points.push_back(range::front(*it));
+                boundary_points.push_back(range::back(*it));
+            }
+
+            std::sort(boundary_points.begin(), boundary_points.end(), geometry::less<point_type>());
+
+            is_filled = true;
+        }
+
+        std::size_t equal_points_count
+            = boost::size(
+                std::equal_range(boundary_points.begin(),
+                                 boundary_points.end(),
+                                 pt,
+                                 geometry::less<point_type>())
+            );
+
+        return equal_points_count % 2 != 0;// && equal_points_count > 0; // the number is odd and > 0
+    }
+
+private:
+    mutable bool is_filled;
+    // TODO: store references/pointers instead of points?
+    mutable std::vector<point_type> boundary_points;
+
+    Geometry const& geometry;
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_BOUNDARY_CHECKER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/follow_helpers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,402 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013-2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_FOLLOW_HELPERS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_FOLLOW_HELPERS_HPP
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/range.hpp>
+//#include <boost/geometry/algorithms/detail/sub_range.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+// NOTE: This iterates through single geometries for which turns were not generated.
+//       It doesn't mean that the geometry is disjoint, only that no turns were detected.
+
+template <std::size_t OpId,
+          typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type,
+          bool IsMulti = boost::is_base_of<multi_tag, Tag>::value
+>
+struct for_each_disjoint_geometry_if
+    : public not_implemented<Tag>
+{};
+
+template <std::size_t OpId, typename Geometry, typename Tag>
+struct for_each_disjoint_geometry_if<OpId, Geometry, Tag, false>
+{
+    template <typename TurnIt, typename Pred>
+    static inline bool apply(TurnIt first, TurnIt last,
+                             Geometry const& geometry,
+                             Pred & pred)
+    {
+        if ( first != last )
+            return false;
+        pred(geometry);
+        return true;
+    }
+};
+
+template <std::size_t OpId, typename Geometry, typename Tag>
+struct for_each_disjoint_geometry_if<OpId, Geometry, Tag, true>
+{
+    template <typename TurnIt, typename Pred>
+    static inline bool apply(TurnIt first, TurnIt last,
+                             Geometry const& geometry,
+                             Pred & pred)
+    {
+        if ( first != last )
+            return for_turns(first, last, geometry, pred);
+        else
+            return for_empty(geometry, pred);
+    }
+
+    template <typename Pred>
+    static inline bool for_empty(Geometry const& geometry,
+                                 Pred & pred)
+    {
+        typedef typename boost::range_iterator<Geometry const>::type iterator;
+
+        // O(N)
+        // check predicate for each contained geometry without generated turn
+        for ( iterator it = boost::begin(geometry) ;
+              it != boost::end(geometry) ; ++it )
+        {
+            bool cont = pred(*it);
+            if ( !cont )
+                break;
+        }
+        
+        return !boost::empty(geometry);
+    }
+
+    template <typename TurnIt, typename Pred>
+    static inline bool for_turns(TurnIt first, TurnIt last,
+                                 Geometry const& geometry,
+                                 Pred & pred)
+    {
+        BOOST_ASSERT(first != last);
+
+        const std::size_t count = boost::size(geometry);
+        boost::ignore_unused_variable_warning(count);
+
+        // O(I)
+        // gather info about turns generated for contained geometries
+        std::vector<bool> detected_intersections(count, false);
+        for ( TurnIt it = first ; it != last ; ++it )
+        {
+            signed_index_type multi_index = it->operations[OpId].seg_id.multi_index;
+            BOOST_ASSERT(multi_index >= 0);
+            std::size_t const index = static_cast<std::size_t>(multi_index);
+            BOOST_ASSERT(index < count);
+            detected_intersections[index] = true;
+        }
+
+        bool found = false;
+
+        // O(N)
+        // check predicate for each contained geometry without generated turn
+        for ( std::vector<bool>::iterator it = detected_intersections.begin() ;
+              it != detected_intersections.end() ; ++it )
+        {
+            // if there were no intersections for this multi_index
+            if ( *it == false )
+            {
+                found = true;
+                std::size_t const index = std::size_t(std::distance(detected_intersections.begin(), it));
+                bool cont = pred(range::at(geometry, index));
+                if ( !cont )
+                    break;
+            }
+        }
+        
+        return found;
+    }
+};
+
+// WARNING! This class stores pointers!
+// Passing a reference to local variable will result in undefined behavior!
+template <typename Point>
+class point_info
+{
+public:
+    point_info() : sid_ptr(NULL), pt_ptr(NULL) {}
+    point_info(Point const& pt, segment_identifier const& sid)
+        : sid_ptr(boost::addressof(sid))
+        , pt_ptr(boost::addressof(pt))
+    {}
+    segment_identifier const& seg_id() const
+    {
+        BOOST_ASSERT(sid_ptr);
+        return *sid_ptr;
+    }
+    Point const& point() const
+    {
+        BOOST_ASSERT(pt_ptr);
+        return *pt_ptr;
+    }
+
+    //friend bool operator==(point_identifier const& l, point_identifier const& r)
+    //{
+    //    return l.seg_id() == r.seg_id()
+    //        && detail::equals::equals_point_point(l.point(), r.point());
+    //}
+
+private:
+    const segment_identifier * sid_ptr;
+    const Point * pt_ptr;
+};
+
+// WARNING! This class stores pointers!
+// Passing a reference to local variable will result in undefined behavior!
+class same_single
+{
+public:
+    same_single(segment_identifier const& sid)
+        : sid_ptr(boost::addressof(sid))
+    {}
+
+    bool operator()(segment_identifier const& sid) const
+    {
+        return sid.multi_index == sid_ptr->multi_index;                
+    }
+
+    template <typename Point>
+    bool operator()(point_info<Point> const& pid) const
+    {
+        return operator()(pid.seg_id());
+    }
+
+private:
+    const segment_identifier * sid_ptr;
+};
+
+class same_ring
+{
+public:
+    same_ring(segment_identifier const& sid)
+        : sid_ptr(boost::addressof(sid))
+    {}
+
+    bool operator()(segment_identifier const& sid) const
+    {
+        return sid.multi_index == sid_ptr->multi_index
+            && sid.ring_index == sid_ptr->ring_index;
+    }
+
+private:
+    const segment_identifier * sid_ptr;
+};
+
+// WARNING! This class stores pointers!
+// Passing a reference to local variable will result in undefined behavior!
+template <typename SameRange = same_single>
+class segment_watcher
+{
+public:
+    segment_watcher()
+        : m_seg_id_ptr(NULL)
+    {}
+
+    bool update(segment_identifier const& seg_id)
+    {
+        bool result = m_seg_id_ptr == 0 || !SameRange(*m_seg_id_ptr)(seg_id);
+        m_seg_id_ptr = boost::addressof(seg_id);
+        return result;
+    }
+
+private:
+    const segment_identifier * m_seg_id_ptr;
+};
+
+// WARNING! This class stores pointers!
+// Passing a reference to local variable will result in undefined behavior!
+template <typename TurnInfo, std::size_t OpId>
+class exit_watcher
+{
+    static const std::size_t op_id = OpId;
+    static const std::size_t other_op_id = (OpId + 1) % 2;
+
+    typedef typename TurnInfo::point_type point_type;
+    typedef detail::relate::point_info<point_type> point_info;
+
+public:
+    exit_watcher()
+        : m_exit_operation(overlay::operation_none)
+        , m_exit_turn_ptr(NULL)
+    {}
+
+    void enter(TurnInfo const& turn)
+    {
+        m_other_entry_points.push_back(
+            point_info(turn.point, turn.operations[other_op_id].seg_id) );
+    }
+
+    // TODO: exit_per_geometry parameter looks not very safe
+    //       wrong value may be easily passed
+
+    void exit(TurnInfo const& turn, bool exit_per_geometry = true)
+    {
+        //segment_identifier const& seg_id = turn.operations[op_id].seg_id;
+        segment_identifier const& other_id = turn.operations[other_op_id].seg_id;
+        overlay::operation_type exit_op = turn.operations[op_id].operation;
+
+        typedef typename std::vector<point_info>::iterator point_iterator;
+        // search for the entry point in the same range of other geometry
+        point_iterator entry_it = std::find_if(m_other_entry_points.begin(),
+                                               m_other_entry_points.end(),
+                                               same_single(other_id));
+
+        // this end point has corresponding entry point
+        if ( entry_it != m_other_entry_points.end() )
+        {
+            // erase the corresponding entry point
+            m_other_entry_points.erase(entry_it);
+
+            if ( exit_per_geometry || m_other_entry_points.empty() )
+            {
+                // here we know that we possibly left LS
+                // we must still check if we didn't get back on the same point
+                m_exit_operation = exit_op;
+                m_exit_turn_ptr = boost::addressof(turn);
+            }
+        }
+    }
+
+    bool is_outside() const
+    {
+        // if we didn't entered anything in the past, we're outside
+        return m_other_entry_points.empty();
+    }
+
+    bool is_outside(TurnInfo const& turn) const
+    {
+        return m_other_entry_points.empty()
+            || std::find_if(m_other_entry_points.begin(),
+                            m_other_entry_points.end(),
+                            same_single(
+                                turn.operations[other_op_id].seg_id))
+                    == m_other_entry_points.end();
+    }
+
+    overlay::operation_type get_exit_operation() const
+    {
+        return m_exit_operation;
+    }
+
+    point_type const& get_exit_point() const
+    {
+        BOOST_ASSERT(m_exit_operation != overlay::operation_none);
+        BOOST_ASSERT(m_exit_turn_ptr);
+        return m_exit_turn_ptr->point;
+    }
+
+    TurnInfo const& get_exit_turn() const
+    {
+        BOOST_ASSERT(m_exit_operation != overlay::operation_none);
+        BOOST_ASSERT(m_exit_turn_ptr);
+        return *m_exit_turn_ptr;
+    }
+
+    void reset_detected_exit()
+    {
+        m_exit_operation = overlay::operation_none;
+    }
+
+    void reset()
+    {
+        m_exit_operation = overlay::operation_none;
+        m_other_entry_points.clear();
+    }
+
+private:
+    overlay::operation_type m_exit_operation;
+    const TurnInfo * m_exit_turn_ptr;
+    std::vector<point_info> m_other_entry_points; // TODO: use map here or sorted vector?
+};
+
+template <std::size_t OpId, typename Turn>
+inline bool turn_on_the_same_ip(Turn const& prev_turn, Turn const& curr_turn)
+{
+    segment_identifier const& prev_seg_id = prev_turn.operations[OpId].seg_id;
+    segment_identifier const& curr_seg_id = curr_turn.operations[OpId].seg_id;
+
+    if ( prev_seg_id.multi_index != curr_seg_id.multi_index
+      || prev_seg_id.ring_index != curr_seg_id.ring_index )
+    {
+        return false;
+    }
+
+    // TODO: will this work if between segments there will be some number of degenerated ones?
+
+    if ( prev_seg_id.segment_index != curr_seg_id.segment_index
+      && ( ! curr_turn.operations[OpId].fraction.is_zero()
+        || prev_seg_id.segment_index + 1 != curr_seg_id.segment_index ) )
+    {
+        return false;
+    }
+
+    return detail::equals::equals_point_point(prev_turn.point, curr_turn.point);
+}
+
+template <boundary_query BoundaryQuery,
+          typename Point,
+          typename BoundaryChecker>
+static inline bool is_endpoint_on_boundary(Point const& pt,
+                                           BoundaryChecker & boundary_checker)
+{
+    return boundary_checker.template is_endpoint_boundary<BoundaryQuery>(pt);
+}
+
+template <boundary_query BoundaryQuery,
+          typename IntersectionPoint,
+          typename OperationInfo,
+          typename BoundaryChecker>
+static inline bool is_ip_on_boundary(IntersectionPoint const& ip,
+                                     OperationInfo const& operation_info,
+                                     BoundaryChecker & boundary_checker,
+                                     segment_identifier const& seg_id)
+{
+    boost::ignore_unused_variable_warning(seg_id);
+
+    bool res = false;
+
+    // IP on the last point of the linestring
+    if ( BOOST_GEOMETRY_CONDITION(BoundaryQuery == boundary_back || BoundaryQuery == boundary_any)
+      && operation_info.position == overlay::position_back )
+    {
+        // check if this point is a boundary
+        res = boundary_checker.template is_endpoint_boundary<boundary_back>(ip);
+    }
+    // IP on the last point of the linestring
+    else if ( BOOST_GEOMETRY_CONDITION(BoundaryQuery == boundary_front || BoundaryQuery == boundary_any)
+           && operation_info.position == overlay::position_front )
+    {
+        // check if this point is a boundary
+        res = boundary_checker.template is_endpoint_boundary<boundary_front>(ip);
+    }
+            
+    return res;
+}
+
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_FOLLOW_HELPERS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/less.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch { namespace relate {
+
+// TODO: Integrate it with geometry::less?
+
+template <typename Point1,
+          typename Point2,
+          std::size_t I = 0,
+          std::size_t D = geometry::dimension<Point1>::value>
+struct less
+{
+    static inline bool apply(Point1 const& left, Point2 const& right)
+    {
+        typename geometry::coordinate_type<Point1>::type
+            cleft = geometry::get<I>(left);
+        typename geometry::coordinate_type<Point2>::type
+            cright = geometry::get<I>(right);
+
+        if ( geometry::math::equals(cleft, cright) )
+        {
+            return less<Point1, Point2, I + 1, D>::apply(left, right);
+        }
+        else
+        {
+            return cleft < cright;
+        }
+    }
+};
+
+template <typename Point1, typename Point2, std::size_t D>
+struct less<Point1, Point2, D, D>
+{
+    static inline bool apply(Point1 const&, Point2 const&)
+    {
+        return false;
+    }
+};
+
+}} // namespace detail_dispatch::relate
+
+#endif
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+struct less
+{
+    template <typename Point1, typename Point2>
+    inline bool operator()(Point1 const& point1, Point2 const& point2) const
+    {
+        return detail_dispatch::relate::less<Point1, Point2>::apply(point1, point2);
+    }
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LESS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/linear_areal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1430 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_AREAL_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_AREAL_HPP
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/core/topological_dimension.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/num_interior_rings.hpp>
+#include <boost/geometry/algorithms/detail/point_on_border.hpp>
+#include <boost/geometry/algorithms/detail/sub_range.hpp>
+#include <boost/geometry/algorithms/detail/single_geometry.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/turns.hpp>
+#include <boost/geometry/algorithms/detail/relate/boundary_checker.hpp>
+#include <boost/geometry/algorithms/detail/relate/follow_helpers.hpp>
+
+#include <boost/geometry/views/detail/normalized_view.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+// WARNING!
+// TODO: In the worst case calling this Pred in a loop for MultiLinestring/MultiPolygon may take O(NM)
+// Use the rtree in this case!
+
+// may be used to set IE and BE for a Linear geometry for which no turns were generated
+template <typename Geometry2, typename Result, typename BoundaryChecker, bool TransposeResult>
+class no_turns_la_linestring_pred
+{
+public:
+    no_turns_la_linestring_pred(Geometry2 const& geometry2,
+                                Result & res,
+                                BoundaryChecker const& boundary_checker)
+        : m_geometry2(geometry2)
+        , m_result(res)
+        , m_boundary_checker(boundary_checker)
+        , m_interrupt_flags(0)
+    {
+        if ( ! may_update<interior, interior, '1', TransposeResult>(m_result) )
+        {
+            m_interrupt_flags |= 1;
+        }
+
+        if ( ! may_update<interior, exterior, '1', TransposeResult>(m_result) )
+        {
+            m_interrupt_flags |= 2;
+        }
+
+        if ( ! may_update<boundary, interior, '0', TransposeResult>(m_result) )
+        {
+            m_interrupt_flags |= 4;
+        }
+
+        if ( ! may_update<boundary, exterior, '0', TransposeResult>(m_result) )
+        {
+            m_interrupt_flags |= 8;
+        }
+    }
+
+    template <typename Linestring>
+    bool operator()(Linestring const& linestring)
+    {
+        std::size_t const count = boost::size(linestring);
+        
+        // invalid input
+        if ( count < 2 )
+        {
+            // ignore
+            // TODO: throw an exception?
+            return true;
+        }
+
+        // if those flags are set nothing will change
+        if ( m_interrupt_flags == 0xF )
+        {
+            return false;
+        }
+
+        int const pig = detail::within::point_in_geometry(range::front(linestring), m_geometry2);
+        //BOOST_ASSERT_MSG(pig != 0, "There should be no IPs");
+
+        if ( pig > 0 )
+        {
+            update<interior, interior, '1', TransposeResult>(m_result);
+            m_interrupt_flags |= 1;
+        }
+        else
+        {
+            update<interior, exterior, '1', TransposeResult>(m_result);
+            m_interrupt_flags |= 2;
+        }
+
+        // check if there is a boundary
+        if ( ( m_interrupt_flags & 0xC ) != 0xC // if wasn't already set
+          && ( m_boundary_checker.template
+                is_endpoint_boundary<boundary_front>(range::front(linestring))
+            || m_boundary_checker.template
+                is_endpoint_boundary<boundary_back>(range::back(linestring)) ) )
+        {
+            if ( pig > 0 )
+            {
+                update<boundary, interior, '0', TransposeResult>(m_result);
+                m_interrupt_flags |= 4;
+            }
+            else
+            {
+                update<boundary, exterior, '0', TransposeResult>(m_result);
+                m_interrupt_flags |= 8;
+            }
+        }
+
+        return m_interrupt_flags != 0xF
+            && ! m_result.interrupt;
+    }
+
+private:
+    Geometry2 const& m_geometry2;
+    Result & m_result;
+    BoundaryChecker const& m_boundary_checker;
+    unsigned m_interrupt_flags;
+};
+
+// may be used to set EI and EB for an Areal geometry for which no turns were generated
+template <typename Result, bool TransposeResult>
+class no_turns_la_areal_pred
+{
+public:
+    no_turns_la_areal_pred(Result & res)
+        : m_result(res)
+        , interrupt(! may_update<interior, exterior, '2', TransposeResult>(m_result)
+                 && ! may_update<boundary, exterior, '1', TransposeResult>(m_result) )
+    {}
+
+    template <typename Areal>
+    bool operator()(Areal const& areal)
+    {
+        if ( interrupt )
+        {
+            return false;
+        }
+
+        // TODO:
+        // handle empty/invalid geometries in a different way than below?
+
+        typedef typename geometry::point_type<Areal>::type point_type;
+        point_type dummy;
+        bool const ok = boost::geometry::point_on_border(dummy, areal);
+
+        // TODO: for now ignore, later throw an exception?
+        if ( !ok )
+        {
+            return true;
+        }
+
+        update<interior, exterior, '2', TransposeResult>(m_result);
+        update<boundary, exterior, '1', TransposeResult>(m_result);
+                    
+        return false;
+    }
+
+private:
+    Result & m_result;
+    bool const interrupt;
+};
+
+// The implementation of an algorithm calculating relate() for L/A
+template <typename Geometry1, typename Geometry2, bool TransposeResult = false>
+struct linear_areal
+{
+    // check Linear / Areal
+    BOOST_STATIC_ASSERT(topological_dimension<Geometry1>::value == 1
+                     && topological_dimension<Geometry2>::value == 2);
+
+    static const bool interruption_enabled = true;
+
+    typedef typename geometry::point_type<Geometry1>::type point1_type;
+    typedef typename geometry::point_type<Geometry2>::type point2_type;
+
+    template <typename Geometry>
+        struct is_multi
+            : boost::is_base_of
+                <
+                    multi_tag,
+                    typename tag<Geometry>::type
+                >
+        {};
+
+    template <typename Geom1, typename Geom2>
+    struct multi_turn_info
+        : turns::get_turns<Geom1, Geom2>::turn_info
+    {
+        multi_turn_info() : priority(0) {}
+        int priority; // single-geometry sorting priority
+    };
+
+    template <typename Geom1, typename Geom2>
+    struct turn_info_type
+        : boost::mpl::if_c
+            <
+                is_multi<Geometry2>::value,
+                multi_turn_info<Geom1, Geom2>,
+                typename turns::get_turns<Geom1, Geom2>::turn_info
+            >
+    {};
+    
+    template <typename Result>
+    static inline void apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Result & result)
+    {
+// TODO: If Areal geometry may have infinite size, change the following line:
+
+        // The result should be FFFFFFFFF
+        relate::set<exterior, exterior, result_dimension<Geometry2>::value, TransposeResult>(result);// FFFFFFFFd, d in [1,9] or T
+
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        // get and analyse turns
+        typedef typename turn_info_type<Geometry1, Geometry2>::type turn_type;
+        std::vector<turn_type> turns;
+
+        interrupt_policy_linear_areal<Geometry2, Result> interrupt_policy(geometry2, result);
+
+        turns::get_turns<Geometry1, Geometry2>::apply(turns, geometry1, geometry2, interrupt_policy);
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        boundary_checker<Geometry1> boundary_checker1(geometry1);
+        no_turns_la_linestring_pred
+            <
+                Geometry2,
+                Result,
+                boundary_checker<Geometry1>,
+                TransposeResult
+            > pred1(geometry2, result, boundary_checker1);
+        for_each_disjoint_geometry_if<0, Geometry1>::apply(turns.begin(), turns.end(), geometry1, pred1);
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        no_turns_la_areal_pred<Result, !TransposeResult> pred2(result);
+        for_each_disjoint_geometry_if<1, Geometry2>::apply(turns.begin(), turns.end(), geometry2, pred2);
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+        
+        if ( turns.empty() )
+            return;
+
+        // This is set here because in the case if empty Areal geometry were passed
+        // those shouldn't be set
+        relate::set<exterior, interior, '2', TransposeResult>(result);// FFFFFF2Fd
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        {
+            sort_dispatch(turns.begin(), turns.end(), is_multi<Geometry2>());
+
+            turns_analyser<turn_type> analyser;
+            analyse_each_turn(result, analyser,
+                              turns.begin(), turns.end(),
+                              geometry1, geometry2,
+                              boundary_checker1);
+
+            if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+                return;
+        }
+
+        // If 'c' (insersection_boundary) was not found we know that any Ls isn't equal to one of the Rings
+        if ( !interrupt_policy.is_boundary_found )
+        {
+            relate::set<exterior, boundary, '1', TransposeResult>(result);
+        }
+        // Don't calculate it if it's required
+        else if ( may_update<exterior, boundary, '1', TransposeResult>(result) )
+        {
+// TODO: REVISE THIS CODE AND PROBABLY REWRITE SOME PARTS TO BE MORE HUMAN-READABLE
+//       IN GENERAL IT ANALYSES THE RINGS OF AREAL GEOMETRY AND DETECTS THE ONES THAT
+//       MAY OVERLAP THE INTERIOR OF LINEAR GEOMETRY (NO IPs OR NON-FAKE 'u' OPERATION)
+// NOTE: For one case std::sort may be called again to sort data by operations for data already sorted by ring index
+//       In the worst case scenario the complexity will be O( NlogN + R*(N/R)log(N/R) )
+//       So always should remain O(NlogN) -> for R==1 <-> 1(N/1)log(N/1), for R==N <-> N(N/N)log(N/N)
+//       Some benchmarking should probably be done to check if only one std::sort should be used
+
+            // sort by multi_index and rind_index
+            std::sort(turns.begin(), turns.end(), less_ring());
+
+            typedef typename std::vector<turn_type>::iterator turn_iterator;
+
+            turn_iterator it = turns.begin();
+            segment_identifier * prev_seg_id_ptr = NULL;
+            // for each ring
+            for ( ; it != turns.end() ; )
+            {
+                // it's the next single geometry
+                if ( prev_seg_id_ptr == NULL
+                  || prev_seg_id_ptr->multi_index != it->operations[1].seg_id.multi_index )
+                {
+                    // if the first ring has no IPs
+                    if ( it->operations[1].seg_id.ring_index > -1 )
+                    {
+                        // we can be sure that the exterior overlaps the boundary
+                        relate::set<exterior, boundary, '1', TransposeResult>(result);                    
+                        break;
+                    }
+                    // if there was some previous ring
+                    if ( prev_seg_id_ptr != NULL )
+                    {
+                        signed_index_type const next_ring_index = prev_seg_id_ptr->ring_index + 1;
+                        BOOST_ASSERT(next_ring_index >= 0);
+                        
+                        // if one of the last rings of previous single geometry was ommited
+                        if ( static_cast<std::size_t>(next_ring_index)
+                                < geometry::num_interior_rings(
+                                    single_geometry(geometry2, *prev_seg_id_ptr)) )
+                        {
+                            // we can be sure that the exterior overlaps the boundary
+                            relate::set<exterior, boundary, '1', TransposeResult>(result);
+                            break;
+                        }
+                    }
+                }
+                // if it's the same single geometry
+                else /*if ( previous_multi_index == it->operations[1].seg_id.multi_index )*/
+                {
+                    // and we jumped over one of the rings
+                    if ( prev_seg_id_ptr != NULL // just in case
+                      && prev_seg_id_ptr->ring_index + 1 < it->operations[1].seg_id.ring_index )
+                    {
+                        // we can be sure that the exterior overlaps the boundary
+                        relate::set<exterior, boundary, '1', TransposeResult>(result);                    
+                        break;
+                    }
+                }
+
+                prev_seg_id_ptr = boost::addressof(it->operations[1].seg_id);
+
+                // find the next ring first iterator and check if the analysis should be performed
+                has_boundary_intersection has_boundary_inters;
+                turn_iterator next = find_next_ring(it, turns.end(), has_boundary_inters);
+
+                // if there is no 1d overlap with the boundary
+                if ( !has_boundary_inters.result )
+                {
+                    // we can be sure that the exterior overlaps the boundary
+                    relate::set<exterior, boundary, '1', TransposeResult>(result);                    
+                    break;
+                }
+                // else there is 1d overlap with the boundary so we must analyse the boundary
+                else
+                {
+                    // u, c
+                    typedef turns::less<1, turns::less_op_areal_linear<1> > less;
+                    std::sort(it, next, less());
+
+                    // analyse
+                    areal_boundary_analyser<turn_type> analyser;
+                    for ( turn_iterator rit = it ; rit != next ; ++rit )
+                    {
+                        // if the analyser requests, break the search
+                        if ( !analyser.apply(it, rit, next) )
+                            break;
+                    }
+
+                    // if the boundary of Areal goes out of the Linear
+                    if ( analyser.is_union_detected )
+                    {
+                        // we can be sure that the boundary of Areal overlaps the exterior of Linear
+                        relate::set<exterior, boundary, '1', TransposeResult>(result);
+                        break;
+                    }
+                }
+
+                it = next;
+            }
+
+            // if there was some previous ring
+            if ( prev_seg_id_ptr != NULL )
+            {
+                signed_index_type const next_ring_index = prev_seg_id_ptr->ring_index + 1;
+                BOOST_ASSERT(next_ring_index >= 0);
+
+                // if one of the last rings of previous single geometry was ommited
+                if ( static_cast<std::size_t>(next_ring_index)
+                        < geometry::num_interior_rings(
+                            single_geometry(geometry2, *prev_seg_id_ptr)) )
+                {
+                    // we can be sure that the exterior overlaps the boundary
+                    relate::set<exterior, boundary, '1', TransposeResult>(result);
+                }
+            }
+        }
+    }
+
+    template <typename It, typename Pred, typename Comp>
+    static void for_each_equal_range(It first, It last, Pred pred, Comp comp)
+    {
+        if ( first == last )
+            return;
+
+        It first_equal = first;
+        It prev = first;
+        for ( ++first ; ; ++first, ++prev )
+        {
+            if ( first == last || !comp(*prev, *first) )
+            {
+                pred(first_equal, first);
+                first_equal = first;
+            }
+            
+            if ( first == last )
+                break;
+        }
+    }
+
+    struct same_ip
+    {
+        template <typename Turn>
+        bool operator()(Turn const& left, Turn const& right) const
+        {
+            return left.operations[0].seg_id == right.operations[0].seg_id
+                && left.operations[0].fraction == right.operations[0].fraction;
+        }
+    };
+
+    struct same_ip_and_multi_index
+    {
+        template <typename Turn>
+        bool operator()(Turn const& left, Turn const& right) const
+        {
+            return same_ip()(left, right)
+                && left.operations[1].seg_id.multi_index == right.operations[1].seg_id.multi_index;
+        }
+    };
+
+    template <typename OpToPriority>
+    struct set_turns_group_priority
+    {
+        template <typename TurnIt>
+        void operator()(TurnIt first, TurnIt last) const
+        {
+            BOOST_ASSERT(first != last);
+            static OpToPriority op_to_priority;
+            // find the operation with the least priority
+            int least_priority = op_to_priority(first->operations[0]);
+            for ( TurnIt it = first + 1 ; it != last ; ++it )
+            {
+                int priority = op_to_priority(it->operations[0]);
+                if ( priority < least_priority )
+                    least_priority = priority;
+            }
+            // set the least priority for all turns of the group
+            for ( TurnIt it = first ; it != last ; ++it )
+            {
+                it->priority = least_priority;
+            }
+        }
+    };
+
+    template <typename SingleLess>
+    struct sort_turns_group
+    {
+        struct less
+        {
+            template <typename Turn>
+            bool operator()(Turn const& left, Turn const& right) const
+            {
+                return left.operations[1].seg_id.multi_index == right.operations[1].seg_id.multi_index ?
+                    SingleLess()(left, right) :
+                    left.priority < right.priority;
+            }
+        };
+
+        template <typename TurnIt>
+        void operator()(TurnIt first, TurnIt last) const
+        {
+            std::sort(first, last, less());
+        }
+    };
+
+    template <typename TurnIt>
+    static void sort_dispatch(TurnIt first, TurnIt last, boost::true_type const& /*is_multi*/)
+    {
+        // sort turns by Linear seg_id, then by fraction, then by other multi_index
+        typedef turns::less<0, turns::less_other_multi_index<0> > less;
+        std::sort(first, last, less());
+
+        // For the same IP and multi_index - the same other's single geometry
+        // set priorities as the least operation found for the whole single geometry
+        // so e.g. single geometries containing 'u' will always be before those only containing 'i'
+        typedef turns::op_to_int<0,2,3,1,4,0> op_to_int_xuic;
+        for_each_equal_range(first, last,
+                             set_turns_group_priority<op_to_int_xuic>(), // least operation in xuic order
+                             same_ip_and_multi_index()); // other's multi_index
+
+        // When priorities for single geometries are set now sort turns for the same IP
+        // if multi_index is the same sort them according to the single-less
+        // else use priority of the whole single-geometry set earlier
+        typedef turns::less<0, turns::less_op_linear_areal_single<0> > single_less;
+        for_each_equal_range(first, last,
+                             sort_turns_group<single_less>(),
+                             same_ip());
+    }
+
+    template <typename TurnIt>
+    static void sort_dispatch(TurnIt first, TurnIt last, boost::false_type const& /*is_multi*/)
+    {
+        // sort turns by Linear seg_id, then by fraction, then
+        // for same ring id: x, u, i, c
+        // for different ring id: c, i, u, x
+        typedef turns::less<0, turns::less_op_linear_areal_single<0> > less;
+        std::sort(first, last, less());
+    }
+    
+
+    // interrupt policy which may be passed to get_turns to interrupt the analysis
+    // based on the info in the passed result/mask
+    template <typename Areal, typename Result>
+    class interrupt_policy_linear_areal
+    {
+    public:
+        static bool const enabled = true;
+
+        interrupt_policy_linear_areal(Areal const& areal, Result & result)
+            : m_result(result), m_areal(areal)
+            , is_boundary_found(false)
+        {}
+
+// TODO: since we update result for some operations here, we may not do it in the analyser!
+
+        template <typename Range>
+        inline bool apply(Range const& turns)
+        {
+            typedef typename boost::range_iterator<Range const>::type iterator;
+            
+            for (iterator it = boost::begin(turns) ; it != boost::end(turns) ; ++it)
+            {
+                if ( it->operations[0].operation == overlay::operation_intersection )
+                {
+                    bool const no_interior_rings
+                        = geometry::num_interior_rings(
+                                single_geometry(m_areal, it->operations[1].seg_id)) == 0;
+
+                    // WARNING! THIS IS TRUE ONLY IF THE POLYGON IS SIMPLE!
+                    // OR WITHOUT INTERIOR RINGS (AND OF COURSE VALID)
+                    if ( no_interior_rings )
+                        update<interior, interior, '1', TransposeResult>(m_result);
+                }
+                else if ( it->operations[0].operation == overlay::operation_continue )
+                {
+                    update<interior, boundary, '1', TransposeResult>(m_result);
+                    is_boundary_found = true;
+                }
+                else if ( ( it->operations[0].operation == overlay::operation_union
+                         || it->operations[0].operation == overlay::operation_blocked )
+                       && it->operations[0].position == overlay::position_middle )
+                {
+// TODO: here we could also check the boundaries and set BB at this point
+                    update<interior, boundary, '0', TransposeResult>(m_result);
+                }
+            }
+
+            return m_result.interrupt;
+        }
+
+    private:
+        Result & m_result;
+        Areal const& m_areal;
+
+    public:
+        bool is_boundary_found;
+    };
+
+    // This analyser should be used like Input or SinglePass Iterator
+    // IMPORTANT! It should be called also for the end iterator - last
+    template <typename TurnInfo>
+    class turns_analyser
+    {
+        typedef typename TurnInfo::point_type turn_point_type;
+
+        static const std::size_t op_id = 0;
+        static const std::size_t other_op_id = 1;
+
+    public:
+        turns_analyser()
+            : m_previous_turn_ptr(NULL)
+            , m_previous_operation(overlay::operation_none)
+            , m_boundary_counter(0)
+            , m_interior_detected(false)
+            , m_first_interior_other_id_ptr(NULL)
+            , m_first_from_unknown(false)
+            , m_first_from_unknown_boundary_detected(false)
+        {}
+
+        template <typename Result,
+                  typename TurnIt,
+                  typename Geometry,
+                  typename OtherGeometry,
+                  typename BoundaryChecker>
+        void apply(Result & res, TurnIt it,
+                   Geometry const& geometry,
+                   OtherGeometry const& other_geometry,
+                   BoundaryChecker const& boundary_checker)
+        {
+            overlay::operation_type op = it->operations[op_id].operation;
+
+            if ( op != overlay::operation_union
+              && op != overlay::operation_intersection
+              && op != overlay::operation_blocked
+              && op != overlay::operation_continue ) // operation_boundary / operation_boundary_intersection
+            {
+                return;
+            }
+
+            segment_identifier const& seg_id = it->operations[op_id].seg_id;
+            segment_identifier const& other_id = it->operations[other_op_id].seg_id;
+
+            const bool first_in_range = m_seg_watcher.update(seg_id);
+
+            // TODO: should apply() for the post-last ip be called if first_in_range ?
+            // this would unify how last points in ranges are handled
+            // possibly replacing parts of the code below
+            // e.g. for is_multi and m_interior_detected
+
+            // handle possible exit
+            bool fake_enter_detected = false;
+            if ( m_exit_watcher.get_exit_operation() == overlay::operation_union )
+            {
+                // real exit point - may be multiple
+                // we know that we entered and now we exit
+                if ( ! turn_on_the_same_ip<op_id>(m_exit_watcher.get_exit_turn(), *it) )
+                {
+                    m_exit_watcher.reset_detected_exit();
+                    
+                    update<interior, exterior, '1', TransposeResult>(res);
+
+                    // next single geometry
+                    if ( first_in_range && m_previous_turn_ptr )
+                    {
+                        // NOTE: similar code is in the post-last-ip-apply()
+                        segment_identifier const& prev_seg_id = m_previous_turn_ptr->operations[op_id].seg_id;
+
+                        bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                                    range::back(sub_range(geometry, prev_seg_id)),
+                                                    boundary_checker);
+
+                        // if there is a boundary on the last point
+                        if ( prev_back_b )
+                        {
+                            update<boundary, exterior, '0', TransposeResult>(res);
+                        }
+                    }
+                }
+                // fake exit point, reset state
+                else if ( op == overlay::operation_intersection
+                        || op == overlay::operation_continue ) // operation_boundary
+                {
+                    m_exit_watcher.reset_detected_exit();
+                    fake_enter_detected = true;
+                }
+            }
+            else if ( m_exit_watcher.get_exit_operation() == overlay::operation_blocked )
+            {
+                // ignore multiple BLOCKs for this same single geometry1
+                if ( op == overlay::operation_blocked
+                  && seg_id.multi_index == m_previous_turn_ptr->operations[op_id].seg_id.multi_index )
+                {
+                    return;
+                }
+
+                if ( ( op == overlay::operation_intersection
+                    || op == overlay::operation_continue )
+                  && turn_on_the_same_ip<op_id>(m_exit_watcher.get_exit_turn(), *it) )
+                {
+                    fake_enter_detected = true;
+                }
+
+                m_exit_watcher.reset_detected_exit();
+            }
+
+            if ( BOOST_GEOMETRY_CONDITION( is_multi<OtherGeometry>::value )
+              && m_first_from_unknown )
+            {
+                // For MultiPolygon many x/u operations may be generated as a first IP
+                // if for all turns x/u was generated and any of the Polygons doesn't contain the LineString
+                // then we know that the LineString is outside
+                // Similar with the u/u turns, if it was the first one it doesn't mean that the
+                // Linestring came from the exterior
+                if ( ( m_previous_operation == overlay::operation_blocked
+                    && ( op != overlay::operation_blocked // operation different than block
+                        || seg_id.multi_index != m_previous_turn_ptr->operations[op_id].seg_id.multi_index ) ) // or the next single-geometry
+                  || ( m_previous_operation == overlay::operation_union
+                    && ! turn_on_the_same_ip<op_id>(*m_previous_turn_ptr, *it) )
+                   )
+                {
+                    update<interior, exterior, '1', TransposeResult>(res);
+                    if ( m_first_from_unknown_boundary_detected )
+                    {
+                        update<boundary, exterior, '0', TransposeResult>(res);
+                    }
+
+                    m_first_from_unknown = false;
+                    m_first_from_unknown_boundary_detected = false;
+                }
+            }
+
+// NOTE: THE WHOLE m_interior_detected HANDLING IS HERE BECAUSE WE CAN'T EFFICIENTLY SORT TURNS (CORRECTLY)
+// BECAUSE THE SAME IP MAY BE REPRESENTED BY TWO SEGMENTS WITH DIFFERENT DISTANCES
+// IT WOULD REQUIRE THE CALCULATION OF MAX DISTANCE
+// TODO: WE COULD GET RID OF THE TEST IF THE DISTANCES WERE NORMALIZED
+
+// UPDATE: THEY SHOULD BE NORMALIZED NOW
+
+// TODO: THIS IS POTENTIALLY ERROREOUS!
+// THIS ALGORITHM DEPENDS ON SOME SPECIFIC SEQUENCE OF OPERATIONS
+// IT WOULD GIVE WRONG RESULTS E.G.
+// IN THE CASE OF SELF-TOUCHING POINT WHEN 'i' WOULD BE BEFORE 'u' 
+
+            // handle the interior overlap
+            if ( m_interior_detected )
+            {
+                // real interior overlap
+                if ( ! turn_on_the_same_ip<op_id>(*m_previous_turn_ptr, *it) )
+                {
+                    update<interior, interior, '1', TransposeResult>(res);
+                    m_interior_detected = false;
+
+                    // new range detected - reset previous state and check the boundary
+                    if ( first_in_range )
+                    {
+                        // actually it should be != NULL if m_interior_detected
+                        // so an assert could be checked here
+                        if ( m_previous_turn_ptr )
+                        {
+                            segment_identifier const& prev_seg_id = m_previous_turn_ptr->operations[op_id].seg_id;
+
+                            bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                                        range::back(sub_range(geometry, prev_seg_id)),
+                                                        boundary_checker);
+
+                            // if there is a boundary on the last point
+                            if ( prev_back_b )
+                            {
+                                update<boundary, interior, '0', TransposeResult>(res);
+                            }
+                        }
+
+                        // The exit_watcher is reset below
+                        // m_exit_watcher.reset();
+                    }
+                }
+                // fake interior overlap
+                else if ( op == overlay::operation_continue )
+                {
+                    m_interior_detected = false;
+                }
+                else if ( op == overlay::operation_union )
+                {
+// TODO: this probably is not a good way of handling the interiors/enters
+//       the solution similar to exit_watcher would be more robust
+//       all enters should be kept and handled.
+//       maybe integrate it with the exit_watcher -> enter_exit_watcher
+                    if ( m_first_interior_other_id_ptr
+                      && m_first_interior_other_id_ptr->multi_index == other_id.multi_index )
+                    {
+                        m_interior_detected = false;
+                    }
+                }
+            }
+
+            // NOTE: If post-last-ip apply() was called this wouldn't be needed
+            if ( first_in_range )
+            {
+                m_exit_watcher.reset();
+                m_boundary_counter = 0;
+                m_first_from_unknown = false;
+                m_first_from_unknown_boundary_detected = false;
+            }
+
+            // i/u, c/u
+            if ( op == overlay::operation_intersection
+              || op == overlay::operation_continue ) // operation_boundary/operation_boundary_intersection
+            {
+                bool const first_point = first_in_range || m_first_from_unknown;
+                bool no_enters_detected = m_exit_watcher.is_outside();
+                m_exit_watcher.enter(*it);
+
+                if ( op == overlay::operation_intersection )
+                {
+                    if ( m_boundary_counter > 0 && it->operations[op_id].is_collinear )
+                        --m_boundary_counter;
+
+                    if ( m_boundary_counter == 0 )
+                    {
+                        // interiors overlaps
+                        //update<interior, interior, '1', TransposeResult>(res);
+
+// TODO: think about the implementation of the more robust version
+//       this way only the first enter will be handled
+                        if ( !m_interior_detected )
+                        {
+                            // don't update now
+                            // we might enter a boundary of some other ring on the same IP
+                            m_interior_detected = true;
+                            m_first_interior_other_id_ptr = boost::addressof(other_id);
+                        }
+                    }
+                }
+                else // operation_boundary
+                {
+                    // don't add to the count for all met boundaries
+                    // only if this is the "new" boundary
+                    if ( first_point || !it->operations[op_id].is_collinear )
+                        ++m_boundary_counter;
+
+                    update<interior, boundary, '1', TransposeResult>(res);
+                }
+
+                bool const this_b
+                    = is_ip_on_boundary<boundary_front>(it->point,
+                                                        it->operations[op_id],
+                                                        boundary_checker,
+                                                        seg_id);
+                // going inside on boundary point
+                if ( this_b )
+                {
+                    update<boundary, boundary, '0', TransposeResult>(res);
+                }
+                // going inside on non-boundary point
+                else
+                {
+                    update<interior, boundary, '0', TransposeResult>(res);
+
+                    // if we didn't enter in the past, we were outside
+                    if ( no_enters_detected
+                      && ! fake_enter_detected
+                      && it->operations[op_id].position != overlay::position_front )
+                    {
+// TODO: calculate_from_inside() is only needed if the current Linestring is not closed
+                        bool const from_inside = first_point
+                                              && calculate_from_inside(geometry,
+                                                                       other_geometry,
+                                                                       *it);
+
+                        if ( from_inside )
+                            update<interior, interior, '1', TransposeResult>(res);
+                        else
+                            update<interior, exterior, '1', TransposeResult>(res);
+
+                        // if it's the first IP then the first point is outside
+                        if ( first_point )
+                        {
+                            bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                    range::front(sub_range(geometry, seg_id)),
+                                                    boundary_checker);
+
+                            // if there is a boundary on the first point
+                            if ( front_b )
+                            {
+                                if ( from_inside )
+                                    update<boundary, interior, '0', TransposeResult>(res);
+                                else
+                                    update<boundary, exterior, '0', TransposeResult>(res);
+                            }
+                        }
+                    }
+                }
+
+                if ( BOOST_GEOMETRY_CONDITION( is_multi<OtherGeometry>::value ) )
+                {
+                    m_first_from_unknown = false;
+                    m_first_from_unknown_boundary_detected = false;
+                }
+            }
+            // u/u, x/u
+            else if ( op == overlay::operation_union || op == overlay::operation_blocked )
+            {
+                bool const op_blocked = op == overlay::operation_blocked;
+                bool const no_enters_detected = m_exit_watcher.is_outside()
+// TODO: is this condition ok?
+// TODO: move it into the exit_watcher?
+                    && m_exit_watcher.get_exit_operation() == overlay::operation_none;
+                    
+                if ( op == overlay::operation_union )
+                {
+                    if ( m_boundary_counter > 0 && it->operations[op_id].is_collinear )
+                        --m_boundary_counter;
+                }
+                else // overlay::operation_blocked
+                {
+                    m_boundary_counter = 0;
+                }
+
+                // we're inside, possibly going out right now
+                if ( ! no_enters_detected )
+                {
+                    if ( op_blocked
+                      && it->operations[op_id].position == overlay::position_back ) // ignore spikes!
+                    {
+                        // check if this is indeed the boundary point
+                        // NOTE: is_ip_on_boundary<>() should be called here but the result will be the same
+                        if ( is_endpoint_on_boundary<boundary_back>(it->point, boundary_checker) )
+                        {
+                            update<boundary, boundary, '0', TransposeResult>(res);
+                        }
+                    }
+                    // union, inside, but no exit -> collinear on self-intersection point
+                    // not needed since we're already inside the boundary
+                    /*else if ( !exit_detected )
+                    {
+                        update<interior, boundary, '0', TransposeResult>(res);
+                    }*/
+                }
+                // we're outside or inside and this is the first turn
+                else
+                {
+                    bool const this_b = is_ip_on_boundary<boundary_any>(it->point,
+                                                                        it->operations[op_id],
+                                                                        boundary_checker,
+                                                                        seg_id);
+                    // if current IP is on boundary of the geometry
+                    if ( this_b )
+                    {
+                        update<boundary, boundary, '0', TransposeResult>(res);
+                    }
+                    // if current IP is not on boundary of the geometry
+                    else
+                    {
+                        update<interior, boundary, '0', TransposeResult>(res);
+                    }
+
+                    // TODO: very similar code is used in the handling of intersection
+                    if ( it->operations[op_id].position != overlay::position_front )
+                    {
+// TODO: calculate_from_inside() is only needed if the current Linestring is not closed
+                        // NOTE: this is not enough for MultiPolygon and operation_blocked
+                        // For LS/MultiPolygon multiple x/u turns may be generated
+                        // the first checked Polygon may be the one which LS is outside for.
+                        bool const first_point = first_in_range || m_first_from_unknown;
+                        bool const first_from_inside = first_point
+                                                    && calculate_from_inside(geometry,
+                                                                             other_geometry,
+                                                                             *it);
+                        if ( first_from_inside )
+                        {
+                            update<interior, interior, '1', TransposeResult>(res);
+
+                            // notify the exit_watcher that we started inside
+                            m_exit_watcher.enter(*it);
+                            // and reset unknown flags since we know that we started inside
+                            m_first_from_unknown = false;
+                            m_first_from_unknown_boundary_detected = false;
+                        }
+                        else
+                        {
+                            if ( BOOST_GEOMETRY_CONDITION( is_multi<OtherGeometry>::value )
+                              /*&& ( op == overlay::operation_blocked
+                                || op == overlay::operation_union )*/ ) // if we're here it's u or x
+                            {
+                                m_first_from_unknown = true;
+                            }
+                            else
+                            {
+                                update<interior, exterior, '1', TransposeResult>(res);
+                            }
+                        }
+
+                        // first IP on the last segment point - this means that the first point is outside or inside
+                        if ( first_point && ( !this_b || op_blocked ) )
+                        {
+                            bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                    range::front(sub_range(geometry, seg_id)),
+                                                    boundary_checker);
+
+                            // if there is a boundary on the first point
+                            if ( front_b )
+                            {
+                                if ( first_from_inside )
+                                {
+                                    update<boundary, interior, '0', TransposeResult>(res);
+                                }
+                                else
+                                {
+                                    if ( BOOST_GEOMETRY_CONDITION( is_multi<OtherGeometry>::value )
+                                      /*&& ( op == overlay::operation_blocked
+                                        || op == overlay::operation_union )*/ ) // if we're here it's u or x
+                                    {
+                                        BOOST_ASSERT(m_first_from_unknown);
+                                        m_first_from_unknown_boundary_detected = true;
+                                    }
+                                    else
+                                    {
+                                        update<boundary, exterior, '0', TransposeResult>(res);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                // if we're going along a boundary, we exit only if the linestring was collinear
+                if ( m_boundary_counter == 0
+                  || it->operations[op_id].is_collinear )
+                {
+                    // notify the exit watcher about the possible exit
+                    m_exit_watcher.exit(*it);
+                }
+            }
+
+            // store ref to previously analysed (valid) turn
+            m_previous_turn_ptr = boost::addressof(*it);
+            // and previously analysed (valid) operation
+            m_previous_operation = op;
+        }
+
+        // it == last
+        template <typename Result,
+                  typename TurnIt,
+                  typename Geometry,
+                  typename OtherGeometry,
+                  typename BoundaryChecker>
+        void apply(Result & res,
+                   TurnIt first, TurnIt last,
+                   Geometry const& geometry,
+                   OtherGeometry const& /*other_geometry*/,
+                   BoundaryChecker const& boundary_checker)
+        {
+            boost::ignore_unused(first, last);
+            //BOOST_ASSERT( first != last );
+
+            // For MultiPolygon many x/u operations may be generated as a first IP
+            // if for all turns x/u was generated and any of the Polygons doesn't contain the LineString
+            // then we know that the LineString is outside
+            if ( BOOST_GEOMETRY_CONDITION( is_multi<OtherGeometry>::value )
+              && m_first_from_unknown )
+            {
+                update<interior, exterior, '1', TransposeResult>(res);
+                if ( m_first_from_unknown_boundary_detected )
+                {
+                    update<boundary, exterior, '0', TransposeResult>(res);
+                }
+
+                // done below
+                //m_first_from_unknown = false;
+                //m_first_from_unknown_boundary_detected = false;
+            }
+
+            // here, the possible exit is the real one
+            // we know that we entered and now we exit
+            if ( /*m_exit_watcher.get_exit_operation() == overlay::operation_union // THIS CHECK IS REDUNDANT
+                ||*/ m_previous_operation == overlay::operation_union
+                && !m_interior_detected )
+            {
+                // for sure
+                update<interior, exterior, '1', TransposeResult>(res);
+
+                BOOST_ASSERT(first != last);
+                BOOST_ASSERT(m_previous_turn_ptr);
+
+                segment_identifier const& prev_seg_id = m_previous_turn_ptr->operations[op_id].seg_id;
+
+                bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                            range::back(sub_range(geometry, prev_seg_id)),
+                                            boundary_checker);
+
+                // if there is a boundary on the last point
+                if ( prev_back_b )
+                {
+                    update<boundary, exterior, '0', TransposeResult>(res);
+                }
+            }
+            // we might enter some Areal and didn't go out,
+            else if ( m_previous_operation == overlay::operation_intersection
+                   || m_interior_detected )
+            {
+                // just in case
+                update<interior, interior, '1', TransposeResult>(res);
+                m_interior_detected = false;
+
+                BOOST_ASSERT(first != last);
+                BOOST_ASSERT(m_previous_turn_ptr);
+
+                segment_identifier const& prev_seg_id = m_previous_turn_ptr->operations[op_id].seg_id;
+
+                bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                            range::back(sub_range(geometry, prev_seg_id)),
+                                            boundary_checker);
+
+                // if there is a boundary on the last point
+                if ( prev_back_b )
+                {
+                    update<boundary, interior, '0', TransposeResult>(res);
+                }
+            }
+
+            // This condition may be false if the Linestring is lying on the Polygon's collinear spike
+            // if Polygon's spikes are not handled in get_turns() or relate() (they currently aren't)
+            //BOOST_ASSERT_MSG(m_previous_operation != overlay::operation_continue,
+            //                    "Unexpected operation! Probably the error in get_turns(L,A) or relate(L,A)");
+            // Currently one c/c turn is generated for the exit
+            //   when a Linestring is going out on a collinear spike
+            // When a Linestring is going in on a collinear spike
+            //   the turn is not generated for the entry
+            // So assume it's the former
+            if ( m_previous_operation == overlay::operation_continue )
+            {
+                update<interior, exterior, '1', TransposeResult>(res);
+
+                segment_identifier const& prev_seg_id = m_previous_turn_ptr->operations[op_id].seg_id;
+
+                bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                            range::back(sub_range(geometry, prev_seg_id)),
+                                            boundary_checker);
+
+                // if there is a boundary on the last point
+                if ( prev_back_b )
+                {
+                    update<boundary, exterior, '0', TransposeResult>(res);
+                }
+            }
+
+            // Reset exit watcher before the analysis of the next Linestring
+            m_exit_watcher.reset();
+            m_boundary_counter = 0;
+            m_first_from_unknown = false;
+            m_first_from_unknown_boundary_detected = false;
+        }
+
+        // check if the passed turn's segment of Linear geometry arrived
+        // from the inside or the outside of the Areal geometry
+        template <typename Turn>
+        static inline bool calculate_from_inside(Geometry1 const& geometry1,
+                                                 Geometry2 const& geometry2,
+                                                 Turn const& turn)
+        {
+            if ( turn.operations[op_id].position == overlay::position_front )
+                return false;
+
+            typename sub_range_return_type<Geometry1 const>::type
+                range1 = sub_range(geometry1, turn.operations[op_id].seg_id);
+            
+            typedef detail::normalized_view<Geometry2 const> const range2_type;
+            typedef typename boost::range_iterator<range2_type>::type range2_iterator;
+            range2_type range2(sub_range(geometry2, turn.operations[other_op_id].seg_id));
+            
+            BOOST_ASSERT(boost::size(range1));
+            std::size_t const s2 = boost::size(range2);
+            BOOST_ASSERT(s2 > 2);
+            std::size_t const seg_count2 = s2 - 1;
+
+            std::size_t const p_seg_ij = static_cast<std::size_t>(turn.operations[op_id].seg_id.segment_index);
+            std::size_t const q_seg_ij = static_cast<std::size_t>(turn.operations[other_op_id].seg_id.segment_index);
+
+            BOOST_ASSERT(p_seg_ij + 1 < boost::size(range1));
+            BOOST_ASSERT(q_seg_ij + 1 < s2);
+
+            point1_type const& pi = range::at(range1, p_seg_ij);
+            point2_type const& qi = range::at(range2, q_seg_ij);
+            point2_type const& qj = range::at(range2, q_seg_ij + 1);
+            point1_type qi_conv;
+            geometry::convert(qi, qi_conv);
+            bool const is_ip_qj = equals::equals_point_point(turn.point, qj);
+// TODO: test this!
+//            BOOST_ASSERT(!equals::equals_point_point(turn.point, pi));
+//            BOOST_ASSERT(!equals::equals_point_point(turn.point, qi));
+            point1_type new_pj;
+            geometry::convert(turn.point, new_pj);
+
+            if ( is_ip_qj )
+            {
+                std::size_t const q_seg_jk = (q_seg_ij + 1) % seg_count2;
+// TODO: the following function should return immediately, however the worst case complexity is O(N)
+// It would be good to replace it with some O(1) mechanism
+                range2_iterator qk_it = find_next_non_duplicated(boost::begin(range2),
+                                                                 range::pos(range2, q_seg_jk),
+                                                                 boost::end(range2));
+
+                // Will this sequence of points be always correct?
+                overlay::side_calculator<point1_type, point2_type> side_calc(qi_conv, new_pj, pi, qi, qj, *qk_it);
+
+                return calculate_from_inside_sides(side_calc);
+            }
+            else
+            {
+                point1_type new_qj;
+                geometry::convert(turn.point, new_qj);
+
+                overlay::side_calculator<point1_type, point2_type> side_calc(qi_conv, new_pj, pi, qi, new_qj, qj);
+
+                return calculate_from_inside_sides(side_calc);
+            }
+        }
+
+        template <typename It>
+        static inline It find_next_non_duplicated(It first, It current, It last)
+        {
+            BOOST_ASSERT( current != last );
+
+            It it = current;
+
+            for ( ++it ; it != last ; ++it )
+            {
+                if ( !equals::equals_point_point(*current, *it) )
+                    return it;
+            }
+
+            // if not found start from the beginning
+            for ( it = first ; it != current ; ++it )
+            {
+                if ( !equals::equals_point_point(*current, *it) )
+                    return it;
+            }
+
+            return current;
+        }
+
+        // calculate inside or outside based on side_calc
+        // this is simplified version of a check from equal<>
+        template <typename SideCalc>
+        static inline bool calculate_from_inside_sides(SideCalc const& side_calc)
+        {
+            int const side_pk_p = side_calc.pk_wrt_p1();
+            int const side_qk_p = side_calc.qk_wrt_p1();
+            // If they turn to same side (not opposite sides)
+            if (! overlay::base_turn_handler::opposite(side_pk_p, side_qk_p))
+            {
+                int const side_pk_q2 = side_calc.pk_wrt_q2();
+                return side_pk_q2 == -1;
+            }
+            else
+            {
+                return side_pk_p == -1;
+            }
+        }
+
+    private:
+        exit_watcher<TurnInfo, op_id> m_exit_watcher;
+        segment_watcher<same_single> m_seg_watcher;
+        TurnInfo * m_previous_turn_ptr;
+        overlay::operation_type m_previous_operation;
+        unsigned m_boundary_counter;
+        bool m_interior_detected;
+        const segment_identifier * m_first_interior_other_id_ptr;
+        bool m_first_from_unknown;
+        bool m_first_from_unknown_boundary_detected;
+    };
+
+    // call analyser.apply() for each turn in range
+    // IMPORTANT! The analyser is also called for the end iterator - last
+    template <typename Result,
+              typename TurnIt,
+              typename Analyser,
+              typename Geometry,
+              typename OtherGeometry,
+              typename BoundaryChecker>
+    static inline void analyse_each_turn(Result & res,
+                                         Analyser & analyser,
+                                         TurnIt first, TurnIt last,
+                                         Geometry const& geometry,
+                                         OtherGeometry const& other_geometry,
+                                         BoundaryChecker const& boundary_checker)
+    {
+        if ( first == last )
+            return;
+
+        for ( TurnIt it = first ; it != last ; ++it )
+        {
+            analyser.apply(res, it,
+                           geometry, other_geometry,
+                           boundary_checker);
+
+            if ( BOOST_GEOMETRY_CONDITION( res.interrupt ) )
+                return;
+        }
+
+        analyser.apply(res, first, last,
+                       geometry, other_geometry,
+                       boundary_checker);
+    }
+
+    // less comparator comparing multi_index then ring_index
+    // may be used to sort turns by ring
+    struct less_ring
+    {
+        template <typename Turn>
+        inline bool operator()(Turn const& left, Turn const& right) const
+        {
+            return left.operations[1].seg_id.multi_index < right.operations[1].seg_id.multi_index
+                || ( left.operations[1].seg_id.multi_index == right.operations[1].seg_id.multi_index
+                  && left.operations[1].seg_id.ring_index < right.operations[1].seg_id.ring_index );
+        }
+    };
+
+    // policy/functor checking if a turn's operation is operation_continue
+    struct has_boundary_intersection
+    {
+        has_boundary_intersection()
+            : result(false) {}
+
+        template <typename Turn>
+        inline void operator()(Turn const& turn)
+        {
+            if ( turn.operations[1].operation == overlay::operation_continue )
+                result = true;
+        }
+
+        bool result;
+    };
+
+    // iterate through the range and search for the different multi_index or ring_index
+    // also call fun for each turn in the current range
+    template <typename It, typename Fun>
+    static inline It find_next_ring(It first, It last, Fun & fun)
+    {
+        if ( first == last )
+            return last;
+
+        signed_index_type const multi_index = first->operations[1].seg_id.multi_index;
+        signed_index_type const ring_index = first->operations[1].seg_id.ring_index;
+
+        fun(*first);
+        ++first;
+
+        for ( ; first != last ; ++first )
+        {
+            if ( multi_index != first->operations[1].seg_id.multi_index
+              || ring_index != first->operations[1].seg_id.ring_index )
+            {
+                return first;
+            }
+
+            fun(*first);
+        }
+
+        return last;
+    }
+
+    // analyser which called for turns sorted by seg/distance/operation
+    // checks if the boundary of Areal geometry really got out
+    // into the exterior of Linear geometry
+    template <typename TurnInfo>
+    class areal_boundary_analyser
+    {
+    public:
+        areal_boundary_analyser()
+            : is_union_detected(false)
+            , m_previous_turn_ptr(NULL)
+        {}
+
+        template <typename TurnIt>
+        bool apply(TurnIt /*first*/, TurnIt it, TurnIt last)
+        {
+            overlay::operation_type op = it->operations[1].operation;
+
+            if ( it != last )
+            {
+                if ( op != overlay::operation_union
+                  && op != overlay::operation_continue )
+                {
+                    return true;
+                }
+
+                if ( is_union_detected )
+                {
+                    BOOST_ASSERT(m_previous_turn_ptr != NULL);
+                    if ( !detail::equals::equals_point_point(it->point, m_previous_turn_ptr->point) )
+                    {
+                        // break
+                        return false;
+                    }
+                    else if ( op == overlay::operation_continue ) // operation_boundary
+                    {
+                        is_union_detected = false;
+                    }
+                }
+
+                if ( op == overlay::operation_union )
+                {
+                    is_union_detected = true;
+                    m_previous_turn_ptr = boost::addressof(*it);
+                }
+
+                return true;
+            }
+            else
+            {
+                return false;
+            }            
+        }
+
+        bool is_union_detected;
+
+    private:
+        const TurnInfo * m_previous_turn_ptr;
+    };
+};
+
+template <typename Geometry1, typename Geometry2>
+struct areal_linear
+{
+    template <typename Result>
+    static inline void apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Result & result)
+    {
+        linear_areal<Geometry2, Geometry1, true>::apply(geometry2, geometry1, result);
+    }
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_AREAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/linear_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,785 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_LINEAR_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_LINEAR_HPP
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/detail/sub_range.hpp>
+#include <boost/geometry/algorithms/detail/single_geometry.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/turns.hpp>
+#include <boost/geometry/algorithms/detail/relate/boundary_checker.hpp>
+#include <boost/geometry/algorithms/detail/relate/follow_helpers.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+template <typename Result, typename BoundaryChecker, bool TransposeResult>
+class disjoint_linestring_pred
+{
+public:
+    disjoint_linestring_pred(Result & res,
+                             BoundaryChecker const& boundary_checker)
+        : m_result(res)
+        , m_boundary_checker(boundary_checker)
+        , m_flags(0)
+    {
+        if ( ! may_update<interior, exterior, '1', TransposeResult>(m_result) )
+        {
+            m_flags |= 1;
+        }
+        if ( ! may_update<boundary, exterior, '0', TransposeResult>(m_result) )
+        {
+            m_flags |= 2;
+        }
+    }
+
+    template <typename Linestring>
+    bool operator()(Linestring const& linestring)
+    {
+        if ( m_flags == 3 )
+        {
+            return false;
+        }
+
+        std::size_t const count = boost::size(linestring);
+        
+        // invalid input
+        if ( count < 2 )
+        {
+            // ignore
+            // TODO: throw an exception?
+            return true;
+        }
+
+        // point-like linestring
+        if ( count == 2
+          && equals::equals_point_point(range::front(linestring),
+                                        range::back(linestring)) )
+        {
+            update<interior, exterior, '0', TransposeResult>(m_result);
+        }
+        else
+        {
+            update<interior, exterior, '1', TransposeResult>(m_result);
+            m_flags |= 1;
+
+            // check if there is a boundary
+            if ( m_flags < 2
+              && ( m_boundary_checker.template
+                    is_endpoint_boundary<boundary_front>(range::front(linestring))
+                || m_boundary_checker.template
+                    is_endpoint_boundary<boundary_back>(range::back(linestring)) ) )
+            {
+                update<boundary, exterior, '0', TransposeResult>(m_result);
+                m_flags |= 2;
+            }
+        }
+
+        return m_flags != 3
+            && ! m_result.interrupt;
+    }
+
+private:
+    Result & m_result;
+    BoundaryChecker const& m_boundary_checker;
+    unsigned m_flags;
+};
+
+template <typename Geometry1, typename Geometry2>
+struct linear_linear
+{
+    static const bool interruption_enabled = true;
+
+    typedef typename geometry::point_type<Geometry1>::type point1_type;
+    typedef typename geometry::point_type<Geometry2>::type point2_type;
+
+    template <typename Result>
+    static inline void apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Result & result)
+    {
+        // The result should be FFFFFFFFF
+        relate::set<exterior, exterior, result_dimension<Geometry1>::value>(result);// FFFFFFFFd, d in [1,9] or T
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        // get and analyse turns
+        typedef typename turns::get_turns<Geometry1, Geometry2>::turn_info turn_type;
+        std::vector<turn_type> turns;
+
+        interrupt_policy_linear_linear<Result> interrupt_policy(result);
+
+        turns::get_turns
+            <
+                Geometry1,
+                Geometry2,
+                detail::get_turns::get_turn_info_type<Geometry1, Geometry2, turns::assign_policy<true> >
+            >::apply(turns, geometry1, geometry2, interrupt_policy);
+
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        boundary_checker<Geometry1> boundary_checker1(geometry1);
+        disjoint_linestring_pred<Result, boundary_checker<Geometry1>, false> pred1(result, boundary_checker1);
+        for_each_disjoint_geometry_if<0, Geometry1>::apply(turns.begin(), turns.end(), geometry1, pred1);
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+
+        boundary_checker<Geometry2> boundary_checker2(geometry2);
+        disjoint_linestring_pred<Result, boundary_checker<Geometry2>, true> pred2(result, boundary_checker2);
+        for_each_disjoint_geometry_if<1, Geometry2>::apply(turns.begin(), turns.end(), geometry2, pred2);
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+        
+        if ( turns.empty() )
+            return;
+
+        // TODO: turns must be sorted and followed only if it's possible to go out and in on the same point
+        // for linear geometries union operation must be detected which I guess would be quite often
+
+        if ( may_update<interior, interior, '1'>(result)
+          || may_update<interior, boundary, '0'>(result)
+          || may_update<interior, exterior, '1'>(result)
+          || may_update<boundary, interior, '0'>(result)
+          || may_update<boundary, boundary, '0'>(result)
+          || may_update<boundary, exterior, '0'>(result) )
+        {
+            typedef turns::less<0, turns::less_op_linear_linear<0> > less;
+            std::sort(turns.begin(), turns.end(), less());
+
+            turns_analyser<turn_type, 0> analyser;
+            analyse_each_turn(result, analyser,
+                              turns.begin(), turns.end(),
+                              geometry1, geometry2,
+                              boundary_checker1, boundary_checker2);
+        }
+
+        if ( BOOST_GEOMETRY_CONDITION( result.interrupt ) )
+            return;
+        
+        if ( may_update<interior, interior, '1', true>(result)
+          || may_update<interior, boundary, '0', true>(result)
+          || may_update<interior, exterior, '1', true>(result)
+          || may_update<boundary, interior, '0', true>(result)
+          || may_update<boundary, boundary, '0', true>(result)
+          || may_update<boundary, exterior, '0', true>(result) )
+        {
+            typedef turns::less<1, turns::less_op_linear_linear<1> > less;
+            std::sort(turns.begin(), turns.end(), less());
+
+            turns_analyser<turn_type, 1> analyser;
+            analyse_each_turn(result, analyser,
+                              turns.begin(), turns.end(),
+                              geometry2, geometry1,
+                              boundary_checker2, boundary_checker1);
+        }
+    }
+
+    template <typename Result>
+    class interrupt_policy_linear_linear
+    {
+    public:
+        static bool const enabled = true;
+
+        explicit interrupt_policy_linear_linear(Result & result)
+            : m_result(result)
+        {}
+
+// TODO: since we update result for some operations here, we may not do it in the analyser!
+
+        template <typename Range>
+        inline bool apply(Range const& turns)
+        {
+            typedef typename boost::range_iterator<Range const>::type iterator;
+            
+            for (iterator it = boost::begin(turns) ; it != boost::end(turns) ; ++it)
+            {
+                if ( it->operations[0].operation == overlay::operation_intersection
+                  || it->operations[1].operation == overlay::operation_intersection )
+                {
+                    update<interior, interior, '1'>(m_result);
+                }
+                else if ( ( it->operations[0].operation == overlay::operation_union
+                         || it->operations[0].operation == overlay::operation_blocked
+                         || it->operations[1].operation == overlay::operation_union
+                         || it->operations[1].operation == overlay::operation_blocked )
+                       && it->operations[0].position == overlay::position_middle
+                       && it->operations[1].position == overlay::position_middle )
+                {
+// TODO: here we could also check the boundaries and set IB,BI,BB at this point
+                    update<interior, interior, '0'>(m_result);
+                }
+            }
+
+            return m_result.interrupt;
+        }
+
+    private:
+        Result & m_result;
+    };
+
+    // This analyser should be used like Input or SinglePass Iterator
+    template <typename TurnInfo, std::size_t OpId>
+    class turns_analyser
+    {
+        typedef typename TurnInfo::point_type turn_point_type;
+
+        static const std::size_t op_id = OpId;
+        static const std::size_t other_op_id = (OpId + 1) % 2;
+        static const bool transpose_result = OpId != 0;
+
+    public:
+        turns_analyser()
+            : m_previous_turn_ptr(NULL)
+            , m_previous_operation(overlay::operation_none)
+            , m_degenerated_turn_ptr(NULL)
+            , m_collinear_spike_exit(false)
+        {}
+
+        template <typename Result,
+                  typename TurnIt,
+                  typename Geometry,
+                  typename OtherGeometry,
+                  typename BoundaryChecker,
+                  typename OtherBoundaryChecker>
+        void apply(Result & res, TurnIt it,
+                   Geometry const& geometry,
+                   OtherGeometry const& other_geometry,
+                   BoundaryChecker const& boundary_checker,
+                   OtherBoundaryChecker const& other_boundary_checker)
+        {
+            overlay::operation_type const op = it->operations[op_id].operation;
+
+            segment_identifier const& seg_id = it->operations[op_id].seg_id;
+            segment_identifier const& other_id = it->operations[other_op_id].seg_id;
+
+            bool const first_in_range = m_seg_watcher.update(seg_id);
+
+            if ( op != overlay::operation_union
+              && op != overlay::operation_intersection
+              && op != overlay::operation_blocked )
+            {
+                // degenerated turn
+                if ( op == overlay::operation_continue
+                  && it->method == overlay::method_none
+                  && m_exit_watcher.is_outside(*it) 
+                  /*&& ( m_exit_watcher.get_exit_operation() == overlay::operation_none 
+                    || ! turn_on_the_same_ip<op_id>(m_exit_watcher.get_exit_turn(), *it) )*/ )
+                {
+                    // TODO: rewrite the above condition
+
+                    // WARNING! For spikes the above condition may be TRUE
+                    // When degenerated turns are be marked in a different way than c,c/c
+                    // different condition will be checked
+
+                    handle_degenerated(res, *it,
+                                       geometry, other_geometry,
+                                       boundary_checker, other_boundary_checker,
+                                       first_in_range);
+
+                    // TODO: not elegant solution! should be rewritten.
+                    if ( it->operations[op_id].position == overlay::position_back )
+                    {
+                        m_previous_operation = overlay::operation_blocked;
+                        m_exit_watcher.reset_detected_exit();
+                    }
+                }
+
+                return;
+            }
+
+            // reset
+            m_degenerated_turn_ptr = NULL;
+
+            // handle possible exit
+            bool fake_enter_detected = false;
+            if ( m_exit_watcher.get_exit_operation() == overlay::operation_union )
+            {
+                // real exit point - may be multiple
+                // we know that we entered and now we exit
+                if ( ! turn_on_the_same_ip<op_id>(m_exit_watcher.get_exit_turn(), *it) )
+                {
+                    m_exit_watcher.reset_detected_exit();
+                    
+                    // not the last IP
+                    update<interior, exterior, '1', transpose_result>(res);
+                }
+                // fake exit point, reset state
+                else if ( op == overlay::operation_intersection )
+                {
+                    m_exit_watcher.reset_detected_exit();
+                    fake_enter_detected = true;
+                }
+            }
+            else if ( m_exit_watcher.get_exit_operation() == overlay::operation_blocked )
+            {
+                // ignore multiple BLOCKs
+                if ( op == overlay::operation_blocked )
+                    return;
+
+                if ( op == overlay::operation_intersection
+                  && turn_on_the_same_ip<op_id>(m_exit_watcher.get_exit_turn(), *it) )
+                {
+                    fake_enter_detected = true;
+                }
+
+                m_exit_watcher.reset_detected_exit();
+            }
+
+            // i/i, i/x, i/u
+            if ( op == overlay::operation_intersection )
+            {
+                bool const was_outside = m_exit_watcher.is_outside();
+                m_exit_watcher.enter(*it);
+
+                // interiors overlaps
+                update<interior, interior, '1', transpose_result>(res);
+
+                bool const this_b = it->operations[op_id].position == overlay::position_front // ignore spikes!
+                                 && is_ip_on_boundary<boundary_front>(it->point,
+                                                                      it->operations[op_id],
+                                                                      boundary_checker,
+                                                                      seg_id);
+
+                // going inside on boundary point
+                // may be front only
+                if ( this_b )
+                {
+                    // may be front and back
+                    bool const other_b = is_ip_on_boundary<boundary_any>(it->point,
+                                                                         it->operations[other_op_id],
+                                                                         other_boundary_checker,
+                                                                         other_id);
+
+                    // it's also the boundary of the other geometry
+                    if ( other_b )
+                    {
+                        update<boundary, boundary, '0', transpose_result>(res);
+                    }
+                    else
+                    {
+                        update<boundary, interior, '0', transpose_result>(res);
+                    }
+                }
+                // going inside on non-boundary point
+                else
+                {
+                    // if we didn't enter in the past, we were outside
+                    if ( was_outside
+                      && ! fake_enter_detected
+                      && it->operations[op_id].position != overlay::position_front
+                      && ! m_collinear_spike_exit )
+                    {
+                        update<interior, exterior, '1', transpose_result>(res);
+
+                        // if it's the first IP then the first point is outside
+                        if ( first_in_range )
+                        {
+                            bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                    range::front(sub_range(geometry, seg_id)),
+                                                    boundary_checker);
+
+                            // if there is a boundary on the first point
+                            if ( front_b )
+                            {
+                                update<boundary, exterior, '0', transpose_result>(res);
+                            }
+                        }
+                    }
+                }
+
+                m_collinear_spike_exit = false;
+            }
+            // u/i, u/u, u/x, x/i, x/u, x/x
+            else if ( op == overlay::operation_union || op == overlay::operation_blocked )
+            {
+                // TODO: is exit watcher still needed?
+                // couldn't is_collinear and some going inside counter be used instead?
+
+                bool const is_collinear = it->operations[op_id].is_collinear;
+                bool const was_outside = m_exit_watcher.is_outside()
+                                      && m_exit_watcher.get_exit_operation() == overlay::operation_none;
+// TODO: move the above condition into the exit_watcher?
+
+                // to exit we must be currently inside and the current segment must be collinear
+                if ( !was_outside && is_collinear )
+                {
+                    m_exit_watcher.exit(*it, false);
+                    // if the position is not set to back it must be a spike
+                    if ( it->operations[op_id].position != overlay::position_back )
+                    {
+                        m_collinear_spike_exit = true;
+                    }
+                }
+
+                bool const op_blocked = op == overlay::operation_blocked;
+
+                // we're inside and going out from inside
+                // possibly going out right now
+                if ( ! was_outside && is_collinear )
+                {
+                    if ( op_blocked
+                      && it->operations[op_id].position == overlay::position_back ) // ignore spikes!
+                    {
+                        // check if this is indeed the boundary point
+                        // NOTE: is_ip_on_boundary<>() should be called here but the result will be the same
+                        if ( is_endpoint_on_boundary<boundary_back>(it->point, boundary_checker) )
+                        {
+                            // may be front and back
+                            bool const other_b = is_ip_on_boundary<boundary_any>(it->point,
+                                                                                 it->operations[other_op_id],
+                                                                                 other_boundary_checker,
+                                                                                 other_id);
+                            // it's also the boundary of the other geometry
+                            if ( other_b )
+                            {
+                                update<boundary, boundary, '0', transpose_result>(res);
+                            }
+                            else
+                            {
+                                update<boundary, interior, '0', transpose_result>(res);
+                            }
+                        }
+                    }
+                }
+                // we're outside or intersects some segment from the outside
+                else
+                {
+                    // if we are truly outside
+                    if ( was_outside
+                      && it->operations[op_id].position != overlay::position_front
+                      && ! m_collinear_spike_exit
+                      /*&& !is_collinear*/ )
+                    {
+                        update<interior, exterior, '1', transpose_result>(res);
+                    }
+
+                    // boundaries don't overlap - just an optimization
+                    if ( it->method == overlay::method_crosses )
+                    {
+                        // the L1 is going from one side of the L2 to the other through the point
+                        update<interior, interior, '0', transpose_result>(res);
+
+                        // it's the first point in range
+                        if ( first_in_range )
+                        {
+                            bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                    range::front(sub_range(geometry, seg_id)),
+                                                    boundary_checker);
+
+                            // if there is a boundary on the first point
+                            if ( front_b )
+                            {
+                                update<boundary, exterior, '0', transpose_result>(res);
+                            }
+                        }
+                    }
+                    // method other than crosses, check more conditions
+                    else
+                    {
+                        bool const this_b = is_ip_on_boundary<boundary_any>(it->point,
+                                                                            it->operations[op_id],
+                                                                            boundary_checker,
+                                                                            seg_id);
+
+                        bool const other_b = is_ip_on_boundary<boundary_any>(it->point,
+                                                                             it->operations[other_op_id],
+                                                                             other_boundary_checker,
+                                                                             other_id);
+                        
+                        // if current IP is on boundary of the geometry
+                        if ( this_b )
+                        {
+                            // it's also the boundary of the other geometry
+                            if ( other_b )
+                            {
+                                update<boundary, boundary, '0', transpose_result>(res);
+                            }
+                            else
+                            {
+                                update<boundary, interior, '0', transpose_result>(res);
+                            }
+                        }
+                        // if current IP is not on boundary of the geometry
+                        else
+                        {
+                            // it's also the boundary of the other geometry
+                            if ( other_b )
+                            {
+                                update<interior, boundary, '0', transpose_result>(res);
+                            }
+                            else
+                            {
+                                update<interior, interior, '0', transpose_result>(res);
+                            }
+                        }
+
+                        // first IP on the last segment point - this means that the first point is outside
+                        if ( first_in_range
+                          && ( !this_b || op_blocked )
+                          && was_outside
+                          && it->operations[op_id].position != overlay::position_front
+                          && ! m_collinear_spike_exit
+                          /*&& !is_collinear*/ )
+                        {
+                            bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                    range::front(sub_range(geometry, seg_id)),
+                                                    boundary_checker);
+
+                            // if there is a boundary on the first point
+                            if ( front_b )
+                            {
+                                update<boundary, exterior, '0', transpose_result>(res);
+                            }
+                        }
+                            
+                    }
+                }
+            }
+
+            // store ref to previously analysed (valid) turn
+            m_previous_turn_ptr = boost::addressof(*it);
+            // and previously analysed (valid) operation
+            m_previous_operation = op;
+        }
+
+        // Called for last
+        template <typename Result,
+                  typename TurnIt,
+                  typename Geometry,
+                  typename OtherGeometry,
+                  typename BoundaryChecker,
+                  typename OtherBoundaryChecker>
+        void apply(Result & res,
+                   TurnIt first, TurnIt last,
+                   Geometry const& geometry,
+                   OtherGeometry const& /*other_geometry*/,
+                   BoundaryChecker const& boundary_checker,
+                   OtherBoundaryChecker const& /*other_boundary_checker*/)
+        {
+            boost::ignore_unused(first, last);
+            //BOOST_ASSERT( first != last );
+
+            // here, the possible exit is the real one
+            // we know that we entered and now we exit
+            if ( /*m_exit_watcher.get_exit_operation() == overlay::operation_union // THIS CHECK IS REDUNDANT
+                ||*/ m_previous_operation == overlay::operation_union
+                || m_degenerated_turn_ptr )
+            {
+                update<interior, exterior, '1', transpose_result>(res);
+
+                BOOST_ASSERT(first != last);
+
+                const TurnInfo * turn_ptr = NULL;
+                if ( m_degenerated_turn_ptr )
+                    turn_ptr = m_degenerated_turn_ptr;
+                else if ( m_previous_turn_ptr )
+                    turn_ptr = m_previous_turn_ptr;
+                
+                if ( turn_ptr )
+                {
+                    segment_identifier const& prev_seg_id = turn_ptr->operations[op_id].seg_id;
+
+                    //BOOST_ASSERT(!boost::empty(sub_range(geometry, prev_seg_id)));
+                    bool const prev_back_b = is_endpoint_on_boundary<boundary_back>(
+                                                range::back(sub_range(geometry, prev_seg_id)),
+                                                boundary_checker);
+
+                    // if there is a boundary on the last point
+                    if ( prev_back_b )
+                    {
+                        update<boundary, exterior, '0', transpose_result>(res);
+                    }
+                }
+            }
+
+            // Just in case,
+            // reset exit watcher before the analysis of the next Linestring
+            // note that if there are some enters stored there may be some error above
+            m_exit_watcher.reset();
+
+            m_previous_turn_ptr = NULL;
+            m_previous_operation = overlay::operation_none;
+            m_degenerated_turn_ptr = NULL;
+
+            // actually if this is set to true here there is some error
+            // in get_turns_ll or relate_ll, an assert could be checked here
+            m_collinear_spike_exit = false;
+        }
+
+        template <typename Result,
+                  typename Turn,
+                  typename Geometry,
+                  typename OtherGeometry,
+                  typename BoundaryChecker,
+                  typename OtherBoundaryChecker>
+        void handle_degenerated(Result & res,
+                                Turn const& turn,
+                                Geometry const& geometry,
+                                OtherGeometry const& other_geometry,
+                                BoundaryChecker const& boundary_checker,
+                                OtherBoundaryChecker const& /*other_boundary_checker*/,
+                                bool first_in_range)
+        {
+            typename detail::single_geometry_return_type<Geometry const>::type
+                ls1_ref = detail::single_geometry(geometry, turn.operations[op_id].seg_id);
+            typename detail::single_geometry_return_type<OtherGeometry const>::type
+                ls2_ref = detail::single_geometry(other_geometry, turn.operations[other_op_id].seg_id);
+
+            // only one of those should be true:
+
+            if ( turn.operations[op_id].position == overlay::position_front )
+            {
+                // valid, point-sized
+                if ( boost::size(ls2_ref) == 2 )
+                {
+                    bool const front_b = is_endpoint_on_boundary<boundary_front>(turn.point, boundary_checker);
+
+                    if ( front_b )
+                    {
+                        update<boundary, interior, '0', transpose_result>(res);
+                    }
+                    else
+                    {
+                        update<interior, interior, '0', transpose_result>(res);
+                    }
+
+                    // operation 'c' should be last for the same IP so we know that the next point won't be the same
+                    update<interior, exterior, '1', transpose_result>(res);
+
+                    m_degenerated_turn_ptr = boost::addressof(turn);
+                }
+            }
+            else if ( turn.operations[op_id].position == overlay::position_back )
+            {
+                // valid, point-sized
+                if ( boost::size(ls2_ref) == 2 )
+                {
+                    update<interior, exterior, '1', transpose_result>(res);
+
+                    bool const back_b = is_endpoint_on_boundary<boundary_back>(turn.point, boundary_checker);
+
+                    if ( back_b )
+                    {
+                        update<boundary, interior, '0', transpose_result>(res);
+                    }
+                    else
+                    {
+                        update<interior, interior, '0', transpose_result>(res);
+                    }
+
+                    if ( first_in_range )
+                    {
+                        //BOOST_ASSERT(!boost::empty(ls1_ref));
+                        bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                range::front(ls1_ref), boundary_checker);
+                        if ( front_b )
+                        {
+                            update<boundary, exterior, '0', transpose_result>(res);
+                        }
+                    }
+                }
+            }
+            else if ( turn.operations[op_id].position == overlay::position_middle
+                   && turn.operations[other_op_id].position == overlay::position_middle )
+            {
+                update<interior, interior, '0', transpose_result>(res);
+
+                // here we don't know which one is degenerated
+
+                bool const is_point1 = boost::size(ls1_ref) == 2
+                                    && equals::equals_point_point(range::front(ls1_ref), range::back(ls1_ref));
+                bool const is_point2 = boost::size(ls2_ref) == 2
+                                    && equals::equals_point_point(range::front(ls2_ref), range::back(ls2_ref));
+
+                // if the second one is degenerated
+                if ( !is_point1 && is_point2 )
+                {
+                    update<interior, exterior, '1', transpose_result>(res);
+
+                    if ( first_in_range )
+                    {
+                        //BOOST_ASSERT(!boost::empty(ls1_ref));
+                        bool const front_b = is_endpoint_on_boundary<boundary_front>(
+                                                range::front(ls1_ref), boundary_checker);
+                        if ( front_b )
+                        {
+                            update<boundary, exterior, '0', transpose_result>(res);
+                        }
+                    }
+
+                    m_degenerated_turn_ptr = boost::addressof(turn);
+                }
+            }
+
+            // NOTE: other.position == front and other.position == back
+            //       will be handled later, for the other geometry
+        }
+
+    private:
+        exit_watcher<TurnInfo, OpId> m_exit_watcher;
+        segment_watcher<same_single> m_seg_watcher;
+        const TurnInfo * m_previous_turn_ptr;
+        overlay::operation_type m_previous_operation;
+        const TurnInfo * m_degenerated_turn_ptr;
+        bool m_collinear_spike_exit;
+    };
+
+    template <typename Result,
+              typename TurnIt,
+              typename Analyser,
+              typename Geometry,
+              typename OtherGeometry,
+              typename BoundaryChecker,
+              typename OtherBoundaryChecker>
+    static inline void analyse_each_turn(Result & res,
+                                         Analyser & analyser,
+                                         TurnIt first, TurnIt last,
+                                         Geometry const& geometry,
+                                         OtherGeometry const& other_geometry,
+                                         BoundaryChecker const& boundary_checker,
+                                         OtherBoundaryChecker const& other_boundary_checker)
+    {
+        if ( first == last )
+            return;
+
+        for ( TurnIt it = first ; it != last ; ++it )
+        {
+            analyser.apply(res, it,
+                           geometry, other_geometry,
+                           boundary_checker, other_boundary_checker);
+
+            if ( BOOST_GEOMETRY_CONDITION( res.interrupt ) )
+                return;
+        }
+
+        analyser.apply(res, first, last,
+                       geometry, other_geometry,
+                       boundary_checker, other_boundary_checker);
+    }
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_LINEAR_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/point_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,207 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_GEOMETRY_HPP
+
+#include <boost/geometry/algorithms/detail/within/point_in_geometry.hpp>
+//#include <boost/geometry/algorithms/within.hpp>
+//#include <boost/geometry/algorithms/covered_by.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/topology_check.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+// non-point geometry
+template <typename Point, typename Geometry, bool Transpose = false>
+struct point_geometry
+{
+    // TODO: interrupt only if the topology check is complex
+
+    static const bool interruption_enabled = true;
+
+    template <typename Result>
+    static inline void apply(Point const& point, Geometry const& geometry, Result & result)
+    {
+        int pig = detail::within::point_in_geometry(point, geometry);
+
+        if ( pig > 0 ) // within
+        {
+            set<interior, interior, '0', Transpose>(result);
+        }
+        else if ( pig == 0 )
+        {
+            set<interior, boundary, '0', Transpose>(result);
+        }
+        else // pig < 0 - not within
+        {
+            set<interior, exterior, '0', Transpose>(result);
+        }
+
+        set<exterior, exterior, result_dimension<Point>::value, Transpose>(result);
+
+        if ( BOOST_GEOMETRY_CONDITION(result.interrupt) )
+            return;
+
+        // the point is on the boundary
+        if ( pig == 0 )
+        {
+            // NOTE: even for MLs, if there is at least one boundary point,
+            // somewhere there must be another one
+
+            // check if there are other boundaries outside
+            typedef detail::relate::topology_check<Geometry> tc_t;
+            //tc_t tc(geometry, point);
+            //if ( tc.has_interior )
+                set<exterior, interior, tc_t::interior, Transpose>(result);
+            //if ( tc.has_boundary )
+                set<exterior, boundary, tc_t::boundary, Transpose>(result);
+        }
+        else
+        {
+            // check if there is a boundary in Geometry
+            typedef detail::relate::topology_check<Geometry> tc_t;
+            tc_t tc(geometry);
+            if ( tc.has_interior )
+                set<exterior, interior, tc_t::interior, Transpose>(result);
+            if ( tc.has_boundary )
+                set<exterior, boundary, tc_t::boundary, Transpose>(result);
+        }
+    }
+};
+
+// transposed result of point_geometry
+template <typename Geometry, typename Point>
+struct geometry_point
+{
+    // TODO: interrupt only if the topology check is complex
+
+    static const bool interruption_enabled = true;
+
+    template <typename Result>
+    static inline void apply(Geometry const& geometry, Point const& point, Result & result)
+    {
+        point_geometry<Point, Geometry, true>::apply(point, geometry, result);
+    }
+};
+
+// TODO: rewrite the folowing:
+
+//// NOTE: Those tests should be consistent with within(Point, Box) and covered_by(Point, Box)
+//// There is no EPS used in those functions, values are compared using < or <=
+//// so comparing MIN and MAX in the same way should be fine
+//
+//template <typename Box, std::size_t I = 0, std::size_t D = geometry::dimension<Box>::value>
+//struct box_has_interior
+//{
+//    static inline bool apply(Box const& box)
+//    {
+//        return geometry::get<min_corner, I>(box) < geometry::get<max_corner, I>(box)
+//            && box_has_interior<Box, I + 1, D>::apply(box);
+//    }
+//};
+//
+//template <typename Box, std::size_t D>
+//struct box_has_interior<Box, D, D>
+//{
+//    static inline bool apply(Box const&) { return true; }
+//};
+//
+//// NOTE: especially important here (see the NOTE above).
+//
+//template <typename Box, std::size_t I = 0, std::size_t D = geometry::dimension<Box>::value>
+//struct box_has_equal_min_max
+//{
+//    static inline bool apply(Box const& box)
+//    {
+//        return geometry::get<min_corner, I>(box) == geometry::get<max_corner, I>(box)
+//            && box_has_equal_min_max<Box, I + 1, D>::apply(box);
+//    }
+//};
+//
+//template <typename Box, std::size_t D>
+//struct box_has_equal_min_max<Box, D, D>
+//{
+//    static inline bool apply(Box const&) { return true; }
+//};
+//
+//template <typename Point, typename Box>
+//struct point_box
+//{
+//    static inline result apply(Point const& point, Box const& box)
+//    {
+//        result res;
+//
+//        if ( geometry::within(point, box) ) // this also means that the box has interior
+//        {
+//            return result("0FFFFFTTT");
+//        }
+//        else if ( geometry::covered_by(point, box) ) // point is on the boundary
+//        {
+//            //if ( box_has_interior<Box>::apply(box) )
+//            //{
+//            //    return result("F0FFFFTTT");
+//            //}
+//            //else if ( box_has_equal_min_max<Box>::apply(box) ) // no boundary outside point
+//            //{
+//            //    return result("F0FFFFFFT");
+//            //}
+//            //else // no interior outside point
+//            //{
+//            //    return result("F0FFFFFTT");
+//            //}
+//            return result("F0FFFF**T");
+//        }
+//        else 
+//        {
+//            /*if ( box_has_interior<Box>::apply(box) )
+//            {
+//                return result("FF0FFFTTT");
+//            }
+//            else
+//            {
+//                return result("FF0FFFFTT");
+//            }*/
+//            return result("FF0FFF*TT");
+//        }
+//
+//        return res;
+//    }
+//};
+//
+//template <typename Box, typename Point>
+//struct box_point
+//{
+//    static inline result apply(Box const& box, Point const& point)
+//    {
+//        if ( geometry::within(point, box) )
+//            return result("0FTFFTFFT");
+//        else if ( geometry::covered_by(point, box) )
+//            return result("FF*0F*FFT");
+//        else 
+//            return result("FF*FFT0FT");
+//    }
+//};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/point_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,242 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013, 2014, Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_POINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_POINT_HPP
+
+#include <algorithm>
+#include <vector>
+
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+#include <boost/geometry/algorithms/detail/within/point_in_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/less.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+template <typename Point1, typename Point2>
+struct point_point
+{
+    static const bool interruption_enabled = false;
+
+    template <typename Result>
+    static inline void apply(Point1 const& point1, Point2 const& point2, Result & result)
+    {
+        bool equal = detail::equals::equals_point_point(point1, point2);
+        if ( equal )
+        {
+            set<interior, interior, '0'>(result);
+        }
+        else
+        {
+            set<interior, exterior, '0'>(result);
+            set<exterior, interior, '0'>(result);
+        }
+
+        set<exterior, exterior, result_dimension<Point1>::value>(result);
+    }
+};
+
+template <typename Point, typename MultiPoint>
+std::pair<bool, bool> point_multipoint_check(Point const& point, MultiPoint const& multi_point)
+{
+    bool found_inside = false;
+    bool found_outside = false;
+
+    // point_in_geometry could be used here but why iterate over MultiPoint twice?
+    // we must search for a point in the exterior because all points in MultiPoint can be equal
+
+    typedef typename boost::range_iterator<MultiPoint const>::type iterator;
+    iterator it = boost::begin(multi_point);
+    iterator last = boost::end(multi_point);
+    for ( ; it != last ; ++it )
+    {
+        bool ii = detail::equals::equals_point_point(point, *it);
+
+        if ( ii )
+            found_inside = true;
+        else
+            found_outside = true;
+
+        if ( found_inside && found_outside )
+            break;
+    }
+
+    return std::make_pair(found_inside, found_outside);
+}
+
+template <typename Point, typename MultiPoint, bool Transpose = false>
+struct point_multipoint
+{
+    static const bool interruption_enabled = false;
+
+    template <typename Result>
+    static inline void apply(Point const& point, MultiPoint const& multi_point, Result & result)
+    {
+        if ( boost::empty(multi_point) )
+        {
+            // TODO: throw on empty input?
+            set<interior, exterior, '0', Transpose>(result);
+            return;
+        }
+
+        std::pair<bool, bool> rel = point_multipoint_check(point, multi_point);
+
+        if ( rel.first ) // some point of MP is equal to P
+        {
+            set<interior, interior, '0', Transpose>(result);
+
+            if ( rel.second ) // a point of MP was found outside P
+            {
+                set<exterior, interior, '0', Transpose>(result);
+            }
+        }
+        else
+        {
+            set<interior, exterior, '0', Transpose>(result);
+            set<exterior, interior, '0', Transpose>(result);
+        }
+
+        set<exterior, exterior, result_dimension<Point>::value, Transpose>(result);
+    }
+};
+
+template <typename MultiPoint, typename Point>
+struct multipoint_point
+{
+    static const bool interruption_enabled = false;
+
+    template <typename Result>
+    static inline void apply(MultiPoint const& multi_point, Point const& point, Result & result)
+    {
+        point_multipoint<Point, MultiPoint, true>::apply(point, multi_point, result);
+    }
+};
+
+template <typename MultiPoint1, typename MultiPoint2>
+struct multipoint_multipoint
+{
+    static const bool interruption_enabled = true;
+
+    template <typename Result>
+    static inline void apply(MultiPoint1 const& multi_point1, MultiPoint2 const& multi_point2, Result & result)
+    {
+        {
+            // TODO: throw on empty input?
+            bool empty1 = boost::empty(multi_point1);
+            bool empty2 = boost::empty(multi_point2);
+            if ( empty1 && empty2 )
+            {
+                return;
+            }
+            else if ( empty1 )
+            {
+                set<exterior, interior, '0'>(result);
+                return;
+            }
+            else if ( empty2 )
+            {
+                set<interior, exterior, '0'>(result);
+                return;
+            }
+        }
+
+// TODO: ADD A CHECK TO THE RESULT INDICATING IF THE FIRST AND/OR SECOND GEOMETRY MUST BE ANALYSED
+
+// TODO: if I/I is set for one MPt, this won't be changed when the other one in analysed
+//       so if e.g. only I/I must be analysed we musn't check the other MPt
+
+// TODO: Also, the geometry with the smaller number of points may be analysed first
+        //if ( boost::size(multi_point1) < boost::size(multi_point2) )
+
+        // NlogN + MlogN
+        bool all_handled = search<false>(multi_point1, multi_point2, result);
+        
+        if ( all_handled || result.interrupt )
+            return;
+
+        // MlogM + NlogM
+        search<true>(multi_point2, multi_point1, result);
+    }
+
+    template <bool Transpose,
+              typename SortedMultiPoint,
+              typename IteratedMultiPoint,
+              typename Result>
+    static inline bool search(SortedMultiPoint const& sorted_mpt,
+                              IteratedMultiPoint const& iterated_mpt,
+                              Result & result)
+    {
+        // sort points from the 1 MPt
+        typedef typename geometry::point_type<SortedMultiPoint>::type point_type;
+        std::vector<point_type> points(boost::begin(sorted_mpt), boost::end(sorted_mpt));
+        std::sort(points.begin(), points.end(), less());
+
+        bool found_inside = false;
+        bool found_outside = false;
+
+        // for each point in the second MPt
+        typedef typename boost::range_iterator<IteratedMultiPoint const>::type iterator;
+        for ( iterator it = boost::begin(iterated_mpt) ;
+              it != boost::end(iterated_mpt) ; ++it )
+        {
+            bool ii =
+                std::binary_search(points.begin(), points.end(), *it, less());
+            if ( ii )
+                found_inside = true;
+            else
+                found_outside = true;
+
+            if ( found_inside && found_outside )
+                break;
+        }
+
+        // an optimization
+        bool all_handled = false;
+
+        if ( found_inside ) // some point of MP2 is equal to some of MP1
+        {
+// TODO: if I/I is set for one MPt, this won't be changed when the other one in analysed
+//       so if e.g. only I/I must be analysed we musn't check the other MPt
+
+            set<interior, interior, '0', Transpose>(result);
+
+            if ( found_outside ) // some point of MP2 was found outside of MP1
+            {
+                set<exterior, interior, '0', Transpose>(result);
+            }
+        }
+        else
+        {
+            set<interior, exterior, '0', Transpose>(result);
+            set<exterior, interior, '0', Transpose>(result);
+
+            // if no point is intersecting the other MPt then we musn't analyse the reversed case
+            all_handled = true;
+        }
+
+        set<exterior, exterior, result_dimension<point_type>::value, Transpose>(result);
+
+        return all_handled;
+    }
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_POINT_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/relate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,339 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013-2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RELATE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RELATE_HPP
+
+#include <cstddef>
+
+#include <boost/concept_check.hpp>
+#include <boost/range.hpp>
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+
+#include <boost/geometry/algorithms/make.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/point_order.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+#include <boost/geometry/strategies/concepts/within_concept.hpp>
+#include <boost/geometry/strategies/default_strategy.hpp>
+#include <boost/geometry/strategies/within.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/order_as_direction.hpp>
+#include <boost/geometry/views/closeable_view.hpp>
+#include <boost/geometry/views/reversible_view.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/result.hpp>
+
+#include <boost/geometry/algorithms/detail/relate/point_point.hpp>
+#include <boost/geometry/algorithms/detail/relate/point_geometry.hpp>
+#include <boost/geometry/algorithms/detail/relate/linear_linear.hpp>
+#include <boost/geometry/algorithms/detail/relate/linear_areal.hpp>
+#include <boost/geometry/algorithms/detail/relate/areal_areal.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+// Those are used only to allow dispatch::relate to produce compile-time error
+
+template <typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type>
+struct is_supported_by_generic
+{
+    static const bool value
+        = boost::is_same<Tag, linestring_tag>::value
+       || boost::is_same<Tag, multi_linestring_tag>::value
+       || boost::is_same<Tag, ring_tag>::value
+       || boost::is_same<Tag, polygon_tag>::value
+       || boost::is_same<Tag, multi_polygon_tag>::value;
+};
+
+template <typename Geometry1,
+          typename Geometry2,
+          typename Tag1 = typename geometry::tag<Geometry1>::type,
+          typename Tag2 = typename geometry::tag<Geometry2>::type>
+struct is_generic
+{
+    static const bool value = is_supported_by_generic<Geometry1>::value
+                           && is_supported_by_generic<Geometry2>::value;
+};
+
+
+template <typename Point, typename Geometry, typename Tag>
+struct is_generic<Point, Geometry, point_tag, Tag>
+{
+    static const bool value = is_supported_by_generic<Geometry>::value;
+};
+
+template <typename Geometry, typename Point, typename Tag>
+struct is_generic<Geometry, Point, Tag, point_tag>
+{
+    static const bool value = is_supported_by_generic<Geometry>::value;
+};
+
+template <typename Point1, typename Point2>
+struct is_generic<Point1, Point2, point_tag, point_tag>
+{
+    static const bool value = false;
+};
+
+
+}} // namespace detail::relate
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch { namespace relate {
+
+
+template <typename Geometry1,
+          typename Geometry2,
+          typename Tag1 = typename geometry::tag<Geometry1>::type,
+          typename Tag2 = typename geometry::tag<Geometry2>::type,
+          int TopDim1 = geometry::topological_dimension<Geometry1>::value,
+          int TopDim2 = geometry::topological_dimension<Geometry2>::value,
+          bool IsGeneric = detail::relate::is_generic<Geometry1, Geometry2>::value
+>
+struct relate : not_implemented<Tag1, Tag2>
+{};
+
+
+template <typename Point1, typename Point2>
+struct relate<Point1, Point2, point_tag, point_tag, 0, 0, false>
+    : detail::relate::point_point<Point1, Point2>
+{};
+
+template <typename Point, typename MultiPoint>
+struct relate<Point, MultiPoint, point_tag, multi_point_tag, 0, 0, false>
+    : detail::relate::point_multipoint<Point, MultiPoint>
+{};
+
+template <typename MultiPoint, typename Point>
+struct relate<MultiPoint, Point, multi_point_tag, point_tag, 0, 0, false>
+    : detail::relate::multipoint_point<MultiPoint, Point>
+{};
+
+template <typename MultiPoint1, typename MultiPoint2>
+struct relate<MultiPoint1, MultiPoint2, multi_point_tag, multi_point_tag, 0, 0, false>
+    : detail::relate::multipoint_multipoint<MultiPoint1, MultiPoint2>
+{};
+
+//template <typename Point, typename Box, int TopDim2>
+//struct relate<Point, Box, point_tag, box_tag, 0, TopDim2, false>
+//    : detail::relate::point_box<Point, Box>
+//{};
+//
+//template <typename Box, typename Point, int TopDim1>
+//struct relate<Box, Point, box_tag, point_tag, TopDim1, 0, false>
+//    : detail::relate::box_point<Box, Point>
+//{};
+
+
+template <typename Point, typename Geometry, typename Tag2, int TopDim2>
+struct relate<Point, Geometry, point_tag, Tag2, 0, TopDim2, true>
+    : detail::relate::point_geometry<Point, Geometry>
+{};
+
+template <typename Geometry, typename Point, typename Tag1, int TopDim1>
+struct relate<Geometry, Point, Tag1, point_tag, TopDim1, 0, true>
+    : detail::relate::geometry_point<Geometry, Point>
+{};
+
+
+template <typename Linear1, typename Linear2, typename Tag1, typename Tag2>
+struct relate<Linear1, Linear2, Tag1, Tag2, 1, 1, true>
+    : detail::relate::linear_linear<Linear1, Linear2>
+{};
+
+
+template <typename Linear, typename Areal, typename Tag1, typename Tag2>
+struct relate<Linear, Areal, Tag1, Tag2, 1, 2, true>
+    : detail::relate::linear_areal<Linear, Areal>
+{};
+
+template <typename Areal, typename Linear, typename Tag1, typename Tag2>
+struct relate<Areal, Linear, Tag1, Tag2, 2, 1, true>
+    : detail::relate::areal_linear<Areal, Linear>
+{};
+
+
+template <typename Areal1, typename Areal2, typename Tag1, typename Tag2>
+struct relate<Areal1, Areal2, Tag1, Tag2, 2, 2, true>
+    : detail::relate::areal_areal<Areal1, Areal2>
+{};
+
+
+}} // namespace detail_dispatch::relate
+#endif // DOXYGEN_NO_DISPATCH
+
+namespace detail { namespace relate {
+
+template <typename Geometry1, typename Geometry2>
+struct interruption_enabled
+{
+    static const bool value =
+        detail_dispatch::relate::relate<Geometry1, Geometry2>::interruption_enabled;
+};
+
+template <typename Geometry1,
+          typename Geometry2,
+          typename Result,
+          bool IsSequence = boost::mpl::is_sequence<Result>::value>
+struct result_handler_type
+    : not_implemented<Result>
+{};
+
+template <typename Geometry1, typename Geometry2>
+struct result_handler_type<Geometry1, Geometry2, matrix9, false>
+{
+    typedef matrix_handler<matrix9> type;
+};
+
+template <typename Geometry1, typename Geometry2>
+struct result_handler_type<Geometry1, Geometry2, mask9, false>
+{
+    typedef mask_handler
+        <
+            mask9,
+            interruption_enabled
+                <
+                    Geometry1,
+                    Geometry2
+                >::value
+        > type;
+};
+
+template <typename Geometry1, typename Geometry2, typename Head, typename Tail>
+struct result_handler_type<Geometry1, Geometry2, boost::tuples::cons<Head, Tail>, false>
+{
+    typedef mask_handler
+        <
+            boost::tuples::cons<Head, Tail>,
+            interruption_enabled
+                <
+                    Geometry1,
+                    Geometry2
+                >::value
+        > type;
+};
+
+template <typename Geometry1, typename Geometry2,
+          char II, char IB, char IE,
+          char BI, char BB, char BE,
+          char EI, char EB, char EE>
+struct result_handler_type<Geometry1, Geometry2, static_mask<II, IB, IE, BI, BB, BE, EI, EB, EE>, false>
+{
+    typedef static_mask_handler
+        <
+            static_mask<II, IB, IE, BI, BB, BE, EI, EB, EE>,
+            interruption_enabled
+                <
+                    Geometry1,
+                    Geometry2
+                >::value
+        > type;
+};
+
+template <typename Geometry1, typename Geometry2, typename StaticSequence>
+struct result_handler_type<Geometry1, Geometry2, StaticSequence, true>
+{
+    typedef static_mask_handler
+        <
+            StaticSequence,
+            interruption_enabled
+                <
+                    Geometry1,
+                    Geometry2
+                >::value
+        > type;
+};
+
+template <typename MatrixOrMask, typename Geometry1, typename Geometry2>
+inline
+typename result_handler_type
+    <
+        Geometry1,
+        Geometry2,
+        MatrixOrMask
+    >::type::result_type
+relate(Geometry1 const& geometry1,
+       Geometry2 const& geometry2,
+       MatrixOrMask const& matrix_or_mask = MatrixOrMask())
+{
+    typedef typename result_handler_type
+        <
+            Geometry1,
+            Geometry2,
+            MatrixOrMask
+        >::type handler_type;
+
+    handler_type handler(matrix_or_mask);
+    detail_dispatch::relate::relate<Geometry1, Geometry2>::apply(geometry1, geometry2, handler);
+    return handler.result();
+}
+
+struct implemented_tag {};
+
+template <template <typename, typename> class StaticMaskTrait,
+          typename Geometry1,
+          typename Geometry2>
+struct relate_base
+    : boost::mpl::if_
+        <
+            boost::mpl::or_
+                <
+                    boost::is_base_of
+                        <
+                            nyi::not_implemented_tag,
+                            StaticMaskTrait<Geometry1, Geometry2>
+                        >,
+                    boost::is_base_of
+                        <
+                            nyi::not_implemented_tag,
+                            detail_dispatch::relate::relate<Geometry1, Geometry2>
+                        >
+                >,
+            not_implemented
+                <
+                    typename geometry::tag<Geometry1>::type,
+                    typename geometry::tag<Geometry2>::type
+                >,
+            implemented_tag
+        >::type
+{
+    static inline bool apply(Geometry1 const& g1, Geometry2 const& g2)
+    {
+        typedef typename StaticMaskTrait<Geometry1, Geometry2>::type static_mask;
+        return detail::relate::relate<static_mask>(g1, g2);
+    }
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RELATE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/result.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1391 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RESULT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RESULT_HPP
+
+#include <boost/tuple/tuple.hpp>
+
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/vector_c.hpp>
+
+#include <boost/geometry/core/topological_dimension.hpp>
+#include <boost/geometry/util/condition.hpp>
+
+// TEMP - move this header to geometry/detail
+#include <boost/geometry/index/detail/tuples.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+enum field { interior = 0, boundary = 1, exterior = 2 };
+
+// TODO: IF THE RESULT IS UPDATED WITH THE MAX POSSIBLE VALUE FOR SOME PAIR OF GEOEMTRIES
+// THE VALUE ALREADY STORED MUSN'T BE CHECKED
+// update() calls chould be replaced with set() in those cases
+// but for safety reasons (STATIC_ASSERT) we should check if parameter D is valid and set() doesn't do that
+// so some additional function could be added, e.g. set_dim()
+
+// matrix
+
+// TODO add height?
+
+template <std::size_t Width>
+class matrix
+{
+    BOOST_STATIC_ASSERT(Width == 2 || Width == 3);
+
+public:
+
+    static const std::size_t size = Width * Width;
+    
+    inline matrix()
+    {
+        ::memset(m_array, 'F', size);
+    }
+
+    template <field F1, field F2>
+    inline char get() const
+    {
+        static const bool in_bounds = F1 * Width + F2 < size;
+        return get_dispatch<F1, F2>(integral_constant<bool, in_bounds>());
+    }
+
+    template <field F1, field F2, char V>
+    inline void set()
+    {
+        static const bool in_bounds = F1 * Width + F2 < size;
+        set_dispatch<F1, F2, V>(integral_constant<bool, in_bounds>());
+    }
+
+    template <field F1, field F2, char D>
+    inline void update()
+    {
+        static const bool in_bounds = F1 * Width + F2 < size;
+        update_dispatch<F1, F2, D>(integral_constant<bool, in_bounds>());
+    }
+    
+    inline const char * data() const
+    {
+        return m_array;
+    }
+
+private:
+    template <field F1, field F2>
+    inline char get_dispatch(integral_constant<bool, true>) const
+    {
+        return m_array[F1 * Width + F2];
+    }
+    template <field F1, field F2>
+    inline char get_dispatch(integral_constant<bool, false>) const
+    {
+        return 'F';
+    }
+
+    template <field F1, field F2, char V>
+    inline void set_dispatch(integral_constant<bool, true>)
+    {
+        BOOST_STATIC_ASSERT(('0' <= V && V <= '9') || V == 'T' || V == 'F');
+        m_array[F1 * Width + F2] = V;
+    }
+    template <field F1, field F2, char V>
+    inline void set_dispatch(integral_constant<bool, false>)
+    {}
+
+    template <field F1, field F2, char D>
+    inline void update_dispatch(integral_constant<bool, true>)
+    {
+        BOOST_STATIC_ASSERT('0' <= D && D <= '9');
+        char c = m_array[F1 * Width + F2];
+        if ( D > c || c > '9')
+            m_array[F1 * Width + F2] = D;
+    }
+    template <field F1, field F2, char D>
+    inline void update_dispatch(integral_constant<bool, false>)
+    {}
+
+    char m_array[size];
+};
+
+// TODO add EnableDimensions parameter?
+
+struct matrix9 {};
+//struct matrix4 {};
+
+// matrix_width
+
+template <typename MatrixOrMask>
+struct matrix_width
+    : not_implemented<MatrixOrMask>
+{};
+
+template <>
+struct matrix_width<matrix9>
+{
+    static const std::size_t value = 3;
+};
+
+// matrix_handler
+
+template <typename Matrix>
+class matrix_handler
+    : private matrix<matrix_width<Matrix>::value>
+{
+    typedef matrix<matrix_width<Matrix>::value> base_t;
+
+public:
+    typedef std::string result_type;
+
+    static const bool interrupt = false;
+
+    matrix_handler(Matrix const&)
+    {}
+
+    result_type result() const
+    {
+        return std::string(this->data(),
+                           this->data() + base_t::size);
+    }
+
+    template <field F1, field F2, char D>
+    inline bool may_update() const
+    {
+        BOOST_STATIC_ASSERT('0' <= D && D <= '9');
+
+        char const c = static_cast<base_t const&>(*this).template get<F1, F2>();
+        return D > c || c > '9';
+    }
+
+    //template <field F1, field F2>
+    //inline char get() const
+    //{
+    //    return static_cast<base_t const&>(*this).template get<F1, F2>();
+    //}
+
+    template <field F1, field F2, char V>
+    inline void set()
+    {
+        static_cast<base_t&>(*this).template set<F1, F2, V>();
+    }
+
+    template <field F1, field F2, char D>
+    inline void update()
+    {
+        static_cast<base_t&>(*this).template update<F1, F2, D>();
+    }
+};
+
+// RUN-TIME MASKS
+
+// mask9
+
+class mask9
+{
+public:
+    static const std::size_t width = 3; // TEMP
+
+    inline mask9(std::string const& de9im_mask)
+    {
+        // TODO: throw an exception here?
+        BOOST_ASSERT(de9im_mask.size() == 9);
+        ::memcpy(m_mask, de9im_mask.c_str(), 9);
+    }
+
+    template <field F1, field F2>
+    inline char get() const
+    {
+        return m_mask[F1 * 3 + F2];
+    }
+
+private:
+    char m_mask[9];
+};
+
+// interrupt()
+
+template <typename Mask, bool InterruptEnabled>
+struct interrupt_dispatch
+{
+    template <field F1, field F2, char V>
+    static inline bool apply(Mask const&)
+    {
+        return false;
+    }
+};
+
+template <typename Mask>
+struct interrupt_dispatch<Mask, true>
+{
+    template <field F1, field F2, char V>
+    static inline bool apply(Mask const& mask)
+    {
+        char m = mask.template get<F1, F2>();
+        return check_element<V>(m);
+    }
+
+    template <char V>
+    static inline bool check_element(char m)
+    {
+        if ( BOOST_GEOMETRY_CONDITION(V >= '0' && V <= '9') )
+        {
+            return m == 'F' || ( m < V && m >= '0' && m <= '9' );
+        }
+        else if ( BOOST_GEOMETRY_CONDITION(V == 'T') )
+        {
+            return m == 'F';
+        }
+        return false;
+    }
+};
+
+template <typename Masks, int I = 0, int N = boost::tuples::length<Masks>::value>
+struct interrupt_dispatch_tuple
+{
+    template <field F1, field F2, char V>
+    static inline bool apply(Masks const& masks)
+    {
+        typedef typename boost::tuples::element<I, Masks>::type mask_type;
+        mask_type const& mask = boost::get<I>(masks);
+        return interrupt_dispatch<mask_type, true>::template apply<F1, F2, V>(mask)
+            && interrupt_dispatch_tuple<Masks, I+1>::template apply<F1, F2, V>(masks);
+    }
+};
+
+template <typename Masks, int N>
+struct interrupt_dispatch_tuple<Masks, N, N>
+{
+    template <field F1, field F2, char V>
+    static inline bool apply(Masks const& )
+    {
+        return true;
+    }
+};
+
+template <typename T0, typename T1, typename T2, typename T3, typename T4,
+          typename T5, typename T6, typename T7, typename T8, typename T9>
+struct interrupt_dispatch<boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>, true>
+{
+    typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> mask_type;
+
+    template <field F1, field F2, char V>
+    static inline bool apply(mask_type const& mask)
+    {
+        return interrupt_dispatch_tuple<mask_type>::template apply<F1, F2, V>(mask);
+    }
+};
+
+template <typename Head, typename Tail>
+struct interrupt_dispatch<boost::tuples::cons<Head, Tail>, true>
+{
+    typedef boost::tuples::cons<Head, Tail> mask_type;
+
+    template <field F1, field F2, char V>
+    static inline bool apply(mask_type const& mask)
+    {
+        return interrupt_dispatch_tuple<mask_type>::template apply<F1, F2, V>(mask);
+    }
+};
+
+template <field F1, field F2, char V, bool InterruptEnabled, typename Mask>
+inline bool interrupt(Mask const& mask)
+{
+    return interrupt_dispatch<Mask, InterruptEnabled>
+                ::template apply<F1, F2, V>(mask);
+}
+
+// may_update()
+
+template <typename Mask>
+struct may_update_dispatch
+{
+    template <field F1, field F2, char D, typename Matrix>
+    static inline bool apply(Mask const& mask, Matrix const& matrix)
+    {
+        BOOST_STATIC_ASSERT('0' <= D && D <= '9');
+
+        char const m = mask.template get<F1, F2>();
+        
+        if ( m == 'F' )
+        {
+            return true;
+        }
+        else if ( m == 'T' )
+        {
+            char const c = matrix.template get<F1, F2>();
+            return c == 'F'; // if it's T or between 0 and 9, the result will be the same
+        }
+        else if ( m >= '0' && m <= '9' )
+        {
+            char const c = matrix.template get<F1, F2>();
+            return D > c || c > '9';
+        }
+
+        return false;
+    }
+};
+
+template <typename Masks, int I = 0, int N = boost::tuples::length<Masks>::value>
+struct may_update_dispatch_tuple
+{
+    template <field F1, field F2, char D, typename Matrix>
+    static inline bool apply(Masks const& masks, Matrix const& matrix)
+    {
+        typedef typename boost::tuples::element<I, Masks>::type mask_type;
+        mask_type const& mask = boost::get<I>(masks);
+        return may_update_dispatch<mask_type>::template apply<F1, F2, D>(mask, matrix)
+            || may_update_dispatch_tuple<Masks, I+1>::template apply<F1, F2, D>(masks, matrix);
+    }
+};
+
+template <typename Masks, int N>
+struct may_update_dispatch_tuple<Masks, N, N>
+{
+    template <field F1, field F2, char D, typename Matrix>
+    static inline bool apply(Masks const& , Matrix const& )
+    {
+        return false;
+    }
+};
+
+template <typename T0, typename T1, typename T2, typename T3, typename T4,
+          typename T5, typename T6, typename T7, typename T8, typename T9>
+struct may_update_dispatch< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
+{
+    typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> mask_type;
+
+    template <field F1, field F2, char D, typename Matrix>
+    static inline bool apply(mask_type const& mask, Matrix const& matrix)
+    {
+        return may_update_dispatch_tuple<mask_type>::template apply<F1, F2, D>(mask, matrix);
+    }
+};
+
+template <typename Head, typename Tail>
+struct may_update_dispatch< boost::tuples::cons<Head, Tail> >
+{
+    typedef boost::tuples::cons<Head, Tail> mask_type;
+
+    template <field F1, field F2, char D, typename Matrix>
+    static inline bool apply(mask_type const& mask, Matrix const& matrix)
+    {
+        return may_update_dispatch_tuple<mask_type>::template apply<F1, F2, D>(mask, matrix);
+    }
+};
+
+template <field F1, field F2, char D, typename Mask, typename Matrix>
+inline bool may_update(Mask const& mask, Matrix const& matrix)
+{
+    return may_update_dispatch<Mask>
+                ::template apply<F1, F2, D>(mask, matrix);
+}
+
+// check_matrix()
+
+template <typename Mask>
+struct check_dispatch
+{
+    template <typename Matrix>
+    static inline bool apply(Mask const& mask, Matrix const& matrix)
+    {
+        return per_one<interior, interior>(mask, matrix)
+            && per_one<interior, boundary>(mask, matrix)
+            && per_one<interior, exterior>(mask, matrix)
+            && per_one<boundary, interior>(mask, matrix)
+            && per_one<boundary, boundary>(mask, matrix)
+            && per_one<boundary, exterior>(mask, matrix)
+            && per_one<exterior, interior>(mask, matrix)
+            && per_one<exterior, boundary>(mask, matrix)
+            && per_one<exterior, exterior>(mask, matrix);
+    }
+
+    template <field F1, field F2, typename Matrix>
+    static inline bool per_one(Mask const& mask, Matrix const& matrix)
+    {
+        const char mask_el = mask.template get<F1, F2>();
+        const char el = matrix.template get<F1, F2>();
+
+        if ( mask_el == 'F' )
+        {
+            return el == 'F';
+        }
+        else if ( mask_el == 'T' )
+        {
+            return el == 'T' || ( el >= '0' && el <= '9' );
+        }
+        else if ( mask_el >= '0' && mask_el <= '9' )
+        {
+            return el == mask_el;
+        }
+
+        return true;
+    }
+};
+
+template <typename Masks, int I = 0, int N = boost::tuples::length<Masks>::value>
+struct check_dispatch_tuple
+{
+    template <typename Matrix>
+    static inline bool apply(Masks const& masks, Matrix const& matrix)
+    {
+        typedef typename boost::tuples::element<I, Masks>::type mask_type;
+        mask_type const& mask = boost::get<I>(masks);
+        return check_dispatch<mask_type>::apply(mask, matrix)
+            || check_dispatch_tuple<Masks, I+1>::apply(masks, matrix);
+    }
+};
+
+template <typename Masks, int N>
+struct check_dispatch_tuple<Masks, N, N>
+{
+    template <typename Matrix>
+    static inline bool apply(Masks const&, Matrix const&)
+    {
+        return false;
+    }
+};
+
+template <typename T0, typename T1, typename T2, typename T3, typename T4,
+          typename T5, typename T6, typename T7, typename T8, typename T9>
+struct check_dispatch< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
+{
+    typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> mask_type;
+
+    template <typename Matrix>
+    static inline bool apply(mask_type const& mask, Matrix const& matrix)
+    {
+        return check_dispatch_tuple<mask_type>::apply(mask, matrix);
+    }
+};
+
+template <typename Head, typename Tail>
+struct check_dispatch< boost::tuples::cons<Head, Tail> >
+{
+    typedef boost::tuples::cons<Head, Tail> mask_type;
+
+    template <typename Matrix>
+    static inline bool apply(mask_type const& mask, Matrix const& matrix)
+    {
+        return check_dispatch_tuple<mask_type>::apply(mask, matrix);
+    }
+};
+
+template <typename Mask, typename Matrix>
+inline bool check_matrix(Mask const& mask, Matrix const& matrix)
+{
+    return check_dispatch<Mask>::apply(mask, matrix);
+}
+
+// matrix_width
+
+template <>
+struct matrix_width<mask9>
+{
+    static const std::size_t value = 3;
+};
+
+template <typename Tuple,
+          int I = 0,
+          int N = boost::tuples::length<Tuple>::value>
+struct matrix_width_tuple
+{
+    static const std::size_t
+        current = matrix_width<typename boost::tuples::element<I, Tuple>::type>::value;
+    static const std::size_t
+        next = matrix_width_tuple<Tuple, I+1>::value;
+
+    static const std::size_t
+        value = current > next ? current : next;
+};
+
+template <typename Tuple, int N>
+struct matrix_width_tuple<Tuple, N, N>
+{
+    static const std::size_t value = 0;
+};
+
+template <typename Head, typename Tail>
+struct matrix_width< boost::tuples::cons<Head, Tail> >
+{
+    static const std::size_t
+        value = matrix_width_tuple< boost::tuples::cons<Head, Tail> >::value;
+};
+
+// matrix_handler
+
+template <typename Mask, bool Interrupt>
+class mask_handler
+    : private matrix<matrix_width<Mask>::value>
+{
+    typedef matrix<matrix_width<Mask>::value> base_t;
+
+public:
+    typedef bool result_type;
+
+    bool interrupt;
+
+    inline mask_handler(Mask const& m)
+        : interrupt(false)
+        , m_mask(m)
+    {}
+
+    result_type result() const
+    {
+        return !interrupt
+            && check_matrix(m_mask, static_cast<base_t const&>(*this));
+    }
+
+    template <field F1, field F2, char D>
+    inline bool may_update() const
+    {
+        return detail::relate::may_update<F1, F2, D>(
+                    m_mask, static_cast<base_t const&>(*this)
+               );
+    }
+
+    //template <field F1, field F2>
+    //inline char get() const
+    //{
+    //    return static_cast<base_t const&>(*this).template get<F1, F2>();
+    //}
+
+    template <field F1, field F2, char V>
+    inline void set()
+    {
+        if ( relate::interrupt<F1, F2, V, Interrupt>(m_mask) )
+        {
+            interrupt = true;
+        }
+        else
+        {
+            base_t::template set<F1, F2, V>();
+        }
+    }
+
+    template <field F1, field F2, char V>
+    inline void update()
+    {
+        if ( relate::interrupt<F1, F2, V, Interrupt>(m_mask) )
+        {
+            interrupt = true;
+        }
+        else
+        {
+            base_t::template update<F1, F2, V>();
+        }
+    }
+
+private:
+    Mask const& m_mask;
+};
+
+// STATIC MASKS
+
+// static_mask
+
+template <char II, char IB, char IE,
+          char BI, char BB, char BE,
+          char EI, char EB, char EE>
+class static_mask
+{
+    typedef boost::mpl::vector_c
+                <
+                    char, II, IB, IE, BI, BB, BE, EI, EB, EE
+                > vector_type;
+
+public:
+    template <field F1, field F2>
+    struct get
+    {
+        BOOST_STATIC_ASSERT(F1 * 3 + F2 < boost::mpl::size<vector_type>::value);
+
+        static const char value
+            = boost::mpl::at_c<vector_type, F1 * 3 + F2>::type::value;
+    };
+};
+
+// static_should_handle_element
+
+template <typename StaticMask, field F1, field F2, bool IsSequence>
+struct static_should_handle_element_dispatch
+{
+    static const char mask_el = StaticMask::template get<F1, F2>::value;
+    static const bool value = mask_el == 'F'
+                           || mask_el == 'T'
+                           || ( mask_el >= '0' && mask_el <= '9' );
+};
+
+template <typename First, typename Last, field F1, field F2>
+struct static_should_handle_element_sequence
+{
+    typedef typename boost::mpl::deref<First>::type StaticMask;
+
+    static const bool value
+        = static_should_handle_element_dispatch
+            <
+                StaticMask,
+                F1, F2,
+                boost::mpl::is_sequence<StaticMask>::value
+            >::value
+       || static_should_handle_element_sequence
+            <
+                typename boost::mpl::next<First>::type,
+                Last,
+                F1, F2
+            >::value;
+};
+
+template <typename Last, field F1, field F2>
+struct static_should_handle_element_sequence<Last, Last, F1, F2>
+{
+    static const bool value = false;
+};
+
+template <typename StaticMask, field F1, field F2>
+struct static_should_handle_element_dispatch<StaticMask, F1, F2, true>
+{
+    static const bool value
+        = static_should_handle_element_sequence
+            <
+                typename boost::mpl::begin<StaticMask>::type,
+                typename boost::mpl::end<StaticMask>::type,
+                F1, F2
+            >::value;
+};
+
+template <typename StaticMask, field F1, field F2>
+struct static_should_handle_element
+{
+    static const bool value
+        = static_should_handle_element_dispatch
+            <
+                StaticMask,
+                F1, F2,
+                boost::mpl::is_sequence<StaticMask>::value
+            >::value;
+};
+
+// static_interrupt
+
+template <typename StaticMask, char V, field F1, field F2, bool InterruptEnabled, bool IsSequence>
+struct static_interrupt_dispatch
+{
+    static const bool value = false;
+};
+
+template <typename StaticMask, char V, field F1, field F2, bool IsSequence>
+struct static_interrupt_dispatch<StaticMask, V, F1, F2, true, IsSequence>
+{
+    static const char mask_el = StaticMask::template get<F1, F2>::value;
+
+    static const bool value
+        = ( V >= '0' && V <= '9' ) ? 
+          ( mask_el == 'F' || ( mask_el < V && mask_el >= '0' && mask_el <= '9' ) ) :
+          ( ( V == 'T' ) ? mask_el == 'F' : false );
+};
+
+template <typename First, typename Last, char V, field F1, field F2>
+struct static_interrupt_sequence
+{
+    typedef typename boost::mpl::deref<First>::type StaticMask;
+
+    static const bool value
+        = static_interrupt_dispatch
+            <
+                StaticMask,
+                V, F1, F2,
+                true,
+                boost::mpl::is_sequence<StaticMask>::value
+            >::value
+       && static_interrupt_sequence
+            <
+                typename boost::mpl::next<First>::type,
+                Last,
+                V, F1, F2
+            >::value;
+};
+
+template <typename Last, char V, field F1, field F2>
+struct static_interrupt_sequence<Last, Last, V, F1, F2>
+{
+    static const bool value = true;
+};
+
+template <typename StaticMask, char V, field F1, field F2>
+struct static_interrupt_dispatch<StaticMask, V, F1, F2, true, true>
+{
+    static const bool value
+        = static_interrupt_sequence
+            <
+                typename boost::mpl::begin<StaticMask>::type,
+                typename boost::mpl::end<StaticMask>::type,
+                V, F1, F2
+            >::value;
+};
+
+template <typename StaticMask, char V, field F1, field F2, bool EnableInterrupt>
+struct static_interrupt
+{
+    static const bool value
+        = static_interrupt_dispatch
+            <
+                StaticMask,
+                V, F1, F2,
+                EnableInterrupt,
+                boost::mpl::is_sequence<StaticMask>::value
+            >::value;
+};
+
+// static_may_update
+
+template <typename StaticMask, char D, field F1, field F2, bool IsSequence>
+struct static_may_update_dispatch
+{
+    static const char mask_el = StaticMask::template get<F1, F2>::value;
+    static const int version
+                        = mask_el == 'F' ? 0
+                        : mask_el == 'T' ? 1
+                        : mask_el >= '0' && mask_el <= '9' ? 2
+                        : 3;
+
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return apply_dispatch(matrix, integral_constant<int, version>());
+    }
+
+    // mask_el == 'F'
+    template <typename Matrix>
+    static inline bool apply_dispatch(Matrix const& , integral_constant<int, 0>)
+    {
+        return true;
+    }
+    // mask_el == 'T'
+    template <typename Matrix>
+    static inline bool apply_dispatch(Matrix const& matrix, integral_constant<int, 1>)
+    {
+        char const c = matrix.template get<F1, F2>();
+        return c == 'F'; // if it's T or between 0 and 9, the result will be the same
+    }
+    // mask_el >= '0' && mask_el <= '9'
+    template <typename Matrix>
+    static inline bool apply_dispatch(Matrix const& matrix, integral_constant<int, 2>)
+    {
+        char const c = matrix.template get<F1, F2>();
+        return D > c || c > '9';
+    }
+    // else
+    template <typename Matrix>
+    static inline bool apply_dispatch(Matrix const&, integral_constant<int, 3>)
+    {
+        return false;
+    }
+};
+
+template <typename First, typename Last, char D, field F1, field F2>
+struct static_may_update_sequence
+{
+    typedef typename boost::mpl::deref<First>::type StaticMask;
+
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_may_update_dispatch
+                <
+                    StaticMask,
+                    D, F1, F2,
+                    boost::mpl::is_sequence<StaticMask>::value
+                >::apply(matrix)
+            || static_may_update_sequence
+                <
+                    typename boost::mpl::next<First>::type,
+                    Last,
+                    D, F1, F2
+                >::apply(matrix);
+    }
+};
+
+template <typename Last, char D, field F1, field F2>
+struct static_may_update_sequence<Last, Last, D, F1, F2>
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& /*matrix*/)
+    {
+        return false;
+    }
+};
+
+template <typename StaticMask, char D, field F1, field F2>
+struct static_may_update_dispatch<StaticMask, D, F1, F2, true>
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_may_update_sequence
+                <
+                    typename boost::mpl::begin<StaticMask>::type,
+                    typename boost::mpl::end<StaticMask>::type,
+                    D, F1, F2
+                >::apply(matrix);
+    }
+};
+
+template <typename StaticMask, char D, field F1, field F2>
+struct static_may_update
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_may_update_dispatch
+                <
+                    StaticMask,
+                    D, F1, F2,
+                    boost::mpl::is_sequence<StaticMask>::value
+                >::apply(matrix);
+    }
+};
+
+// static_check
+
+template <typename StaticMask, bool IsSequence>
+struct static_check_dispatch
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return per_one<interior, interior>::apply(matrix)
+            && per_one<interior, boundary>::apply(matrix)
+            && per_one<interior, exterior>::apply(matrix)
+            && per_one<boundary, interior>::apply(matrix)
+            && per_one<boundary, boundary>::apply(matrix)
+            && per_one<boundary, exterior>::apply(matrix)
+            && per_one<exterior, interior>::apply(matrix)
+            && per_one<exterior, boundary>::apply(matrix)
+            && per_one<exterior, exterior>::apply(matrix);
+    }
+    
+    template <field F1, field F2>
+    struct per_one
+    {
+        static const char mask_el = StaticMask::template get<F1, F2>::value;
+        static const int version
+                            = mask_el == 'F' ? 0
+                            : mask_el == 'T' ? 1
+                            : mask_el >= '0' && mask_el <= '9' ? 2
+                            : 3;
+
+        template <typename Matrix>
+        static inline bool apply(Matrix const& matrix)
+        {
+            const char el = matrix.template get<F1, F2>();
+            return apply_dispatch(el, integral_constant<int, version>());
+        }
+
+        // mask_el == 'F'
+        static inline bool apply_dispatch(char el, integral_constant<int, 0>)
+        {
+            return el == 'F';
+        }
+        // mask_el == 'T'
+        static inline bool apply_dispatch(char el, integral_constant<int, 1>)
+        {
+            return el == 'T' || ( el >= '0' && el <= '9' );
+        }
+        // mask_el >= '0' && mask_el <= '9'
+        static inline bool apply_dispatch(char el, integral_constant<int, 2>)
+        {
+            return el == mask_el;
+        }
+        // else
+        static inline bool apply_dispatch(char /*el*/, integral_constant<int, 3>)
+        {
+            return true;
+        }
+    };
+};
+
+template <typename First, typename Last>
+struct static_check_sequence
+{
+    typedef typename boost::mpl::deref<First>::type StaticMask;
+
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_check_dispatch
+                <
+                    StaticMask,
+                    boost::mpl::is_sequence<StaticMask>::value
+                >::apply(matrix)
+            || static_check_sequence
+                <
+                    typename boost::mpl::next<First>::type,
+                    Last
+                >::apply(matrix);
+    }
+};
+
+template <typename Last>
+struct static_check_sequence<Last, Last>
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& /*matrix*/)
+    {
+        return false;
+    }
+};
+
+template <typename StaticMask>
+struct static_check_dispatch<StaticMask, true>
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_check_sequence
+                <
+                    typename boost::mpl::begin<StaticMask>::type,
+                    typename boost::mpl::end<StaticMask>::type
+                >::apply(matrix);
+    }
+};
+
+template <typename StaticMask>
+struct static_check_matrix
+{
+    template <typename Matrix>
+    static inline bool apply(Matrix const& matrix)
+    {
+        return static_check_dispatch
+                <
+                    StaticMask,
+                    boost::mpl::is_sequence<StaticMask>::value
+                >::apply(matrix);
+    }
+};
+
+// static_mask_handler
+
+template <typename StaticMask, bool Interrupt>
+class static_mask_handler
+    : private matrix<3>
+{
+    typedef matrix<3> base_t;
+
+public:
+    typedef bool result_type;
+
+    bool interrupt;
+
+    inline static_mask_handler(StaticMask const& /*dummy*/)
+        : interrupt(false)
+    {}
+
+    result_type result() const
+    {
+        return (!Interrupt || !interrupt)
+            && static_check_matrix<StaticMask>::
+                    apply(static_cast<base_t const&>(*this));
+    }
+
+    template <field F1, field F2, char D>
+    inline bool may_update() const
+    {
+        return static_may_update<StaticMask, D, F1, F2>::
+                    apply(static_cast<base_t const&>(*this));
+    }
+
+    template <field F1, field F2>
+    static inline bool expects()
+    {
+        return static_should_handle_element<StaticMask, F1, F2>::value;
+    }
+
+    //template <field F1, field F2>
+    //inline char get() const
+    //{
+    //    return base_t::template get<F1, F2>();
+    //}
+
+    template <field F1, field F2, char V>
+    inline void set()
+    {
+        static const bool interrupt_c = static_interrupt<StaticMask, V, F1, F2, Interrupt>::value;
+        static const bool should_handle = static_should_handle_element<StaticMask, F1, F2>::value;
+        static const int version = interrupt_c ? 0
+                                 : should_handle ? 1
+                                 : 2;
+
+        set_dispatch<F1, F2, V>(integral_constant<int, version>());
+    }
+
+    template <field F1, field F2, char V>
+    inline void update()
+    {
+        static const bool interrupt_c = static_interrupt<StaticMask, V, F1, F2, Interrupt>::value;
+        static const bool should_handle = static_should_handle_element<StaticMask, F1, F2>::value;
+        static const int version = interrupt_c ? 0
+                                 : should_handle ? 1
+                                 : 2;
+
+        update_dispatch<F1, F2, V>(integral_constant<int, version>());
+    }
+
+private:
+    // Interrupt && interrupt
+    template <field F1, field F2, char V>
+    inline void set_dispatch(integral_constant<int, 0>)
+    {
+        interrupt = true;
+    }
+    // else should_handle
+    template <field F1, field F2, char V>
+    inline void set_dispatch(integral_constant<int, 1>)
+    {
+        base_t::template set<F1, F2, V>();
+    }
+    // else
+    template <field F1, field F2, char V>
+    inline void set_dispatch(integral_constant<int, 2>)
+    {}
+
+    // Interrupt && interrupt
+    template <field F1, field F2, char V>
+    inline void update_dispatch(integral_constant<int, 0>)
+    {
+        interrupt = true;
+    }
+    // else should_handle
+    template <field F1, field F2, char V>
+    inline void update_dispatch(integral_constant<int, 1>)
+    {
+        base_t::template update<F1, F2, V>();
+    }
+    // else
+    template <field F1, field F2, char V>
+    inline void update_dispatch(integral_constant<int, 2>)
+    {}
+};
+
+// OPERATORS
+
+template <typename Mask1, typename Mask2> inline
+boost::tuples::cons<
+    Mask1,
+    boost::tuples::cons<Mask2, boost::tuples::null_type>
+>
+operator||(Mask1 const& m1, Mask2 const& m2)
+{
+    namespace bt = boost::tuples;
+
+    return
+    bt::cons< Mask1, bt::cons<Mask2, bt::null_type> >
+        ( m1, bt::cons<Mask2, bt::null_type>(m2, bt::null_type()) );
+}
+
+template <typename Head, typename Tail, typename Mask> inline
+typename index::detail::tuples::push_back<
+    boost::tuples::cons<Head, Tail>, Mask
+>::type
+operator||(boost::tuples::cons<Head, Tail> const& t, Mask const& m)
+{
+    namespace bt = boost::tuples;
+
+    return
+    index::detail::tuples::push_back<
+        bt::cons<Head, Tail>, Mask
+    >::apply(t, m);
+}
+
+// PREDEFINED MASKS
+
+// TODO:
+// 1. specialize for simplified masks if available
+// e.g. for TOUCHES use 1 mask for A/A
+// 2. Think about dimensions > 2 e.g. should TOUCHES be true
+// if the interior of the Areal overlaps the boundary of the Volumetric
+// like it's true for Linear/Areal
+
+// EQUALS
+template <typename Geometry1, typename Geometry2>
+struct static_mask_equals_type
+{
+    typedef static_mask<'T', '*', 'F', '*', '*', 'F', 'F', 'F', '*'> type; // wikipedia
+    //typedef static_mask<'T', 'F', 'F', 'F', 'T', 'F', 'F', 'F', 'T'> type; // OGC
+};
+
+// DISJOINT
+typedef static_mask<'F', 'F', '*', 'F', 'F', '*', '*', '*', '*'> static_mask_disjoint;
+
+// TOUCHES - NOT P/P
+template <typename Geometry1,
+          typename Geometry2,
+          std::size_t Dim1 = topological_dimension<Geometry1>::value,
+          std::size_t Dim2 = topological_dimension<Geometry2>::value>
+struct static_mask_touches_impl
+{
+    typedef boost::mpl::vector<
+                static_mask<'F', 'T', '*', '*', '*', '*', '*', '*', '*'>,
+                static_mask<'F', '*', '*', 'T', '*', '*', '*', '*', '*'>,
+                static_mask<'F', '*', '*', '*', 'T', '*', '*', '*', '*'>
+        > type;
+};
+// According to OGC, doesn't apply to P/P
+// Using the above mask the result would be always false
+template <typename Geometry1, typename Geometry2>
+struct static_mask_touches_impl<Geometry1, Geometry2, 0, 0>
+    : not_implemented<typename geometry::tag<Geometry1>::type,
+                      typename geometry::tag<Geometry2>::type>
+{};
+
+template <typename Geometry1, typename Geometry2>
+struct static_mask_touches_type
+    : static_mask_touches_impl<Geometry1, Geometry2>
+{};
+
+// WITHIN
+typedef static_mask<'T', '*', 'F', '*', '*', 'F', '*', '*', '*'> static_mask_within;
+
+// COVERED_BY (non OGC)
+typedef boost::mpl::vector<
+            static_mask<'T', '*', 'F', '*', '*', 'F', '*', '*', '*'>,
+            static_mask<'*', 'T', 'F', '*', '*', 'F', '*', '*', '*'>,
+            static_mask<'*', '*', 'F', 'T', '*', 'F', '*', '*', '*'>,
+            static_mask<'*', '*', 'F', '*', 'T', 'F', '*', '*', '*'>
+        > static_mask_covered_by;
+
+// CROSSES
+// dim(G1) < dim(G2) - P/L P/A L/A
+template <typename Geometry1,
+          typename Geometry2,
+          std::size_t Dim1 = topological_dimension<Geometry1>::value,
+          std::size_t Dim2 = topological_dimension<Geometry2>::value,
+          bool D1LessD2 = (Dim1 < Dim2)
+>
+struct static_mask_crosses_impl
+{
+    typedef static_mask<'T', '*', 'T', '*', '*', '*', '*', '*', '*'> type;
+};
+// TODO: I'm not sure if this one below should be available!
+// dim(G1) > dim(G2) - L/P A/P A/L
+template <typename Geometry1, typename Geometry2,
+          std::size_t Dim1, std::size_t Dim2
+>
+struct static_mask_crosses_impl<Geometry1, Geometry2, Dim1, Dim2, false>
+{
+    typedef static_mask<'T', '*', '*', '*', '*', '*', 'T', '*', '*'> type;
+};
+// dim(G1) == dim(G2) - P/P A/A
+template <typename Geometry1, typename Geometry2,
+          std::size_t Dim
+>
+struct static_mask_crosses_impl<Geometry1, Geometry2, Dim, Dim, false>
+    : not_implemented<typename geometry::tag<Geometry1>::type,
+                      typename geometry::tag<Geometry2>::type>
+{};
+// dim(G1) == 1 && dim(G2) == 1 - L/L
+template <typename Geometry1, typename Geometry2>
+struct static_mask_crosses_impl<Geometry1, Geometry2, 1, 1, false>
+{
+    typedef static_mask<'0', '*', '*', '*', '*', '*', '*', '*', '*'> type;
+};
+
+template <typename Geometry1, typename Geometry2>
+struct static_mask_crosses_type
+    : static_mask_crosses_impl<Geometry1, Geometry2>
+{};
+
+// OVERLAPS
+
+// dim(G1) != dim(G2) - NOT P/P, L/L, A/A
+template <typename Geometry1,
+          typename Geometry2,
+          std::size_t Dim1 = topological_dimension<Geometry1>::value,
+          std::size_t Dim2 = topological_dimension<Geometry2>::value
+>
+struct static_mask_overlaps_impl
+    : not_implemented<typename geometry::tag<Geometry1>::type,
+                      typename geometry::tag<Geometry2>::type>
+{};
+// dim(G1) == D && dim(G2) == D - P/P A/A
+template <typename Geometry1, typename Geometry2, std::size_t Dim>
+struct static_mask_overlaps_impl<Geometry1, Geometry2, Dim, Dim>
+{
+    typedef static_mask<'T', '*', 'T', '*', '*', '*', 'T', '*', '*'> type;
+};
+// dim(G1) == 1 && dim(G2) == 1 - L/L
+template <typename Geometry1, typename Geometry2>
+struct static_mask_overlaps_impl<Geometry1, Geometry2, 1, 1>
+{
+    typedef static_mask<'1', '*', 'T', '*', '*', '*', 'T', '*', '*'> type;
+};
+
+template <typename Geometry1, typename Geometry2>
+struct static_mask_overlaps_type
+    : static_mask_overlaps_impl<Geometry1, Geometry2>
+{};
+
+// RESULTS/HANDLERS UTILS
+
+template <field F1, field F2, char V, typename Result>
+inline void set(Result & res)
+{
+    res.template set<F1, F2, V>();
+}
+
+template <field F1, field F2, char V, bool Transpose>
+struct set_dispatch
+{
+    template <typename Result>
+    static inline void apply(Result & res)
+    {
+        res.template set<F1, F2, V>();
+    }
+};
+
+template <field F1, field F2, char V>
+struct set_dispatch<F1, F2, V, true>
+{
+    template <typename Result>
+    static inline void apply(Result & res)
+    {
+        res.template set<F2, F1, V>();
+    }
+};
+
+template <field F1, field F2, char V, bool Transpose, typename Result>
+inline void set(Result & res)
+{
+    set_dispatch<F1, F2, V, Transpose>::apply(res);
+}
+
+template <char V, typename Result>
+inline void set(Result & res)
+{
+    res.template set<interior, interior, V>();
+    res.template set<interior, boundary, V>();
+    res.template set<interior, exterior, V>();
+    res.template set<boundary, interior, V>();
+    res.template set<boundary, boundary, V>();
+    res.template set<boundary, exterior, V>();
+    res.template set<exterior, interior, V>();
+    res.template set<exterior, boundary, V>();
+    res.template set<exterior, exterior, V>();
+}
+
+template <char II, char IB, char IE, char BI, char BB, char BE, char EI, char EB, char EE, typename Result>
+inline void set(Result & res)
+{
+    res.template set<interior, interior, II>();
+    res.template set<interior, boundary, IB>();
+    res.template set<interior, exterior, IE>();
+    res.template set<boundary, interior, BI>();
+    res.template set<boundary, boundary, BB>();
+    res.template set<boundary, exterior, BE>();
+    res.template set<exterior, interior, EI>();
+    res.template set<exterior, boundary, EB>();
+    res.template set<exterior, exterior, EE>();
+}
+
+template <field F1, field F2, char D, typename Result>
+inline void update(Result & res)
+{
+    res.template update<F1, F2, D>();
+}
+
+template <field F1, field F2, char D, bool Transpose>
+struct update_result_dispatch
+{
+    template <typename Result>
+    static inline void apply(Result & res)
+    {
+        update<F1, F2, D>(res);
+    }
+};
+
+template <field F1, field F2, char D>
+struct update_result_dispatch<F1, F2, D, true>
+{
+    template <typename Result>
+    static inline void apply(Result & res)
+    {
+        update<F2, F1, D>(res);
+    }
+};
+
+template <field F1, field F2, char D, bool Transpose, typename Result>
+inline void update(Result & res)
+{
+    update_result_dispatch<F1, F2, D, Transpose>::apply(res);
+}
+
+template <field F1, field F2, char D, typename Result>
+inline bool may_update(Result const& res)
+{
+    return res.template may_update<F1, F2, D>();
+}
+
+template <field F1, field F2, char D, bool Transpose>
+struct may_update_result_dispatch
+{
+    template <typename Result>
+    static inline bool apply(Result const& res)
+    {
+        return may_update<F1, F2, D>(res);
+    }
+};
+
+template <field F1, field F2, char D>
+struct may_update_result_dispatch<F1, F2, D, true>
+{
+    template <typename Result>
+    static inline bool apply(Result const& res)
+    {
+        return may_update<F2, F1, D>(res);
+    }
+};
+
+template <field F1, field F2, char D, bool Transpose, typename Result>
+inline bool may_update(Result const& res)
+{
+    return may_update_result_dispatch<F1, F2, D, Transpose>::apply(res);
+}
+
+template <typename Result, char II, char IB, char IE, char BI, char BB, char BE, char EI, char EB, char EE>
+inline Result return_result()
+{
+    Result res;
+    set<II, IB, IE, BI, BB, BE, EI, EB, EE>(res);
+    return res;
+}
+
+template <typename Geometry>
+struct result_dimension
+{
+    BOOST_STATIC_ASSERT(geometry::dimension<Geometry>::value >= 0);
+    static const char value
+        = ( geometry::dimension<Geometry>::value <= 9 ) ?
+            ( '0' + geometry::dimension<Geometry>::value ) :
+              'T';
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_RESULT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/topology_check.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,241 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TOPOLOGY_CHECK_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TOPOLOGY_CHECK_HPP
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+#include <boost/geometry/policies/compare.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate {
+
+// TODO: change the name for e.g. something with the word "exterior"
+
+template <typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type>
+struct topology_check
+    : not_implemented<Tag>
+{};
+
+//template <typename Point>
+//struct topology_check<Point, point_tag>
+//{
+//    static const char interior = '0';
+//    static const char boundary = 'F';
+//
+//    static const bool has_interior = true;
+//    static const bool has_boundary = false;
+//
+//    topology_check(Point const&) {}
+//    template <typename IgnoreBoundaryPoint>
+//    topology_check(Point const&, IgnoreBoundaryPoint const&) {}
+//};
+
+template <typename Linestring>
+struct topology_check<Linestring, linestring_tag>
+{
+    static const char interior = '1';
+    static const char boundary = '0';
+
+    bool has_interior;
+    bool has_boundary;
+
+    topology_check(Linestring const& ls)
+    {
+        init(ls, 0); /*dummy param*/
+    }
+
+    template <typename IgnoreBoundaryPoint>
+    topology_check(Linestring const& ls, IgnoreBoundaryPoint const& ibp)
+    {
+        init(ls, ibp); /*dummy param, won't be used*/
+    }
+
+    // Even if some point is on the boundary, if the Linestring has the boundary,
+    // there will be second boundary point different than IgnoreBoundaryPoint
+    template <typename IgnoreBoundaryPoint>
+    void init(Linestring const& ls, IgnoreBoundaryPoint const&)
+    {
+        std::size_t count = boost::size(ls);
+        has_interior = count > 0;
+        // NOTE: Linestring with all points equal is treated as 1d linear ring
+        has_boundary = count > 1
+                    && ! detail::equals::equals_point_point(range::front(ls), range::back(ls));
+    }
+};
+
+template <typename MultiLinestring>
+struct topology_check<MultiLinestring, multi_linestring_tag>
+{
+    static const char interior = '1';
+    static const char boundary = '0';
+
+    bool has_interior;
+    bool has_boundary;
+
+    topology_check(MultiLinestring const& mls)
+    {
+        init(mls, not_ignoring_counter());
+    }
+
+    template <typename IgnoreBoundaryPoint>
+    topology_check(MultiLinestring const& mls, IgnoreBoundaryPoint const& ibp)
+    {
+        init(mls, ignoring_counter<IgnoreBoundaryPoint>(ibp));
+    }
+
+    template <typename OddCounter>
+    void init(MultiLinestring const& mls, OddCounter const& odd_counter)
+    {
+        typedef typename geometry::point_type<MultiLinestring>::type point_type;
+        std::vector<point_type> endpoints;
+        endpoints.reserve(boost::size(mls) * 2);
+
+        typedef typename boost::range_iterator<MultiLinestring const>::type ls_iterator;
+        for ( ls_iterator it = boost::begin(mls) ; it != boost::end(mls) ; ++it )
+        {
+            std::size_t count = boost::size(*it);
+
+            if ( count > 0 )
+            {
+                has_interior = true;
+            }
+
+            if ( count > 1 )
+            {
+                // don't store boundaries of linear rings, this doesn't change anything
+                if ( ! equals::equals_point_point(range::front(*it), range::back(*it)) )
+                {
+                    endpoints.push_back(range::front(*it));
+                    endpoints.push_back(range::back(*it));
+                }
+            }
+        }
+
+        has_boundary = false;
+
+        if ( !endpoints.empty() )
+        {
+            std::sort(endpoints.begin(), endpoints.end(), geometry::less<point_type>());
+            has_boundary = odd_counter(endpoints.begin(), endpoints.end());
+        }
+    }
+
+    struct not_ignoring_counter
+    {
+        template <typename It>
+        bool operator()(It first, It last) const
+        {
+            return find_odd_count(first, last);
+        }
+    };
+
+    template <typename Point>
+    struct ignoring_counter
+    {
+        ignoring_counter(Point const& pt) : m_pt(pt) {}
+
+        template <typename It>
+        bool operator()(It first, It last) const
+        {
+            typedef typename std::iterator_traits<It>::value_type point_type;
+
+            std::pair<It, It> ignore_range
+                              = std::equal_range(first, last, m_pt,
+                                                 geometry::less<point_type>());
+
+            if ( find_odd_count(first, ignore_range.first) )
+                return true;
+
+            return find_odd_count(ignore_range.second, last);
+        }
+
+        Point const& m_pt;
+    };
+
+    template <typename It>
+    static inline bool find_odd_count(It first, It last)
+    {
+        if ( first == last )
+            return false;
+
+        std::size_t count = 1;
+        It prev = first;
+        ++first;
+        for ( ; first != last ; ++first, ++prev )
+        {
+            // the end of the equal points subrange
+            if ( ! equals::equals_point_point(*first, *prev) )
+            {
+                if ( count % 2 != 0 )
+                    return true;
+
+                count = 1;
+            }
+            else
+            {
+                ++count;
+            }
+        }
+
+        return count % 2 != 0;
+    }
+};
+
+template <typename Ring>
+struct topology_check<Ring, ring_tag>
+{
+    static const char interior = '2';
+    static const char boundary = '1';
+    static const bool has_interior = true;
+    static const bool has_boundary = true;
+
+    topology_check(Ring const&) {}
+    template <typename P>
+    topology_check(Ring const&, P const&) {}
+};
+
+template <typename Polygon>
+struct topology_check<Polygon, polygon_tag>
+{
+    static const char interior = '2';
+    static const char boundary = '1';
+    static const bool has_interior = true;
+    static const bool has_boundary = true;
+
+    topology_check(Polygon const&) {}
+    template <typename P>
+    topology_check(Polygon const&, P const&) {}
+};
+
+template <typename MultiPolygon>
+struct topology_check<MultiPolygon, multi_polygon_tag>
+{
+    static const char interior = '2';
+    static const char boundary = '1';
+    static const bool has_interior = true;
+    static const bool has_boundary = true;
+
+    topology_check(MultiPolygon const&) {}
+    template <typename P>
+    topology_check(MultiPolygon const&, P const&) {}
+};
+
+}} // namespace detail::relate
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TOPOLOGY_CHECK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/relate/turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,278 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TURNS_HPP
+
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/algorithms/detail/overlay/do_reverse.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
+
+#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+
+#include <boost/type_traits/is_base_of.hpp>
+
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace relate { namespace turns {
+
+template <bool IncludeDegenerate = false>
+struct assign_policy
+    : overlay::assign_null_policy
+{
+    static bool const include_degenerate = IncludeDegenerate;
+};
+
+// GET_TURNS
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename GetTurnPolicy = detail::get_turns::get_turn_info_type
+        <
+            Geometry1, Geometry2, assign_policy<>
+        >,
+    typename RobustPolicy = detail::no_rescale_policy
+>
+struct get_turns
+{
+    typedef typename geometry::point_type<Geometry1>::type point1_type;
+
+    typedef overlay::turn_info
+            <
+                point1_type,
+                typename segment_ratio_type<point1_type, RobustPolicy>::type,
+                typename detail::get_turns::turn_operation_type
+                    <
+                        Geometry1, Geometry2,
+                        typename segment_ratio_type
+                            <
+                                point1_type, RobustPolicy
+                            >::type
+                    >::type
+            > turn_info;
+
+    template <typename Turns>
+    static inline void apply(Turns & turns,
+                             Geometry1 const& geometry1,
+                             Geometry2 const& geometry2)
+    {
+        detail::get_turns::no_interrupt_policy interrupt_policy;
+
+        apply(turns, geometry1, geometry2, interrupt_policy);
+    }
+
+    template <typename Turns, typename InterruptPolicy>
+    static inline void apply(Turns & turns,
+                             Geometry1 const& geometry1,
+                             Geometry2 const& geometry2,
+                             InterruptPolicy & interrupt_policy)
+    {
+        static const bool reverse1 = detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value;
+        static const bool reverse2 = detail::overlay::do_reverse<geometry::point_order<Geometry2>::value>::value;
+
+        RobustPolicy robust_policy = geometry::get_rescale_policy
+            <
+                RobustPolicy
+            >(geometry1, geometry2);
+
+
+        dispatch::get_turns
+            <
+                typename geometry::tag<Geometry1>::type,
+                typename geometry::tag<Geometry2>::type,
+                Geometry1,
+                Geometry2,
+                reverse1,
+                reverse2,
+                GetTurnPolicy
+            >::apply(0, geometry1, 1, geometry2,
+                     robust_policy, turns, interrupt_policy);
+    }
+};
+
+// TURNS SORTING AND SEARCHING
+
+template <int N = 0, int U = 1, int I = 2, int B = 3, int C = 4, int O = 0>
+struct op_to_int
+{
+    template <typename SegmentRatio>
+    inline int operator()(detail::overlay::turn_operation<SegmentRatio> const& op) const
+    {
+        switch(op.operation)
+        {
+        case detail::overlay::operation_none : return N;
+        case detail::overlay::operation_union : return U;
+        case detail::overlay::operation_intersection : return I;
+        case detail::overlay::operation_blocked : return B;
+        case detail::overlay::operation_continue : return C;
+        case detail::overlay::operation_opposite : return O;
+        }
+        return -1;
+    }
+};
+
+template <std::size_t OpId, typename OpToInt>
+struct less_op_xxx_linear
+{
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        static OpToInt op_to_int;
+        return op_to_int(left.operations[OpId]) < op_to_int(right.operations[OpId]);
+    }
+};
+
+template <std::size_t OpId>
+struct less_op_linear_linear
+    : less_op_xxx_linear< OpId, op_to_int<0,2,3,1,4,0> >
+{};
+
+template <std::size_t OpId>
+struct less_op_linear_areal_single
+{
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        static const std::size_t other_op_id = (OpId + 1) % 2;
+        static turns::op_to_int<0,2,3,1,4,0> op_to_int_xuic;
+        static turns::op_to_int<0,3,2,1,4,0> op_to_int_xiuc;
+
+        segment_identifier const& left_other_seg_id = left.operations[other_op_id].seg_id;
+        segment_identifier const& right_other_seg_id = right.operations[other_op_id].seg_id;
+
+        typedef typename Turn::turn_operation_type operation_type;
+        operation_type const& left_operation = left.operations[OpId];
+        operation_type const& right_operation = right.operations[OpId];
+
+        if ( left_other_seg_id.ring_index == right_other_seg_id.ring_index )
+        {
+            return op_to_int_xuic(left_operation)
+                 < op_to_int_xuic(right_operation);
+        }
+        else
+        {
+            return op_to_int_xiuc(left_operation)
+                 < op_to_int_xiuc(right_operation);
+        }
+    }
+};
+
+template <std::size_t OpId>
+struct less_op_areal_linear
+    : less_op_xxx_linear< OpId, op_to_int<0,1,0,0,2,0> >
+{};
+
+template <std::size_t OpId>
+struct less_op_areal_areal
+{
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        static const std::size_t other_op_id = (OpId + 1) % 2;
+        static op_to_int<0, 1, 2, 3, 4, 0> op_to_int_uixc;
+        static op_to_int<0, 2, 1, 3, 4, 0> op_to_int_iuxc;
+
+        segment_identifier const& left_other_seg_id = left.operations[other_op_id].seg_id;
+        segment_identifier const& right_other_seg_id = right.operations[other_op_id].seg_id;
+
+        typedef typename Turn::turn_operation_type operation_type;
+        operation_type const& left_operation = left.operations[OpId];
+        operation_type const& right_operation = right.operations[OpId];
+
+        if ( left_other_seg_id.multi_index == right_other_seg_id.multi_index )
+        {
+            if ( left_other_seg_id.ring_index == right_other_seg_id.ring_index )
+            {
+                return op_to_int_uixc(left_operation) < op_to_int_uixc(right_operation);
+            }
+            else
+            {
+                if ( left_other_seg_id.ring_index == -1 )
+                {
+                    if ( left_operation.operation == overlay::operation_union )
+                        return false;
+                    else if ( left_operation.operation == overlay::operation_intersection )
+                        return true;
+                }
+                else if ( right_other_seg_id.ring_index == -1 )
+                {
+                    if ( right_operation.operation == overlay::operation_union )
+                        return true;
+                    else if ( right_operation.operation == overlay::operation_intersection )
+                        return false;
+                }
+                
+                return op_to_int_iuxc(left_operation) < op_to_int_iuxc(right_operation);
+            }
+        }
+        else
+        {
+            return op_to_int_uixc(left_operation) < op_to_int_uixc(right_operation);
+        }
+    }
+};
+
+template <std::size_t OpId>
+struct less_other_multi_index
+{
+    static const std::size_t other_op_id = (OpId + 1) % 2;
+
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        return left.operations[other_op_id].seg_id.multi_index
+             < right.operations[other_op_id].seg_id.multi_index;
+    }
+};
+
+// sort turns by G1 - source_index == 0 by:
+// seg_id -> distance -> operation
+template <std::size_t OpId = 0,
+          typename LessOp = less_op_xxx_linear< OpId, op_to_int<> > >
+struct less
+{
+    BOOST_STATIC_ASSERT(OpId < 2);
+
+    template <typename Turn>
+    static inline bool use_fraction(Turn const& left, Turn const& right)
+    {
+        static LessOp less_op;
+
+        return left.operations[OpId].fraction < right.operations[OpId].fraction
+            || ( left.operations[OpId].fraction == right.operations[OpId].fraction
+              && less_op(left, right) );
+    }
+
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        segment_identifier const& sl = left.operations[OpId].seg_id;
+        segment_identifier const& sr = right.operations[OpId].seg_id;
+
+        return sl < sr || ( sl == sr && use_fraction(left, right) );
+    }
+};
+
+}}} // namespace detail::relate::turns
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sections/section_box_policies.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_SECTION_BOX_POLICIES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_SECTION_BOX_POLICIES_HPP
+
+
+#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
+#include <boost/geometry/algorithms/expand.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace section
+{
+
+struct get_section_box
+{
+    template <typename Box, typename Section>
+    static inline void apply(Box& total, Section const& section)
+    {
+        geometry::expand(total, section.bounding_box);
+    }
+};
+
+struct overlaps_section_box
+{
+    template <typename Box, typename Section>
+    static inline bool apply(Box const& box, Section const& section)
+    {
+        return ! detail::disjoint::disjoint_box_box(box, section.bounding_box);
+    }
+};
+
+
+}} // namespace detail::section
+#endif
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_SECTION_BOX_POLICIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sections/section_functions.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_FUNCTIONS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_FUNCTIONS_HPP
+
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/algorithms/detail/recalculate.hpp>
+#include <boost/geometry/policies/robustness/robust_point_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace section
+{
+
+template
+<
+    std::size_t Dimension,
+    typename Point,
+    typename RobustBox,
+    typename RobustPolicy
+>
+static inline bool preceding(int dir, Point const& point,
+            RobustBox const& robust_box,
+            RobustPolicy const& robust_policy)
+{
+    typename geometry::robust_point_type<Point, RobustPolicy>::type robust_point;
+    geometry::recalculate(robust_point, point, robust_policy);
+    return (dir == 1  && get<Dimension>(robust_point) < get<min_corner, Dimension>(robust_box))
+        || (dir == -1 && get<Dimension>(robust_point) > get<max_corner, Dimension>(robust_box));
+}
+
+template
+<
+    std::size_t Dimension,
+    typename Point,
+    typename RobustBox,
+    typename RobustPolicy
+>
+static inline bool exceeding(int dir, Point const& point,
+            RobustBox const& robust_box,
+            RobustPolicy const& robust_policy)
+{
+    typename geometry::robust_point_type<Point, RobustPolicy>::type robust_point;
+    geometry::recalculate(robust_point, point, robust_policy);
+    return (dir == 1  && get<Dimension>(robust_point) > get<max_corner, Dimension>(robust_box))
+        || (dir == -1 && get<Dimension>(robust_point) < get<min_corner, Dimension>(robust_box));
+}
+
+
+}} // namespace detail::section
+#endif
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SECTIONS_FUNCTIONS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/signed_index_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SIGNED_INDEX_TYPE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SIGNED_INDEX_TYPE_HPP
+
+
+#include <cstddef>
+#include <boost/type_traits/make_signed.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+typedef boost::make_signed<std::size_t>::type signed_index_type;
+//typedef std::ptrdiff_t signed_index_type;
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SIGNED_INDEX_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/single_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,96 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
+
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/util/range.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch {
+
+// Returns single geometry by Id
+// for single geometries returns the geometry itself
+template <typename Geometry,
+          bool IsMulti = boost::is_base_of
+                            <
+                                multi_tag,
+                                typename geometry::tag<Geometry>::type
+                            >::value
+>
+struct single_geometry
+{
+    typedef Geometry & return_type;
+
+    template <typename Id>
+    static inline return_type apply(Geometry & g, Id const& ) { return g; }
+};
+
+// for multi geometries returns one of the stored single geometries
+template <typename Geometry>
+struct single_geometry<Geometry, true>
+{
+    typedef typename boost::mpl::if_c
+        <
+            boost::is_const<Geometry>::value,
+            typename boost::range_value<Geometry>::type const&,
+            typename boost::range_value<Geometry>::type
+        >::type return_type;
+
+    template <typename Id>
+    static inline return_type apply(Geometry & g, Id const& id)
+    {
+        BOOST_ASSERT(id.multi_index >= 0);
+        typedef typename boost::range_size<Geometry>::type size_type;
+        return range::at(g, static_cast<size_type>(id.multi_index));
+    }
+};
+
+} // namespace detail_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail {
+
+template <typename Geometry>
+struct single_geometry_return_type
+{
+    typedef typename detail_dispatch::single_geometry<Geometry>::return_type type;
+};
+
+template <typename Geometry, typename Id>
+inline
+typename single_geometry_return_type<Geometry>::type
+single_geometry(Geometry & geometry, Id const& id)
+{
+    return detail_dispatch::single_geometry<Geometry>::apply(geometry, id);
+}
+
+template <typename Geometry, typename Id>
+inline
+typename single_geometry_return_type<Geometry const>::type
+single_geometry(Geometry const& geometry, Id const& id)
+{
+    return detail_dispatch::single_geometry<Geometry const>::apply(geometry, id);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/sub_range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,119 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SUB_RANGE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SUB_RANGE_HPP
+
+#include <boost/geometry/util/range.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace detail_dispatch {
+
+template <typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type,
+          bool IsMulti = boost::is_base_of<multi_tag, Tag>::value>
+struct sub_range : not_implemented<Tag>
+{};
+
+template <typename Geometry, typename Tag>
+struct sub_range<Geometry, Tag, false>
+{
+    typedef Geometry & return_type;
+
+    template <typename Id> static inline
+    return_type apply(Geometry & geometry, Id const&)
+    {
+        return geometry;
+    }
+};
+
+template <typename Geometry>
+struct sub_range<Geometry, polygon_tag, false>
+{
+    typedef typename geometry::ring_return_type<Geometry>::type return_type;
+
+    template <typename Id> static inline
+    return_type apply(Geometry & geometry, Id const& id)
+    {
+        if ( id.ring_index < 0 )
+        {
+            return geometry::exterior_ring(geometry);
+        }
+        else
+        {
+            typedef typename boost::range_size
+                <
+                    typename geometry::interior_type<Geometry>::type
+                >::type size_type;
+            size_type const ri = static_cast<size_type>(id.ring_index);
+            return range::at(geometry::interior_rings(geometry), ri);
+        }
+    }
+};
+
+template <typename Geometry, typename Tag>
+struct sub_range<Geometry, Tag, true>
+{
+    typedef typename boost::range_value<Geometry>::type value_type;
+    typedef typename boost::mpl::if_c
+        <
+            boost::is_const<Geometry>::value,
+            typename boost::add_const<value_type>::type,
+            value_type
+        >::type sub_type;
+
+    typedef detail_dispatch::sub_range<sub_type> sub_sub_range;
+
+    // TODO: shouldn't it be return_type?
+    typedef typename sub_sub_range::return_type return_type;
+
+    template <typename Id> static inline
+    return_type apply(Geometry & geometry, Id const& id)
+    {
+        BOOST_ASSERT(0 <= id.multi_index);
+        typedef typename boost::range_size<Geometry>::type size_type;
+        size_type const mi = static_cast<size_type>(id.multi_index);
+        return sub_sub_range::apply(range::at(geometry, mi), id);
+    }
+};
+
+} // namespace detail_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+namespace detail {
+
+template <typename Geometry>
+struct sub_range_return_type
+{
+    typedef typename detail_dispatch::sub_range<Geometry>::return_type type;
+};
+
+// This function also works for geometry::segment_identifier
+
+template <typename Geometry, typename Id> inline
+typename sub_range_return_type<Geometry>::type
+sub_range(Geometry & geometry, Id const& id)
+{
+    return detail_dispatch::sub_range<Geometry>::apply(geometry, id);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SUB_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/compare_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,113 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_COMPARE_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_COMPARE_TURNS_HPP
+
+#include <cstddef>
+#include <functional>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace turns
+{
+
+// TURNS SORTING AND SEARCHING
+
+// sort turns by G1 - source_index == 0 by:
+// seg_id -> fraction -> other_id -> operation
+template
+<
+    typename IdLess = std::less<signed_index_type>,
+    int N = 0, int U = 1, int I = 2, int B = 3, int C = 4, int O = 0,
+    std::size_t OpId = 0
+>
+struct less_seg_fraction_other_op
+{
+    BOOST_STATIC_ASSERT(OpId < 2);
+    static const std::size_t other_op_id = (OpId + 1) % 2;
+
+    template <typename Op>
+    static inline int order_op(Op const& op)
+    {
+        switch (op.operation)
+        {
+        case detail::overlay::operation_none : return N;
+        case detail::overlay::operation_union : return U;
+        case detail::overlay::operation_intersection : return I;
+        case detail::overlay::operation_blocked : return B;
+        case detail::overlay::operation_continue : return C;
+        case detail::overlay::operation_opposite : return O;
+        }
+        return -1;
+    }
+
+    template <typename Op>
+    static inline bool use_operation(Op const& left, Op const& right)
+    {
+        return order_op(left) < order_op(right);
+    }
+
+    template <typename Turn>
+    static inline bool use_other_id(Turn const& left, Turn const& right)
+    {
+        segment_identifier const& left_other_seg_id = left.operations[other_op_id].seg_id;
+        segment_identifier const& right_other_seg_id = right.operations[other_op_id].seg_id;
+
+        if ( left_other_seg_id.multi_index != right_other_seg_id.multi_index )
+        {
+            return left_other_seg_id.multi_index < right_other_seg_id.multi_index;
+        }
+        if ( left_other_seg_id.ring_index != right_other_seg_id.ring_index )
+        {
+            return left_other_seg_id.ring_index != right_other_seg_id.ring_index;
+        }
+        if ( left_other_seg_id.segment_index != right_other_seg_id.segment_index )
+        {
+            return IdLess()(left_other_seg_id.segment_index,
+                            right_other_seg_id.segment_index);
+        }
+        return use_operation(left.operations[OpId], right.operations[OpId]);
+    }
+
+    template <typename Turn>
+    static inline bool use_fraction(Turn const& left, Turn const& right)
+    {
+        return left.operations[OpId].fraction < right.operations[OpId].fraction
+           || ( geometry::math::equals(left.operations[OpId].fraction, right.operations[OpId].fraction) 
+                && use_other_id(left, right)
+              );
+    }
+
+    template <typename Turn>
+    inline bool operator()(Turn const& left, Turn const& right) const
+    {
+        segment_identifier const& sl = left.operations[OpId].seg_id;
+        segment_identifier const& sr = right.operations[OpId].seg_id;
+
+        return sl < sr || ( sl == sr && use_fraction(left, right) );
+    }
+};
+
+
+
+
+
+}} // namespace detail::turns
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_COMPARE_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/debug_turn.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_DEBUG_TURN_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_DEBUG_TURN_HPP
+
+#ifdef BOOST_GEOMETRY_DEBUG_TURNS
+#include <iostream>
+#include <string>
+
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <boost/geometry/io/wkt/write.hpp>
+#include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
+#endif // BOOST_GEOMETRY_DEBUG_TURNS
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace turns
+{
+
+
+#ifdef BOOST_GEOMETRY_DEBUG_TURNS
+template <typename Turn, typename Operation>
+inline void debug_turn(Turn const& turn, Operation op,
+                       std::string const& header)
+{
+    std::cout << header
+        << " at " << op.seg_id
+        << " meth: " << method_char(turn.method)
+        << " op: " << operation_char(op.operation)
+        << " of: " << operation_char(turn.operations[0].operation)
+        << operation_char(turn.operations[1].operation)
+        << " " << geometry::wkt(turn.point)
+        << std::endl;
+
+    if (boost::contains(header, "Finished"))
+    {
+        std::cout << std::endl;
+    }
+}
+#else
+template <typename Turn, typename Operation>
+inline void debug_turn(Turn const& , Operation, const char*)
+{
+}
+#endif // BOOST_GEOMETRY_DEBUG_TURNS
+
+
+}} // namespace detail::turns
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost:geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_DEBUG_TURN_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/filter_continue_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,78 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_FILTER_CONTINUE_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_FILTER_CONTINUE_TURNS_HPP
+
+#include <algorithm>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace turns
+{
+
+
+template <typename Turns, bool Enable>
+struct filter_continue_turns
+{
+    static inline void apply(Turns&) {}
+};
+
+
+template <typename Turns>
+class filter_continue_turns<Turns, true>
+{
+private:
+    class IsContinueTurn
+    {
+    private:
+        template <typename Operation>
+        inline bool is_continue_or_opposite(Operation const& operation) const
+        {
+            return operation == detail::overlay::operation_continue
+                || operation == detail::overlay::operation_opposite;
+        }
+
+    public:
+        template <typename Turn>
+        bool operator()(Turn const& turn) const
+        {
+            if ( turn.method != detail::overlay::method_collinear
+                 && turn.method != detail::overlay::method_equal )
+            {
+                return false;
+            }
+
+            return is_continue_or_opposite(turn.operations[0].operation)
+                && is_continue_or_opposite(turn.operations[1].operation);
+        }
+    };
+
+
+public:
+    static inline void apply(Turns& turns)
+    {
+        turns.erase( std::remove_if(turns.begin(), turns.end(),
+                                    IsContinueTurn()),
+                     turns.end()
+                     );
+    }
+};
+
+
+}} // namespace detail::turns
+
+}} // namespect boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_FILTER_CONTINUE_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/print_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,105 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_PRINT_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_PRINT_TURNS_HPP
+
+#include <algorithm>
+#include <iostream>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/detail/overlay/traversal_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
+#include <boost/geometry/io/wkt/write.hpp>
+#include <boost/geometry/io/dsv/write.hpp>
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace turns
+{
+
+struct turn_printer
+{
+    turn_printer(std::ostream & os)
+        : index(0)
+        , out(os)
+    {}
+
+    template <typename Turn>
+    void operator()(Turn const& turn)
+    {
+        out << index
+            << ": " << geometry::method_char(turn.method);
+
+        if ( turn.discarded )
+            out << " (discarded)\n";
+        else if ( turn.blocked() )
+            out << " (blocked)\n";
+        else
+            out << '\n';
+
+        double fraction[2];
+
+        fraction[0] = turn.operations[0].fraction.numerator()
+            / turn.operations[0].fraction.denominator();
+
+        out << geometry::operation_char(turn.operations[0].operation)
+            <<": seg: " << turn.operations[0].seg_id.source_index
+            << ", m: " << turn.operations[0].seg_id.multi_index
+            << ", r: " << turn.operations[0].seg_id.ring_index
+            << ", s: " << turn.operations[0].seg_id.segment_index << ", ";
+        out << ", fr: " << fraction[0];
+        out << ", col?: " << turn.operations[0].is_collinear;
+        out << ' ' << geometry::dsv(turn.point) << ' ';
+
+        out << '\n';
+
+        fraction[1] = turn.operations[1].fraction.numerator()
+            / turn.operations[1].fraction.denominator();
+
+        out << geometry::operation_char(turn.operations[1].operation)
+            << ": seg: " << turn.operations[1].seg_id.source_index
+            << ", m: " << turn.operations[1].seg_id.multi_index
+            << ", r: " << turn.operations[1].seg_id.ring_index
+            << ", s: " << turn.operations[1].seg_id.segment_index << ", ";
+        out << ", fr: " << fraction[1];
+        out << ", col?: " << turn.operations[1].is_collinear;
+        out << ' ' << geometry::dsv(turn.point) << ' ';
+
+        ++index;
+        out << std::endl;
+    }
+
+    int index;
+    std::ostream & out;
+};
+
+template <typename Geometry1, typename Geometry2, typename Turns>
+static inline void print_turns(Geometry1 const& g1,
+                               Geometry2 const& g2,
+                               Turns const& turns)
+{
+    std::cout << geometry::wkt(g1) << std::endl;
+    std::cout << geometry::wkt(g2) << std::endl;
+
+    std::for_each(boost::begin(turns), boost::end(turns), turn_printer(std::cout));
+}
+
+
+
+
+}} // namespace detail::turns
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_PRINT_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/turns/remove_duplicate_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_REMOVE_DUPLICATE_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_REMOVE_DUPLICATE_TURNS_HPP
+
+#include <algorithm>
+#include <boost/geometry/algorithms/equals.hpp>
+
+namespace boost { namespace geometry
+{
+
+namespace detail { namespace turns
+{
+
+template <typename Turns, bool Enable>
+struct remove_duplicate_turns
+{
+    static inline void apply(Turns&) {}
+};
+
+
+
+template <typename Turns>
+class remove_duplicate_turns<Turns, true>
+{
+private:
+    struct TurnEqualsTo
+    {
+        template <typename Turn>
+        bool operator()(Turn const& t1, Turn const& t2) const
+        {
+            return geometry::equals(t1.point, t2.point)
+                && t1.operations[0].seg_id == t2.operations[0].seg_id
+                && t1.operations[1].seg_id == t2.operations[1].seg_id;
+        }
+    };
+
+public:
+    static inline void apply(Turns& turns)
+    {
+        turns.erase( std::unique(turns.begin(), turns.end(),
+                                 TurnEqualsTo()),
+                     turns.end()
+                     );
+    }
+};
+
+
+
+}} // namespace detail::turns
+
+}} // namespect boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_TURNS_REMOVE_DUPLICATE_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/vincenty_direct.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,190 @@
+// Boost.Geometry
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_DIRECT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_DIRECT_HPP
+
+
+#include <boost/math/constants/constants.hpp>
+
+#include <boost/geometry/core/radius.hpp>
+#include <boost/geometry/core/srs.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/algorithms/detail/flattening.hpp>
+
+
+#ifndef BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS
+#define BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS 1000
+#endif
+
+
+namespace boost { namespace geometry { namespace detail
+{
+
+/*!
+\brief The solution of the direct problem of geodesics on latlong coordinates, after Vincenty, 1975
+\author See
+    - http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
+    - http://www.icsm.gov.au/gda/gdav2.3.pdf
+\author Adapted from various implementations to get it close to the original document
+    - http://www.movable-type.co.uk/scripts/LatLongVincenty.html
+    - http://exogen.case.edu/projects/geopy/source/geopy.distance.html
+    - http://futureboy.homeip.net/fsp/colorize.fsp?fileName=navigation.frink
+
+*/
+template <typename CT>
+class vincenty_direct
+{
+public:
+    template <typename T, typename Dist, typename Azi, typename Spheroid>
+    vincenty_direct(T const& lo1,
+                    T const& la1,
+                    Dist const& distance,
+                    Azi const& azimuth12,
+                    Spheroid const& spheroid)
+        : lon1(lo1)
+        , lat1(la1)
+        , is_distance_zero(false)
+    {
+        if ( math::equals(distance, Dist(0)) || distance < Dist(0) )
+        {
+            is_distance_zero = true;
+            return;
+        }
+
+        CT const radius_a = CT(get_radius<0>(spheroid));
+        CT const radius_b = CT(get_radius<2>(spheroid));
+        flattening = geometry::detail::flattening<CT>(spheroid);
+
+        sin_azimuth12 = sin(azimuth12);
+        cos_azimuth12 = cos(azimuth12);
+
+        // U: reduced latitude, defined by tan U = (1-f) tan phi
+        one_min_f = CT(1) - flattening;
+        CT const tan_U1 = one_min_f * tan(lat1);
+        CT const sigma1 = atan2(tan_U1, cos_azimuth12); // (1)
+
+        // may be calculated from tan using 1 sqrt()
+        CT const U1 = atan(tan_U1);
+        sin_U1 = sin(U1);
+        cos_U1 = cos(U1);
+
+        sin_alpha = cos_U1 * sin_azimuth12; // (2)
+        sin_alpha_sqr = math::sqr(sin_alpha);
+        cos_alpha_sqr = CT(1) - sin_alpha_sqr;
+
+        CT const b_sqr = radius_b * radius_b;
+        CT const u_sqr = cos_alpha_sqr * (radius_a * radius_a - b_sqr) / b_sqr;
+        CT const A = CT(1) + (u_sqr/CT(16384)) * (CT(4096) + u_sqr*(CT(-768) + u_sqr*(CT(320) - u_sqr*CT(175)))); // (3)
+        CT const B = (u_sqr/CT(1024))*(CT(256) + u_sqr*(CT(-128) + u_sqr*(CT(74) - u_sqr*CT(47)))); // (4)
+
+        CT s_div_bA = distance / (radius_b * A);
+        sigma = s_div_bA; // (7)
+
+        CT previous_sigma;
+
+        int counter = 0; // robustness
+
+        do
+        {
+            previous_sigma = sigma;
+
+            CT const two_sigma_m = CT(2) * sigma1 + sigma; // (5)
+
+            sin_sigma = sin(sigma);
+            cos_sigma = cos(sigma);
+            CT const sin_sigma_sqr = math::sqr(sin_sigma);
+            cos_2sigma_m = cos(two_sigma_m);
+            cos_2sigma_m_sqr = math::sqr(cos_2sigma_m);
+
+            CT const delta_sigma = B * sin_sigma * (cos_2sigma_m
+                                        + (B/CT(4)) * ( cos_sigma * (CT(-1) + CT(2)*cos_2sigma_m_sqr)
+                                            - (B/CT(6) * cos_2sigma_m * (CT(-3)+CT(4)*sin_sigma_sqr) * (CT(-3)+CT(4)*cos_2sigma_m_sqr)) )); // (6)
+
+            sigma = s_div_bA + delta_sigma; // (7)
+
+            ++counter; // robustness
+
+        } while ( geometry::math::abs(previous_sigma - sigma) > CT(1e-12)
+               //&& geometry::math::abs(sigma) < pi
+               && counter < BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS ); // robustness
+    }
+
+    inline CT lat2() const
+    {
+        if ( is_distance_zero )
+        {
+            return lat1;
+        }
+
+        return atan2( sin_U1 * cos_sigma + cos_U1 * sin_sigma * cos_azimuth12,
+                      one_min_f * math::sqrt(sin_alpha_sqr + math::sqr(sin_U1 * sin_sigma - cos_U1 * cos_sigma * cos_azimuth12))); // (8)
+    }
+
+    inline CT lon2() const
+    {
+        if ( is_distance_zero )
+        {
+            return lon1;
+        }
+
+        CT const lambda = atan2( sin_sigma * sin_azimuth12,
+                                 cos_U1 * cos_sigma - sin_U1 * sin_sigma * cos_azimuth12); // (9)
+        CT const C = (flattening/CT(16)) * cos_alpha_sqr * ( CT(4) + flattening * ( CT(4) - CT(3) * cos_alpha_sqr ) ); // (10)
+        CT const L = lambda - (CT(1) - C) * flattening * sin_alpha
+                        * ( sigma + C * sin_sigma * ( cos_2sigma_m + C * cos_sigma * ( CT(-1) + CT(2) * cos_2sigma_m_sqr ) ) ); // (11)
+
+        return lon1 + L;
+    }
+
+    inline CT azimuth21() const
+    {
+        // NOTE: signs of X and Y are different than in the original paper
+        return is_distance_zero ?
+               CT(0) :
+               atan2(-sin_alpha, sin_U1 * sin_sigma - cos_U1 * cos_sigma * cos_azimuth12); // (12)
+    }
+
+private:
+    CT sigma;
+    CT sin_sigma;
+    CT cos_sigma;
+
+    CT cos_2sigma_m;
+    CT cos_2sigma_m_sqr;
+
+    CT sin_alpha;
+    CT sin_alpha_sqr;
+    CT cos_alpha_sqr;
+
+    CT sin_azimuth12;
+    CT cos_azimuth12;
+
+    CT sin_U1;
+    CT cos_U1;
+
+    CT flattening;
+    CT one_min_f;
+
+    CT const lon1;
+    CT const lat1;
+
+    bool is_distance_zero;
+};
+
+}}} // namespace boost::geometry::detail
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_DIRECT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/vincenty_inverse.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,218 @@
+// Boost.Geometry
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_INVERSE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_INVERSE_HPP
+
+
+#include <boost/math/constants/constants.hpp>
+
+#include <boost/geometry/core/radius.hpp>
+#include <boost/geometry/core/srs.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/algorithms/detail/flattening.hpp>
+
+
+#ifndef BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS
+#define BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS 1000
+#endif
+
+
+namespace boost { namespace geometry { namespace detail
+{
+
+/*!
+\brief The solution of the inverse problem of geodesics on latlong coordinates, after Vincenty, 1975
+\author See
+    - http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
+    - http://www.icsm.gov.au/gda/gdav2.3.pdf
+\author Adapted from various implementations to get it close to the original document
+    - http://www.movable-type.co.uk/scripts/LatLongVincenty.html
+    - http://exogen.case.edu/projects/geopy/source/geopy.distance.html
+    - http://futureboy.homeip.net/fsp/colorize.fsp?fileName=navigation.frink
+
+*/
+template <typename CT>
+class vincenty_inverse
+{
+public:
+    template <typename T1, typename T2, typename Spheroid>
+    vincenty_inverse(T1 const& lon1,
+                     T1 const& lat1,
+                     T2 const& lon2,
+                     T2 const& lat2,
+                     Spheroid const& spheroid)
+        : is_result_zero(false)
+    {
+        if (math::equals(lat1, lat2) && math::equals(lon1, lon2))
+        {
+            is_result_zero = true;
+            return;
+        }
+
+        CT const c1 = 1;
+        CT const c2 = 2;
+        CT const c3 = 3;
+        CT const c4 = 4;
+        CT const c16 = 16;
+        CT const c_e_12 = CT(1e-12);
+
+        CT const pi = geometry::math::pi<CT>();
+        CT const two_pi = c2 * pi;
+
+        // lambda: difference in longitude on an auxiliary sphere
+        CT L = lon2 - lon1;
+        CT lambda = L;
+
+        if (L < -pi) L += two_pi;
+        if (L > pi) L -= two_pi;
+
+        radius_a = CT(get_radius<0>(spheroid));
+        radius_b = CT(get_radius<2>(spheroid));
+        CT const flattening = geometry::detail::flattening<CT>(spheroid);
+
+        // U: reduced latitude, defined by tan U = (1-f) tan phi
+        CT const one_min_f = c1 - flattening;
+        CT const tan_U1 = one_min_f * tan(lat1); // above (1)
+        CT const tan_U2 = one_min_f * tan(lat2); // above (1)
+
+        // calculate sin U and cos U using trigonometric identities
+        CT const temp_den_U1 = math::sqrt(c1 + math::sqr(tan_U1));
+        CT const temp_den_U2 = math::sqrt(c1 + math::sqr(tan_U2));
+        // cos = 1 / sqrt(1 + tan^2)
+        cos_U1 = c1 / temp_den_U1;
+        cos_U2 = c1 / temp_den_U2;
+        // sin = tan / sqrt(1 + tan^2)
+        sin_U1 = tan_U1 / temp_den_U1;
+        sin_U2 = tan_U2 / temp_den_U2;
+
+        // calculate sin U and cos U directly
+        //CT const U1 = atan(tan_U1);
+        //CT const U2 = atan(tan_U2);
+        //cos_U1 = cos(U1);
+        //cos_U2 = cos(U2);
+        //sin_U1 = tan_U1 * cos_U1; // sin(U1);
+        //sin_U2 = tan_U2 * cos_U2; // sin(U2);
+
+        CT previous_lambda;
+
+        int counter = 0; // robustness
+
+        do
+        {
+            previous_lambda = lambda; // (13)
+            sin_lambda = sin(lambda);
+            cos_lambda = cos(lambda);
+            sin_sigma = math::sqrt(math::sqr(cos_U2 * sin_lambda) + math::sqr(cos_U1 * sin_U2 - sin_U1 * cos_U2 * cos_lambda)); // (14)
+            CT cos_sigma = sin_U1 * sin_U2 + cos_U1 * cos_U2 * cos_lambda; // (15)
+            sin_alpha = cos_U1 * cos_U2 * sin_lambda / sin_sigma; // (17)
+            cos2_alpha = c1 - math::sqr(sin_alpha);
+            cos2_sigma_m = math::equals(cos2_alpha, 0) ? 0 : cos_sigma - c2 * sin_U1 * sin_U2 / cos2_alpha; // (18)
+
+            CT C = flattening/c16 * cos2_alpha * (c4 + flattening * (c4 - c3 * cos2_alpha)); // (10)
+            sigma = atan2(sin_sigma, cos_sigma); // (16)
+            lambda = L + (c1 - C) * flattening * sin_alpha *
+                (sigma + C * sin_sigma * ( cos2_sigma_m + C * cos_sigma * (-c1 + c2 * math::sqr(cos2_sigma_m)))); // (11)
+
+            ++counter; // robustness
+
+        } while ( geometry::math::abs(previous_lambda - lambda) > c_e_12
+               && geometry::math::abs(lambda) < pi
+               && counter < BOOST_GEOMETRY_DETAIL_VINCENTY_MAX_STEPS ); // robustness
+    }
+
+    inline CT distance() const
+    {
+        if ( is_result_zero )
+        {
+            return CT(0);
+        }
+
+        // Oops getting hard here
+        // (again, problem is that ttmath cannot divide by doubles, which is OK)
+        CT const c1 = 1;
+        CT const c2 = 2;
+        CT const c3 = 3;
+        CT const c4 = 4;
+        CT const c6 = 6;
+        CT const c47 = 47;
+        CT const c74 = 74;
+        CT const c128 = 128;
+        CT const c256 = 256;
+        CT const c175 = 175;
+        CT const c320 = 320;
+        CT const c768 = 768;
+        CT const c1024 = 1024;
+        CT const c4096 = 4096;
+        CT const c16384 = 16384;
+
+        //CT sqr_u = cos2_alpha * (math::sqr(radius_a) - math::sqr(radius_b)) / math::sqr(radius_b); // above (1)
+        CT sqr_u = cos2_alpha * ( math::sqr(radius_a / radius_b) - c1 ); // above (1)
+
+        CT A = c1 + sqr_u/c16384 * (c4096 + sqr_u * (-c768 + sqr_u * (c320 - c175 * sqr_u))); // (3)
+        CT B = sqr_u/c1024 * (c256 + sqr_u * ( -c128 + sqr_u * (c74 - c47 * sqr_u))); // (4)
+        CT delta_sigma = B * sin_sigma * ( cos2_sigma_m + (B/c4) * (cos(sigma)* (-c1 + c2 * cos2_sigma_m)
+            - (B/c6) * cos2_sigma_m * (-c3 + c4 * math::sqr(sin_sigma)) * (-c3 + c4 * cos2_sigma_m))); // (6)
+
+        return radius_b * A * (sigma - delta_sigma); // (19)
+    }
+
+    inline CT azimuth12() const
+    {
+        return is_result_zero ?
+               CT(0) :
+               atan2(cos_U2 * sin_lambda, cos_U1 * sin_U2 - sin_U1 * cos_U2 * cos_lambda); // (20)
+    }
+
+    inline CT azimuth21() const
+    {
+        // NOTE: signs of X and Y are different than in the original paper
+        return is_result_zero ?
+               CT(0) :
+               atan2(-cos_U1 * sin_lambda, sin_U1 * cos_U2 - cos_U1 * sin_U2 * cos_lambda); // (21)
+    }
+
+private:
+    // alpha: azimuth of the geodesic at the equator
+    CT cos2_alpha;
+    CT sin_alpha;
+
+    // sigma: angular distance p1,p2 on the sphere
+    // sigma1: angular distance on the sphere from the equator to p1
+    // sigma_m: angular distance on the sphere from the equator to the midpoint of the line
+    CT sigma;
+    CT sin_sigma;
+    CT cos2_sigma_m;
+
+    CT sin_lambda;
+    CT cos_lambda;
+
+    // set only once
+    CT cos_U1;
+    CT cos_U2;
+    CT sin_U1;
+    CT sin_U2;
+
+    // set only once
+    CT radius_a;
+    CT radius_b;
+
+    bool is_result_zero;
+};
+
+}}} // namespace boost::geometry::detail
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_VINCENTY_INVERSE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/within/point_in_geometry.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,467 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_POINT_IN_GEOMETRY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_POINT_IN_GEOMETRY_HPP
+
+#include <boost/assert.hpp>
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/range.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+#include <boost/geometry/algorithms/detail/interior_iterator.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+#include <boost/geometry/strategies/concepts/within_concept.hpp>
+#include <boost/geometry/strategies/default_strategy.hpp>
+#include <boost/geometry/strategies/within.hpp>
+#include <boost/geometry/strategies/covered_by.hpp>
+
+#include <boost/geometry/util/range.hpp>
+#include <boost/geometry/views/detail/normalized_view.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace within {
+
+// TODO: is this needed?
+inline int check_result_type(int result)
+{
+    return result;
+}
+
+template <typename T>
+inline T check_result_type(T result)
+{
+    BOOST_ASSERT(false);
+    return result;
+}
+
+template <typename Point, typename Range, typename Strategy> inline
+int point_in_range(Point const& point, Range const& range, Strategy const& strategy)
+{
+    boost::ignore_unused(strategy);
+
+    typedef typename boost::range_iterator<Range const>::type iterator_type;
+    typename Strategy::state_type state;
+    iterator_type it = boost::begin(range);
+    iterator_type end = boost::end(range);
+
+    for ( iterator_type previous = it++ ; it != end ; ++previous, ++it )
+    {
+        if ( ! strategy.apply(point, *previous, *it, state) )
+        {
+            break;
+        }
+    }
+
+    return check_result_type(strategy.result(state));
+}
+
+template <typename Geometry, typename Point, typename Range>
+inline int point_in_range(Point const& point, Range const& range)
+{
+    typedef typename point_type<Point>::type point_type1;
+    typedef typename point_type<Geometry>::type point_type2;
+
+    typedef typename strategy::within::services::default_strategy
+        <
+            typename tag<Point>::type,
+            typename tag<Geometry>::type,
+            typename tag<Point>::type,
+            typename tag_cast<typename tag<Geometry>::type, areal_tag>::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type1>::type, spherical_tag
+                >::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type2>::type, spherical_tag
+                >::type,
+            Point,
+            Geometry
+        >::type strategy_type;
+
+    typedef typename strategy::covered_by::services::default_strategy
+        <
+            typename tag<Point>::type,
+            typename tag<Geometry>::type,
+            typename tag<Point>::type,
+            typename tag_cast<typename tag<Geometry>::type, areal_tag>::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type1>::type, spherical_tag
+                >::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type2>::type, spherical_tag
+                >::type,
+            Point,
+            Geometry
+        >::type strategy_type2;
+
+    static const bool same_strategies = boost::is_same<strategy_type, strategy_type2>::value;
+    BOOST_MPL_ASSERT_MSG((same_strategies),
+                         DEFAULT_WITHIN_AND_COVERED_BY_STRATEGIES_NOT_COMPATIBLE,
+                         (strategy_type, strategy_type2));
+
+    return point_in_range(point, range, strategy_type());
+}
+
+}} // namespace detail::within
+
+namespace detail_dispatch { namespace within {
+
+// checks the relation between a point P and geometry G
+// returns 1 if P is in the interior of G
+// returns 0 if P is on the boundry of G
+// returns -1 if P is in the exterior of G
+
+template <typename Geometry,
+          typename Tag = typename geometry::tag<Geometry>::type>
+struct point_in_geometry
+    : not_implemented<Tag>
+{};
+
+template <typename Point2>
+struct point_in_geometry<Point2, point_tag>
+{
+    template <typename Point1, typename Strategy> static inline
+    int apply(Point1 const& point1, Point2 const& point2, Strategy const& strategy)
+    {
+        boost::ignore_unused(strategy);
+        return strategy.apply(point1, point2) ? 1 : -1;
+    }
+};
+
+template <typename Segment>
+struct point_in_geometry<Segment, segment_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Segment const& segment, Strategy const& strategy)
+    {
+        boost::ignore_unused(strategy);
+
+        typedef typename geometry::point_type<Segment>::type point_type;
+        point_type p0, p1;
+// TODO: don't copy points
+        detail::assign_point_from_index<0>(segment, p0);
+        detail::assign_point_from_index<1>(segment, p1);
+
+        typename Strategy::state_type state;
+        strategy.apply(point, p0, p1, state);
+        int r = detail::within::check_result_type(strategy.result(state));
+
+        if ( r != 0 )
+            return -1; // exterior
+
+        // if the point is equal to the one of the terminal points
+        if ( detail::equals::equals_point_point(point, p0)
+          || detail::equals::equals_point_point(point, p1) )
+            return 0; // boundary
+        else
+            return 1; // interior
+    }
+};
+
+
+template <typename Linestring>
+struct point_in_geometry<Linestring, linestring_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Linestring const& linestring, Strategy const& strategy)
+    {
+        std::size_t count = boost::size(linestring);
+        if ( count > 1 )
+        {
+            if ( detail::within::point_in_range(point, linestring, strategy) != 0 )
+                return -1; // exterior
+
+            // if the linestring doesn't have a boundary
+            if (detail::equals::equals_point_point(range::front(linestring), range::back(linestring)))
+                return 1; // interior
+            // else if the point is equal to the one of the terminal points
+            else if (detail::equals::equals_point_point(point, range::front(linestring))
+                || detail::equals::equals_point_point(point, range::back(linestring)))
+                return 0; // boundary
+            else
+                return 1; // interior
+        }
+// TODO: for now degenerated linestrings are ignored
+//       throw an exception here?
+        /*else if ( count == 1 )
+        {
+            if ( detail::equals::equals_point_point(point, range::front(linestring)) )
+                return 1;
+        }*/
+
+        return -1; // exterior
+    }
+};
+
+template <typename Ring>
+struct point_in_geometry<Ring, ring_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Ring const& ring, Strategy const& strategy)
+    {
+        if ( boost::size(ring) < core_detail::closure::minimum_ring_size
+                                    <
+                                        geometry::closure<Ring>::value
+                                    >::value )
+        {
+            return -1;
+        }
+
+        detail::normalized_view<Ring const> view(ring);
+        return detail::within::point_in_range(point, view, strategy);
+    }
+};
+
+// Polygon: in exterior ring, and if so, not within interior ring(s)
+template <typename Polygon>
+struct point_in_geometry<Polygon, polygon_tag>
+{
+    template <typename Point, typename Strategy>
+    static inline int apply(Point const& point, Polygon const& polygon,
+                            Strategy const& strategy)
+    {
+        int const code = point_in_geometry
+            <
+                typename ring_type<Polygon>::type
+            >::apply(point, exterior_ring(polygon), strategy);
+
+        if (code == 1)
+        {
+            typename interior_return_type<Polygon const>::type
+                rings = interior_rings(polygon);
+            
+            for (typename detail::interior_iterator<Polygon const>::type
+                 it = boost::begin(rings);
+                 it != boost::end(rings);
+                 ++it)
+            {
+                int const interior_code = point_in_geometry
+                    <
+                        typename ring_type<Polygon>::type
+                    >::apply(point, *it, strategy);
+
+                if (interior_code != -1)
+                {
+                    // If 0, return 0 (touch)
+                    // If 1 (inside hole) return -1 (outside polygon)
+                    // If -1 (outside hole) check other holes if any
+                    return -interior_code;
+                }
+            }
+        }
+        return code;
+    }
+};
+
+template <typename Geometry>
+struct point_in_geometry<Geometry, multi_point_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Geometry const& geometry, Strategy const& strategy)
+    {
+        typedef typename boost::range_value<Geometry>::type point_type;
+        typedef typename boost::range_const_iterator<Geometry>::type iterator;
+        for ( iterator it = boost::begin(geometry) ; it != boost::end(geometry) ; ++it )
+        {
+            int pip = point_in_geometry<point_type>::apply(point, *it, strategy);
+
+            //BOOST_ASSERT(pip != 0);
+            if ( pip > 0 ) // inside
+                return 1;
+        }
+
+        return -1; // outside
+    }
+};
+
+template <typename Geometry>
+struct point_in_geometry<Geometry, multi_linestring_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Geometry const& geometry, Strategy const& strategy)
+    {
+        int pip = -1; // outside
+
+        typedef typename boost::range_value<Geometry>::type linestring_type;
+        typedef typename boost::range_value<linestring_type>::type point_type;
+        typedef typename boost::range_iterator<Geometry const>::type iterator;
+        iterator it = boost::begin(geometry);
+        for ( ; it != boost::end(geometry) ; ++it )
+        {
+            pip = point_in_geometry<linestring_type>::apply(point, *it, strategy);
+
+            // inside or on the boundary
+            if ( pip >= 0 )
+            {
+                ++it;
+                break;
+            }
+        }
+
+        // outside
+        if ( pip < 0 )
+            return -1;
+
+        // TODO: the following isn't needed for covered_by()
+
+        unsigned boundaries = pip == 0 ? 1 : 0;
+
+        for ( ; it != boost::end(geometry) ; ++it )
+        {
+            if ( boost::size(*it) < 2 )
+                continue;
+
+            point_type const& front = range::front(*it);
+            point_type const& back = range::back(*it);
+
+            // is closed_ring - no boundary
+            if ( detail::equals::equals_point_point(front, back) )
+                continue;
+
+            // is point on boundary
+            if ( detail::equals::equals_point_point(point, front)
+              || detail::equals::equals_point_point(point, back) )
+            {
+                ++boundaries;
+            }
+        }
+
+        // if the number of boundaries is odd, the point is on the boundary
+        return boundaries % 2 ? 0 : 1;
+    }
+};
+
+template <typename Geometry>
+struct point_in_geometry<Geometry, multi_polygon_tag>
+{
+    template <typename Point, typename Strategy> static inline
+    int apply(Point const& point, Geometry const& geometry, Strategy const& strategy)
+    {
+        // For invalid multipolygons
+        //int res = -1; // outside
+
+        typedef typename boost::range_value<Geometry>::type polygon_type;
+        typedef typename boost::range_const_iterator<Geometry>::type iterator;
+        for ( iterator it = boost::begin(geometry) ; it != boost::end(geometry) ; ++it )
+        {
+            int pip = point_in_geometry<polygon_type>::apply(point, *it, strategy);
+
+            // inside or on the boundary
+            if ( pip >= 0 )
+                return pip;
+
+            // For invalid multi-polygons
+            //if ( 1 == pip ) // inside polygon
+            //    return 1;
+            //else if ( res < pip ) // point must be inside at least one polygon
+            //    res = pip;
+        }
+
+        return -1; // for valid multipolygons
+        //return res; // for invalid multipolygons
+    }
+};
+
+}} // namespace detail_dispatch::within
+
+namespace detail { namespace within {
+
+// 1 - in the interior
+// 0 - in the boundry
+// -1 - in the exterior
+template <typename Point, typename Geometry, typename Strategy>
+inline int point_in_geometry(Point const& point, Geometry const& geometry, Strategy const& strategy)
+{
+    concept::within::check
+        <
+            typename tag<Point>::type,
+            typename tag<Geometry>::type,
+            typename tag_cast<typename tag<Geometry>::type, areal_tag>::type,
+            Strategy
+        >();
+
+    return detail_dispatch::within::point_in_geometry<Geometry>::apply(point, geometry, strategy);
+}
+
+template <typename Point, typename Geometry>
+inline int point_in_geometry(Point const& point, Geometry const& geometry)
+{
+    typedef typename point_type<Point>::type point_type1;
+    typedef typename point_type<Geometry>::type point_type2;
+
+    typedef typename strategy::within::services::default_strategy
+        <
+            typename tag<Point>::type,
+            typename tag<Geometry>::type,
+            typename tag<Point>::type,
+            typename tag_cast<typename tag<Geometry>::type, areal_tag>::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type1>::type, spherical_tag
+                >::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type2>::type, spherical_tag
+                >::type,
+            Point,
+            Geometry
+        >::type strategy_type;
+
+    typedef typename strategy::covered_by::services::default_strategy
+        <
+            typename tag<Point>::type,
+            typename tag<Geometry>::type,
+            typename tag<Point>::type,
+            typename tag_cast<typename tag<Geometry>::type, areal_tag>::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type1>::type, spherical_tag
+                >::type,
+            typename tag_cast
+                <
+                    typename cs_tag<point_type2>::type, spherical_tag
+                >::type,
+            Point,
+            Geometry
+        >::type strategy_type2;
+
+    static const bool same_strategies = boost::is_same<strategy_type, strategy_type2>::value;
+    BOOST_MPL_ASSERT_MSG((same_strategies),
+                         DEFAULT_WITHIN_AND_COVERED_BY_STRATEGIES_NOT_COMPATIBLE,
+                         (strategy_type, strategy_type2));
+
+    return point_in_geometry(point, geometry, strategy_type());
+}
+
+}} // namespace detail::within
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_POINT_IN_GEOMETRY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/detail/within/within_no_turns.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,221 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2013.
+// Modifications copyright (c) 2013, Oracle and/or its affiliates.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_WITHIN_NO_TURNS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_WITHIN_NO_TURNS_HPP
+
+#include <boost/geometry/algorithms/detail/point_on_border.hpp>
+#include <boost/geometry/algorithms/detail/within/point_in_geometry.hpp>
+
+namespace boost { namespace geometry {
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail_dispatch { namespace within {
+
+// returns true if G1 is within G2
+// this function should be called only if there are no intersection points
+// otherwise it may return invalid result
+// e.g. when non-first point of G1 is outside G2 or when some rings of G1 are the same as rings of G2
+
+template <typename Geometry1,
+          typename Geometry2,
+          typename Tag1 = typename geometry::tag<Geometry1>::type,
+          typename Tag2 = typename geometry::tag<Geometry2>::type>
+struct within_no_turns
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        typedef typename geometry::point_type<Geometry1>::type point1_type;
+        point1_type p;
+        if ( !geometry::point_on_border(p, geometry1) )
+            return false;
+
+        return detail::within::point_in_geometry(p, geometry2, strategy) >= 0;
+    }
+};
+
+template <typename Geometry1, typename Geometry2>
+struct within_no_turns<Geometry1, Geometry2, ring_tag, polygon_tag>
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        typedef typename geometry::point_type<Geometry1>::type point1_type;
+        typedef typename geometry::point_type<Geometry2>::type point2_type;
+        point1_type p;
+        if ( !geometry::point_on_border(p, geometry1) )
+            return false;
+        // check if one of ring points is outside the polygon
+        if ( detail::within::point_in_geometry(p, geometry2, strategy) < 0 )
+            return false;
+        // Now check if holes of G2 aren't inside G1
+        typedef typename boost::range_const_iterator
+            <
+                typename geometry::interior_type<Geometry2>::type
+            >::type iterator;
+        for ( iterator it = boost::begin(geometry::interior_rings(geometry2)) ;
+              it != boost::end(geometry::interior_rings(geometry2)) ;
+              ++it )
+        {
+            point2_type p;
+            if ( !geometry::point_on_border(p, *it) )
+                return false;
+            if ( detail::within::point_in_geometry(p, geometry1, strategy) > 0 )
+                return false;
+        }
+        return true;
+    }
+};
+
+template <typename Geometry1, typename Geometry2>
+struct within_no_turns<Geometry1, Geometry2, polygon_tag, polygon_tag>
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        typedef typename geometry::point_type<Geometry1>::type point1_type;
+        typedef typename geometry::point_type<Geometry2>::type point2_type;
+        point1_type p;
+        if ( !geometry::point_on_border(p, geometry1) )
+            return false;
+        // check if one of ring points is outside the polygon
+        if ( detail::within::point_in_geometry(p, geometry2, strategy) < 0 )
+            return false;
+        // Now check if holes of G2 aren't inside G1
+        typedef typename boost::range_const_iterator
+            <
+                typename geometry::interior_type<Geometry2>::type
+            >::type iterator2;
+        for ( iterator2 it = boost::begin(geometry::interior_rings(geometry2)) ;
+              it != boost::end(geometry::interior_rings(geometry2)) ;
+              ++it )
+        {
+            point2_type p2;
+            if ( !geometry::point_on_border(p2, *it) )
+                return false;
+            // if the hole of G2 is inside G1
+            if ( detail::within::point_in_geometry(p2, geometry1, strategy) > 0 )
+            {
+                // if it's also inside one of the G1 holes, it's ok
+                bool ok = false;
+                typedef typename boost::range_const_iterator
+                    <
+                        typename geometry::interior_type<Geometry1>::type
+                    >::type iterator1;
+                for ( iterator1 it1 = boost::begin(geometry::interior_rings(geometry1)) ;
+                      it1 != boost::end(geometry::interior_rings(geometry1)) ;
+                      ++it1 )
+                {
+                    if ( detail::within::point_in_geometry(p2, *it1, strategy) < 0 )
+                    {
+                        ok = true;
+                        break;
+                    }
+                }
+                if ( !ok )
+                    return false;
+            }
+        }
+        return true;
+    }
+};
+
+template <typename Geometry1,
+          typename Geometry2,
+          typename Tag1 = typename geometry::tag<Geometry1>::type,
+          typename Tag2 = typename geometry::tag<Geometry2>::type,
+          bool IsMulti1 = boost::is_base_of<geometry::multi_tag, Tag1>::value,
+          bool IsMulti2 = boost::is_base_of<geometry::multi_tag, Tag2>::value>
+struct within_no_turns_multi
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        return within_no_turns<Geometry1, Geometry2>::apply(geometry1, geometry2, strategy);
+    }
+};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2>
+struct within_no_turns_multi<Geometry1, Geometry2, Tag1, Tag2, true, false>
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        // All values of G1 must be inside G2
+        typedef typename boost::range_value<Geometry1>::type subgeometry1;
+        typedef typename boost::range_const_iterator<Geometry1>::type iterator;
+        for ( iterator it = boost::begin(geometry1) ; it != boost::end(geometry1) ; ++it )
+        {
+            if ( !within_no_turns<subgeometry1, Geometry2>::apply(*it, geometry2, strategy) )
+                return false;
+        }
+        return true;
+    }
+};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2>
+struct within_no_turns_multi<Geometry1, Geometry2, Tag1, Tag2, false, true>
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        // G1 must be within at least one value of G2
+        typedef typename boost::range_value<Geometry2>::type subgeometry2;
+        typedef typename boost::range_const_iterator<Geometry2>::type iterator;
+        for ( iterator it = boost::begin(geometry2) ; it != boost::end(geometry2) ; ++it )
+        {
+            if ( within_no_turns<Geometry1, subgeometry2>::apply(geometry1, *it, strategy) )
+                return true;
+        }
+        return false;
+    }
+};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2>
+struct within_no_turns_multi<Geometry1, Geometry2, Tag1, Tag2, true, true>
+{
+    template <typename Strategy> static inline
+    bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+    {
+        // each value of G1 must be inside at least one value of G2
+        typedef typename boost::range_value<Geometry1>::type subgeometry1;
+        typedef typename boost::range_const_iterator<Geometry1>::type iterator;
+        for ( iterator it = boost::begin(geometry1) ; it != boost::end(geometry1) ; ++it )
+        {
+            if ( !within_no_turns_multi<subgeometry1, Geometry2>::apply(*it, geometry2, strategy) )
+                return false;
+        }
+        return true;
+    }
+};
+
+}} // namespace detail_dispatch::within
+
+namespace detail { namespace within {
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+inline bool within_no_turns(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
+{
+    return detail_dispatch::within::within_no_turns_multi<Geometry1, Geometry2>::apply(geometry1, geometry2, strategy);
+}
+
+}} // namespace detail::within
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_WITHIN_WITHIN_NO_TURNS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/disjoint.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISJOINT_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISJOINT_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/core/reverse_dispatch.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry1, typename Geometry2,
+    std::size_t DimensionCount = dimension<Geometry1>::type::value,
+    typename Tag1 = typename tag_cast
+        <
+            typename tag<Geometry1>::type,
+            segment_tag, box_tag, linear_tag, areal_tag
+        >::type,
+    typename Tag2 = typename tag_cast
+        <
+            typename tag<Geometry2>::type,
+            segment_tag, box_tag, linear_tag, areal_tag
+        >::type,
+    bool Reverse = reverse_dispatch<Geometry1, Geometry2>::type::value
+>
+struct disjoint
+    : not_implemented<Geometry1, Geometry2>
+{};
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISJOINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/distance.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,82 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISTANCE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISTANCE_HPP
+
+
+#include <boost/geometry/core/reverse_dispatch.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tag_cast.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry1, typename Geometry2,
+    typename Strategy = typename detail::distance::default_strategy
+        <
+            Geometry1, Geometry2
+        >::type,
+    typename Tag1 = typename tag_cast
+        <
+            typename tag<Geometry1>::type,
+            segment_tag,
+            box_tag,
+            linear_tag,
+            areal_tag
+        >::type,
+    typename Tag2 = typename tag_cast
+        <
+            typename tag<Geometry2>::type,
+            segment_tag,
+            box_tag,
+            linear_tag,
+            areal_tag
+        >::type,
+    typename StrategyTag = typename strategy::distance::services::tag
+        <
+            Strategy
+        >::type,
+    bool Reverse = reverse_dispatch<Geometry1, Geometry2>::type::value
+>
+struct distance: not_implemented<Tag1, Tag2>
+{};
+
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DISPATCH_DISTANCE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/is_simple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_SIMPLE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_SIMPLE_HPP
+
+#include <boost/geometry/core/tag.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct is_simple
+    : not_implemented<Geometry>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_SIMPLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/dispatch/is_valid.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_VALID_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_VALID_HPP
+
+#include <boost/geometry/core/tag.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry,
+    typename Tag = typename tag<Geometry>::type,
+    // for multi-geometries: determines if empty multi-geometries are allowed
+    bool AllowEmptyMultiGeometries = true
+>
+struct is_valid
+    : not_implemented<Geometry>
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DISPATCH_IS_VALID_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/is_simple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_IS_SIMPLE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_IS_SIMPLE_HPP
+
+#include <boost/geometry/algorithms/detail/is_simple/interface.hpp>
+#include <boost/geometry/algorithms/detail/is_simple/implementation.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_IS_SIMPLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/is_valid.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_IS_VALID_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_IS_VALID_HPP
+
+#include <boost/geometry/algorithms/detail/is_valid/interface.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/implementation.hpp>
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_IS_VALID_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/num_segments.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,204 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP
+
+#include <cstddef>
+
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/times.hpp>
+
+#include <boost/range.hpp>
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/util/range.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/algorithms/detail/counting.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace num_segments
+{
+
+
+struct range_count
+{
+    template <typename Range>
+    static inline std::size_t apply(Range const& range)
+    {
+        std::size_t n = boost::size(range);
+        if ( n <= 1 )
+        {
+            return 0;
+        }
+
+        return
+            geometry::closure<Range>::value == open
+            ?
+            n
+            :
+            static_cast<std::size_t>(n - 1);
+    }
+};
+
+}} // namespace detail::num_segments
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct num_segments
+    : not_implemented<Tag>
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, point_tag>
+    : detail::counting::other_count<0>
+{};
+
+// the number of segments (1-dimensional faces) of the hypercube is
+// given by the formula: d * 2^(d-1), where d is the dimension of the
+// hypercube; see also:
+//            http://en.wikipedia.org/wiki/Hypercube
+template <typename Geometry>
+struct num_segments<Geometry, box_tag>
+    : detail::counting::other_count
+        <
+            geometry::dimension<Geometry>::value
+            * (1 << (geometry::dimension<Geometry>::value - 1))
+        >
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, segment_tag>
+    : detail::counting::other_count<1>
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, linestring_tag>
+    : detail::num_segments::range_count
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, ring_tag>
+    : detail::num_segments::range_count
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, polygon_tag>
+    : detail::counting::polygon_count<detail::num_segments::range_count>
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, multi_point_tag>
+    : detail::counting::other_count<0>
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, multi_linestring_tag>
+    : detail::counting::multi_count
+        <
+            num_segments< typename boost::range_value<Geometry>::type>
+        >
+{};
+
+template <typename Geometry>
+struct num_segments<Geometry, multi_polygon_tag>
+    : detail::counting::multi_count
+        <
+            num_segments< typename boost::range_value<Geometry>::type>
+        >
+{};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+namespace resolve_variant
+{
+
+
+template <typename Geometry>
+struct num_segments
+{
+    static inline std::size_t apply(Geometry const& geometry)
+    {
+        concept::check<Geometry const>();
+
+        return dispatch::num_segments<Geometry>::apply(geometry);
+    }
+};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct num_segments<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    struct visitor: boost::static_visitor<std::size_t>
+    {
+        template <typename Geometry>
+        inline std::size_t operator()(Geometry const& geometry) const
+        {
+            return num_segments<Geometry>::apply(geometry);
+        }
+    };
+
+    static inline std::size_t
+    apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry)
+    {
+        return boost::apply_visitor(visitor(), geometry);
+    }
+};
+
+
+} // namespace resolve_variant
+
+
+
+/*!
+\brief \brief_calc{number of segments}
+\ingroup num_segments
+\details \details_calc{num_segments, number of segments}.
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\return \return_calc{number of segments}
+
+\qbk{[include reference/algorithms/num_segments.qbk]}
+*/
+template <typename Geometry>
+inline std::size_t num_segments(Geometry const& geometry)
+{
+    return resolve_variant::num_segments<Geometry>::apply(geometry);
+}
+
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/point_on_surface.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,327 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_POINT_ON_SURFACE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_POINT_ON_SURFACE_HPP
+
+
+#include <cstddef>
+
+#include <numeric>
+
+#include <boost/concept_check.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/detail/extreme_points.hpp>
+
+#include <boost/geometry/strategies/cartesian/centroid_bashein_detmer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace point_on_surface
+{
+
+template <typename CoordinateType, int Dimension>
+struct specific_coordinate_first
+{
+    CoordinateType const m_value_to_be_first;
+
+    inline specific_coordinate_first(CoordinateType value_to_be_skipped)
+        : m_value_to_be_first(value_to_be_skipped)
+    {}
+
+    template <typename Point>
+    inline bool operator()(Point const& lhs, Point const& rhs)
+    {
+        CoordinateType const lh = geometry::get<Dimension>(lhs);
+        CoordinateType const rh = geometry::get<Dimension>(rhs);
+
+        // If both lhs and rhs equal m_value_to_be_first,
+        // we should handle conform if lh < rh = FALSE
+        // The first condition meets that, keep it first
+        if (geometry::math::equals(rh, m_value_to_be_first))
+        {
+            // Handle conform lh < -INF, which is always false
+            return false;
+        }
+
+        if (geometry::math::equals(lh, m_value_to_be_first))
+        {
+            // Handle conform -INF < rh, which is always true
+            return true;
+        }
+
+        return lh < rh;
+    }
+};
+
+template <int Dimension, typename Collection, typename Value, typename Predicate>
+inline bool max_value(Collection const& collection, Value& the_max, Predicate const& predicate)
+{
+    bool first = true;
+    for (typename Collection::const_iterator it = collection.begin(); it != collection.end(); ++it)
+    {
+        if (! it->empty())
+        {
+            Value the_value = geometry::get<Dimension>(*std::max_element(it->begin(), it->end(), predicate));
+            if (first || the_value > the_max)
+            {
+                the_max = the_value;
+                first = false;
+            }
+        }
+    }
+    return ! first;
+}
+
+
+template <int Dimension, typename Value>
+struct select_below
+{
+    Value m_value;
+    inline select_below(Value const& v)
+        : m_value(v)
+    {}
+
+    template <typename Intruder>
+    inline bool operator()(Intruder const& intruder) const
+    {
+        if (intruder.empty())
+        {
+            return true;
+        }
+        Value max = geometry::get<Dimension>(*std::max_element(intruder.begin(), intruder.end(), detail::extreme_points::compare<Dimension>()));
+        return geometry::math::equals(max, m_value) || max < m_value;
+    }
+};
+
+template <int Dimension, typename Value>
+struct adapt_base
+{
+    Value m_value;
+    inline adapt_base(Value const& v)
+        : m_value(v)
+    {}
+
+    template <typename Intruder>
+    inline void operator()(Intruder& intruder) const
+    {
+        if (intruder.size() >= 3)
+        {
+            detail::extreme_points::move_along_vector<Dimension>(intruder, m_value);
+        }
+    }
+};
+
+template <int Dimension, typename Value>
+struct min_of_intruder
+{
+    template <typename Intruder>
+    inline bool operator()(Intruder const& lhs, Intruder const& rhs) const
+    {
+        Value lhs_min = geometry::get<Dimension>(*std::min_element(lhs.begin(), lhs.end(), detail::extreme_points::compare<Dimension>()));
+        Value rhs_min = geometry::get<Dimension>(*std::min_element(rhs.begin(), rhs.end(), detail::extreme_points::compare<Dimension>()));
+        return lhs_min < rhs_min;
+    }
+};
+
+
+template <typename Point, typename P>
+inline void calculate_average(Point& point, std::vector<P> const& points)
+{
+    typedef typename geometry::coordinate_type<Point>::type coordinate_type;
+    typedef typename std::vector<P>::const_iterator iterator_type;
+    typedef typename std::vector<P>::size_type size_type;
+
+    coordinate_type x = 0;
+    coordinate_type y = 0;
+
+    iterator_type end = points.end();
+    for ( iterator_type it = points.begin() ; it != end ; ++it)
+    {
+        x += geometry::get<0>(*it);
+        y += geometry::get<1>(*it);
+    }
+
+    size_type const count = points.size();
+    geometry::set<0>(point, x / count);
+    geometry::set<1>(point, y / count);
+}
+
+
+template <int Dimension, typename Extremes, typename Intruders, typename CoordinateType>
+inline void replace_extremes_for_self_tangencies(Extremes& extremes, Intruders& intruders, CoordinateType const& max_intruder)
+{
+    // This function handles self-tangencies.
+    // Self-tangencies use, as usual, the major part of code...
+
+    //        ___ e
+    //       /|\ \                                                            .
+    //      / | \ \                                                           .
+    //     /  |  \ \                                                          .
+    //    /   |   \ \                                                         .
+    //   / /\ |    \ \                                                        .
+    //     i2    i1
+
+    // The picture above shows the extreme (outside, "e") and two intruders ("i1","i2")
+    // Assume that "i1" is self-tangent with the extreme, in one point at the top
+    // Now the "penultimate" value is searched, this is is the top of i2
+    // Then everything including and below (this is "i2" here) is removed
+    // Then the base of "i1" and of "e" is adapted to this penultimate value
+    // It then looks like:
+
+    //      b ___ e
+    //       /|\ \                                                            .
+    //      / | \ \                                                           .
+    //     /  |  \ \                                                          .
+    //    /   |   \ \                                                         .
+    //   a    c i1
+
+    // Then intruders (here "i1" but there may be more) are sorted from left to right
+    // Finally points "a","b" and "c" (in this order) are selected as a new triangle.
+    // This triangle will have a centroid which is inside (assumed that intruders left segment
+    // is not equal to extremes left segment, but that polygon would be invalid)
+
+    // Find highest non-self tangent intrusion, if any
+    CoordinateType penultimate_value;
+    specific_coordinate_first<CoordinateType, Dimension> pu_compare(max_intruder);
+    if (max_value<Dimension>(intruders, penultimate_value, pu_compare))
+    {
+        // Throw away all intrusions <= this value, and of the kept one set this as base.
+        select_below<Dimension, CoordinateType> predicate(penultimate_value);
+        intruders.erase
+            (
+                std::remove_if(boost::begin(intruders), boost::end(intruders), predicate),
+                boost::end(intruders)
+            );
+        adapt_base<Dimension, CoordinateType> fe_predicate(penultimate_value);
+        // Sort from left to right (or bottom to top if Dimension=0)
+        std::for_each(boost::begin(intruders), boost::end(intruders), fe_predicate);
+
+        // Also adapt base of extremes
+        detail::extreme_points::move_along_vector<Dimension>(extremes, penultimate_value);
+    }
+    // Then sort in 1-Dim. Take first to calc centroid.
+    std::sort(boost::begin(intruders), boost::end(intruders), min_of_intruder<1 - Dimension, CoordinateType>());
+
+    Extremes triangle;
+    triangle.reserve(3);
+
+    // Make a triangle of first two points of extremes (the ramp, from left to right), and last point of first intruder (which goes from right to left)
+    std::copy(extremes.begin(), extremes.begin() + 2, std::back_inserter(triangle));
+    triangle.push_back(intruders.front().back());
+
+    // (alternatively we could use the last two points of extremes, and first point of last intruder...):
+    //// ALTERNATIVE: std::copy(extremes.rbegin(), extremes.rbegin() + 2, std::back_inserter(triangle));
+    //// ALTERNATIVE: triangle.push_back(intruders.back().front());
+
+    // Now replace extremes with this smaller subset, a triangle, such that centroid calculation will result in a point inside
+    extremes = triangle;
+}
+
+template <int Dimension, typename Geometry, typename Point>
+inline bool calculate_point_on_surface(Geometry const& geometry, Point& point)
+{
+    typedef typename geometry::point_type<Geometry>::type point_type;
+    typedef typename geometry::coordinate_type<Geometry>::type coordinate_type;
+    std::vector<point_type> extremes;
+
+    typedef std::vector<std::vector<point_type> > intruders_type;
+    intruders_type intruders;
+    geometry::extreme_points<Dimension>(geometry, extremes, intruders);
+
+    if (extremes.size() < 3)
+    {
+        return false;
+    }
+
+    // If there are intruders, find the max.
+    if (! intruders.empty())
+    {
+        coordinate_type max_intruder;
+        detail::extreme_points::compare<Dimension> compare;
+        if (max_value<Dimension>(intruders, max_intruder, compare))
+        {
+            coordinate_type max_extreme = geometry::get<Dimension>(*std::max_element(extremes.begin(), extremes.end(), detail::extreme_points::compare<Dimension>()));
+            if (max_extreme > max_intruder)
+            {
+                detail::extreme_points::move_along_vector<Dimension>(extremes, max_intruder);
+            }
+            else
+            {
+                replace_extremes_for_self_tangencies<Dimension>(extremes, intruders, max_intruder);
+            }
+        }
+    }
+
+    // Now calculate the average/centroid of the (possibly adapted) extremes
+    calculate_average(point, extremes);
+
+    return true;
+}
+
+}} // namespace detail::point_on_surface
+#endif // DOXYGEN_NO_DETAIL
+
+
+/*!
+\brief Assigns a Point guaranteed to lie on the surface of the Geometry
+\tparam Geometry geometry type. This also defines the type of the output point
+\param geometry Geometry to take point from
+\param point Point to assign
+ */
+template <typename Geometry, typename Point>
+inline void point_on_surface(Geometry const& geometry, Point & point)
+{
+    concept::check<Point>();
+    concept::check<Geometry const>();
+
+    // First try in Y-direction (which should always succeed for valid polygons)
+    if (! detail::point_on_surface::calculate_point_on_surface<1>(geometry, point))
+    {
+        // For invalid polygons, we might try X-direction
+        detail::point_on_surface::calculate_point_on_surface<0>(geometry, point);
+    }
+}
+
+/*!
+\brief Returns point guaranteed to lie on the surface of the Geometry
+\tparam Geometry geometry type. This also defines the type of the output point
+\param geometry Geometry to take point from
+\return The Point guaranteed to lie on the surface of the Geometry
+ */
+template<typename Geometry>
+inline typename geometry::point_type<Geometry>::type
+return_point_on_surface(Geometry const& geometry)
+{
+    typename geometry::point_type<Geometry>::type result;
+    geometry::point_on_surface(geometry, result);
+    return result;
+}
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_POINT_ON_SURFACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/remove_spikes.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,285 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_REMOVE_SPIKES_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_REMOVE_SPIKES_HPP
+
+#include <deque>
+
+#include <boost/range.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/static_visitor.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/point_order.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/geometries/concepts/check.hpp>
+
+#include <boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp>
+#include <boost/geometry/algorithms/detail/interior_iterator.hpp>
+#include <boost/geometry/algorithms/clear.hpp>
+
+#include <boost/geometry/util/condition.hpp>
+
+
+/*
+Remove spikes from a ring/polygon.
+Ring (having 8 vertices, including closing vertex)
++------+
+|      |
+|      +--+
+|      |  ^this "spike" is removed, can be located outside/inside the ring
++------+
+(the actualy determination if it is removed is done by a strategy)
+
+*/
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace remove_spikes
+{
+
+
+template <typename Range>
+struct range_remove_spikes
+{
+    typedef typename strategy::side::services::default_strategy
+    <
+        typename cs_tag<Range>::type
+    >::type side_strategy;
+
+    typedef typename coordinate_type<Range>::type coordinate_type;
+    typedef typename point_type<Range>::type point_type;
+
+
+    static inline void apply(Range& range)
+    {
+        std::size_t n = boost::size(range);
+        std::size_t const min_num_points = core_detail::closure::minimum_ring_size
+            <
+                geometry::closure<Range>::value
+            >::value - 1; // subtract one: a polygon with only one spike should result into one point
+        if (n < min_num_points)
+        {
+            return;
+        }
+
+        std::deque<point_type> cleaned;
+        for (typename boost::range_iterator<Range const>::type it = boost::begin(range);
+            it != boost::end(range); ++it)
+        {
+            // Add point
+            cleaned.push_back(*it);
+
+            while(cleaned.size() >= 3
+                    && detail::point_is_spike_or_equal(cleaned.back(), *(cleaned.end() - 3), *(cleaned.end() - 2)))
+            {
+                // Remove pen-ultimate point causing the spike (or which was equal)
+                cleaned.erase(cleaned.end() - 2);
+            }
+        }
+
+        // For a closed-polygon, remove closing point, this makes checking first point(s) easier and consistent
+        if ( BOOST_GEOMETRY_CONDITION(geometry::closure<Range>::value == geometry::closed) )
+        {
+            cleaned.pop_back();
+        }
+
+        bool found = false;
+        do
+        {
+            found = false;
+            // Check for spike in first point
+            int const penultimate = 2;
+            while(cleaned.size() >= 3 && detail::point_is_spike_or_equal(cleaned.front(), *(cleaned.end() - penultimate), cleaned.back()))
+            {
+                cleaned.pop_back();
+                found = true;
+            }
+            // Check for spike in second point
+            while(cleaned.size() >= 3 && detail::point_is_spike_or_equal(*(cleaned.begin() + 1), cleaned.back(), cleaned.front()))
+            {
+                cleaned.pop_front();
+                found = true;
+            }
+        }
+        while (found);
+
+        if (cleaned.size() == 2)
+        {
+            // Ticket #9871: open polygon with only two points.
+            // the second point forms, by definition, a spike
+            cleaned.pop_back();
+        }
+
+        // Close if necessary
+        if ( BOOST_GEOMETRY_CONDITION(geometry::closure<Range>::value == geometry::closed) )
+        {
+            cleaned.push_back(cleaned.front());
+        }
+
+        // Copy output
+        geometry::clear(range);
+        std::copy(cleaned.begin(), cleaned.end(), std::back_inserter(range));
+    }
+};
+
+
+template <typename Polygon>
+struct polygon_remove_spikes
+{
+    static inline void apply(Polygon& polygon)
+    {
+        typedef typename geometry::ring_type<Polygon>::type ring_type;
+
+        typedef range_remove_spikes<ring_type> per_range;
+        per_range::apply(exterior_ring(polygon));
+
+        typename interior_return_type<Polygon>::type
+            rings = interior_rings(polygon);
+
+        for (typename detail::interior_iterator<Polygon>::type
+                it = boost::begin(rings); it != boost::end(rings); ++it)
+        {
+            per_range::apply(*it);
+        }
+    }
+};
+
+
+template <typename MultiGeometry, typename SingleVersion>
+struct multi_remove_spikes
+{
+    static inline void apply(MultiGeometry& multi)
+    {
+        for (typename boost::range_iterator<MultiGeometry>::type
+                it = boost::begin(multi);
+            it != boost::end(multi);
+            ++it)
+        {
+            SingleVersion::apply(*it);
+        }
+    }
+};
+
+
+}} // namespace detail::remove_spikes
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+template
+<
+    typename Geometry,
+    typename Tag = typename tag<Geometry>::type
+>
+struct remove_spikes
+{
+    static inline void apply(Geometry&)
+    {}
+};
+
+
+template <typename Ring>
+struct remove_spikes<Ring, ring_tag>
+    : detail::remove_spikes::range_remove_spikes<Ring>
+{};
+
+
+
+template <typename Polygon>
+struct remove_spikes<Polygon, polygon_tag>
+    : detail::remove_spikes::polygon_remove_spikes<Polygon>
+{};
+
+
+template <typename MultiPolygon>
+struct remove_spikes<MultiPolygon, multi_polygon_tag>
+    : detail::remove_spikes::multi_remove_spikes
+        <
+            MultiPolygon,
+            detail::remove_spikes::polygon_remove_spikes
+            <
+                typename boost::range_value<MultiPolygon>::type
+            >
+        >
+{};
+
+
+} // namespace dispatch
+#endif
+
+
+namespace resolve_variant {
+
+template <typename Geometry>
+struct remove_spikes
+{
+    static void apply(Geometry& geometry)
+    {
+        concept::check<Geometry>();
+        dispatch::remove_spikes<Geometry>::apply(geometry);
+    }
+};
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+struct remove_spikes<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
+{
+    struct visitor: boost::static_visitor<void>
+    {
+        template <typename Geometry>
+        void operator()(Geometry& geometry) const
+        {
+            remove_spikes<Geometry>::apply(geometry);
+        }
+    };
+
+    static inline void apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& geometry)
+    {
+        boost::apply_visitor(visitor(), geometry);
+    }
+};
+
+} // namespace resolve_variant
+
+
+/*!
+    \ingroup remove_spikes
+    \tparam Geometry geometry type
+    \param geometry the geometry to make remove_spikes
+*/
+template <typename Geometry>
+inline void remove_spikes(Geometry& geometry)
+{
+    resolve_variant::remove_spikes<Geometry>::apply(geometry);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_REMOVE_SPIKES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/algorithms/validity_failure_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_VALIDITY_FAILURE_TYPE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_VALIDITY_FAILURE_TYPE_HPP
+
+
+namespace boost { namespace geometry
+{
+
+
+/*!
+\brief Enumerates the possible validity failure types for a geometry
+\ingroup enum
+\details The enumeration validity_failure_type enumerates the possible
+    reasons for which a geometry may be found as invalid by the
+    is_valid algorithm.
+    Besides the values that indicate invalidity, there is an
+    additional value (no_failure) that indicates validity.
+
+\qbk{
+[heading See also]
+[link geometry.reference.algorithms.is_valid The is_valid
+algorithm taking a reference to validity_failure_type as second argument]
+}
+*/
+enum validity_failure_type
+{
+    /// The geometry is valid
+    ///
+    no_failure = 0,
+    /// The geometry has a very small number of points, e.g., less
+    /// than 2 for linestrings, less than 3 for open rings, a closed
+    /// multi-polygon that contains a polygon with less than 4 points, etc.
+    /// (applies to linestrings, rings, polygons, multi-linestrings
+    /// and multi-polygons)
+    failure_few_points = 10,
+    /// The topological dimension of the geometry is smaller than its
+    /// dimension, e.g., a linestring with 3 identical points, an open
+    /// polygon with an interior ring consisting of 3 collinear points, etc.
+    /// (applies to linear and areal geometries, including segments
+    /// and boxes)
+    failure_wrong_topological_dimension = 11,
+    /// The geometry contains spikes
+    /// (applies to linear and areal geometries)
+    failure_spikes = 12,
+    /// The geometry has (consecutive) duplicate points
+    /// (applies to areal geometries only)
+    failure_duplicate_points = 13,
+    /// The geometry is defined as closed, the starting/ending points
+    /// are not equal
+    /// (applies to areal geometries only)
+    failure_not_closed = 20, // for areal geometries
+    /// The geometry has invalid self-intersections.
+    /// (applies to areal geometries only)
+    failure_self_intersections = 21, // for areal geometries
+    /// The actual orientation of the geometry is different from the one defined
+    /// (applies to areal geometries only)
+    failure_wrong_orientation = 22, // for areal geometries
+    /// The geometry contains interior rings that lie outside the exterior ring
+    /// (applies to polygons and multi-polygons only)
+    failure_interior_rings_outside = 30, // for (multi-)polygons
+    /// The geometry has nested interior rings
+    /// (applies to polygons and multi-polygons only)
+    failure_nested_interior_rings = 31, // for (multi-)polygons
+    /// The interior of the geometry is disconnected
+    /// (applies to polygons and multi-polygons only)
+    failure_disconnected_interior = 32, // for (multi-)polygons
+    /// The multi-polygon contains polygons whose interiors are not disjoint
+    /// (applies to multi-polygons only)
+    failure_intersecting_interiors = 40, // for multi-polygons
+    /// The top-right corner of the box is lexicographically smaller
+    /// than its bottom-left corner
+    /// (applies to boxes only)
+    failure_wrong_corner_order = 50 // for boxes
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_VALIDITY_FAILURE_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/core/radius.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,250 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_CORE_RADIUS_HPP
+#define BOOST_GEOMETRY_CORE_RADIUS_HPP
+
+
+#include <cstddef>
+
+#include <boost/static_assert.hpp>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/util/bare_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace traits
+{
+
+/*!
+    \brief Traits class to get/set radius of a circle/sphere/(ellipse)
+    \details the radius access meta-functions give read/write access to the radius of a circle or a sphere,
+    or to the major/minor axis or an ellipse, or to one of the 3 equatorial radii of an ellipsoid.
+
+    It should be specialized per geometry, in namespace core_dispatch. Those specializations should
+    forward the call via traits to the geometry class, which could be specified by the user.
+
+    There is a corresponding generic radius_get and radius_set function
+    \par Geometries:
+        - n-sphere (circle,sphere)
+        - upcoming ellipse
+    \par Specializations should provide:
+        - inline static T get(Geometry const& geometry)
+        - inline static void set(Geometry& geometry, T const& radius)
+    \ingroup traits
+*/
+template <typename Geometry, std::size_t Dimension>
+struct radius_access {};
+
+
+/*!
+    \brief Traits class indicating the type (double,float,...) of the radius of a circle or a sphere
+    \par Geometries:
+        - n-sphere (circle,sphere)
+        - upcoming ellipse
+    \par Specializations should provide:
+        - typedef T type (double,float,int,etc)
+    \ingroup traits
+*/
+template <typename Geometry>
+struct radius_type {};
+
+} // namespace traits
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace core_dispatch
+{
+
+template <typename Tag, typename Geometry>
+struct radius_type
+{
+    //typedef core_dispatch_specialization_required type;
+};
+
+/*!
+    \brief radius access meta-functions, used by concept n-sphere and upcoming ellipse.
+*/
+template <typename Tag,
+          typename Geometry,
+          std::size_t Dimension,
+          typename IsPointer>
+struct radius_access
+{
+    //static inline CoordinateType get(Geometry const& ) {}
+    //static inline void set(Geometry& g, CoordinateType const& value) {}
+};
+
+} // namespace core_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+/*!
+    \brief Metafunction to get the type of radius of a circle / sphere / ellipse / etc.
+    \ingroup access
+    \tparam Geometry the type of geometry
+*/
+template <typename Geometry>
+struct radius_type
+{
+    typedef typename core_dispatch::radius_type
+                        <
+                            typename tag<Geometry>::type,
+                            typename util::bare_type<Geometry>::type
+                        >::type type;
+};
+
+/*!
+    \brief Function to get radius of a circle / sphere / ellipse / etc.
+    \return radius The radius for a given axis
+    \ingroup access
+    \param geometry the geometry to get the radius from
+    \tparam I index of the axis
+*/
+template <std::size_t I, typename Geometry>
+inline typename radius_type<Geometry>::type get_radius(Geometry const& geometry)
+{
+    return core_dispatch::radius_access
+            <
+                typename tag<Geometry>::type,
+                typename util::bare_type<Geometry>::type,
+                I,
+                typename boost::is_pointer<Geometry>::type
+            >::get(geometry);
+}
+
+/*!
+    \brief Function to set the radius of a circle / sphere / ellipse / etc.
+    \ingroup access
+    \tparam I index of the axis
+    \param geometry the geometry to change
+    \param radius the radius to set
+*/
+template <std::size_t I, typename Geometry>
+inline void set_radius(Geometry& geometry,
+                       typename radius_type<Geometry>::type const& radius)
+{
+    core_dispatch::radius_access
+        <
+            typename tag<Geometry>::type,
+            typename util::bare_type<Geometry>::type,
+            I,
+            typename boost::is_pointer<Geometry>::type
+        >::set(geometry, radius);
+}
+
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename Tag, typename Geometry, std::size_t Dimension>
+struct radius_access
+{
+    static inline typename radius_type<Geometry>::type get(Geometry const& geometry)
+    {
+        return traits::radius_access<Geometry, Dimension>::get(geometry);
+    }
+    static inline void set(Geometry& geometry,
+                           typename radius_type<Geometry>::type const& value)
+    {
+        traits::radius_access<Geometry, Dimension>::set(geometry, value);
+    }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace core_dispatch
+{
+
+template <typename Tag,
+          typename Geometry,
+          std::size_t Dimension>
+struct radius_access<Tag, Geometry, Dimension, boost::true_type>
+{
+    typedef typename geometry::radius_type<Geometry>::type radius_type;
+
+    static inline radius_type get(const Geometry * geometry)
+    {
+        return radius_access
+                <
+                    Tag,
+                    Geometry,
+                    Dimension,
+                    typename boost::is_pointer<Geometry>::type
+                >::get(*geometry);
+    }
+
+    static inline void set(Geometry * geometry, radius_type const& value)
+    {
+        return radius_access
+                <
+                    Tag,
+                    Geometry,
+                    Dimension,
+                    typename boost::is_pointer<Geometry>::type
+                >::set(*geometry, value);
+    }
+};
+
+
+template <typename Geometry>
+struct radius_type<srs_sphere_tag, Geometry>
+{
+    typedef typename traits::radius_type<Geometry>::type type;
+};
+
+template <typename Geometry, std::size_t Dimension>
+struct radius_access<srs_sphere_tag, Geometry, Dimension, boost::false_type>
+    : detail::radius_access<srs_sphere_tag, Geometry, Dimension>
+{
+    BOOST_STATIC_ASSERT(Dimension == 0);
+    //BOOST_STATIC_ASSERT(Dimension < 3);
+};
+
+template <typename Geometry>
+struct radius_type<srs_spheroid_tag, Geometry>
+{
+    typedef typename traits::radius_type<Geometry>::type type;
+};
+
+template <typename Geometry, std::size_t Dimension>
+struct radius_access<srs_spheroid_tag, Geometry, Dimension, boost::false_type>
+    : detail::radius_access<srs_spheroid_tag, Geometry, Dimension>
+{
+    BOOST_STATIC_ASSERT(Dimension == 0 || Dimension == 2);
+    //BOOST_STATIC_ASSERT(Dimension < 3);
+};
+
+} // namespace core_dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_CORE_RADIUS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/core/srs.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,195 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_CORE_SRS_HPP
+#define BOOST_GEOMETRY_CORE_SRS_HPP
+
+
+#include <cstddef>
+
+#include <boost/static_assert.hpp>
+
+#include <boost/geometry/core/radius.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+
+namespace boost { namespace geometry
+{
+    
+namespace srs
+{
+
+/*!
+    \brief Defines spheroid radius values for use in geographical CS calculations
+    \note See http://en.wikipedia.org/wiki/Figure_of_the_Earth
+          and http://en.wikipedia.org/wiki/World_Geodetic_System#A_new_World_Geodetic_System:_WGS84
+*/
+template <typename RadiusType>
+class spheroid
+{
+public:
+    spheroid(RadiusType const& a, RadiusType const& b)
+        : m_a(a)
+        , m_b(b)
+    {}
+
+    spheroid()
+        : m_a(RadiusType(6378137.0))
+        , m_b(RadiusType(6356752.314245))
+    {}
+
+    template <std::size_t I>
+    RadiusType get_radius() const
+    {
+        BOOST_STATIC_ASSERT(I < 3);
+
+        return I < 2 ? m_a : m_b;
+    }
+
+    template <std::size_t I>
+    void set_radius(RadiusType const& radius)
+    {
+        BOOST_STATIC_ASSERT(I < 3);
+
+        (I < 2 ? m_a : m_b) = radius;
+    }
+
+private:
+    RadiusType m_a, m_b; // equatorial radius, polar radius
+};
+
+} // namespace srs
+
+// Traits specializations for spheroid
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template <typename RadiusType>
+struct tag< srs::spheroid<RadiusType> >
+{
+    typedef srs_spheroid_tag type;
+};
+
+template <typename RadiusType>
+struct radius_type< srs::spheroid<RadiusType> >
+{
+    typedef RadiusType type;
+};
+
+template <typename RadiusType, std::size_t Dimension>
+struct radius_access<srs::spheroid<RadiusType>, Dimension>
+{
+    typedef srs::spheroid<RadiusType> spheroid_type;
+
+    static inline RadiusType get(spheroid_type const& s)
+    {
+        return s.template get_radius<Dimension>();
+    }
+
+    static inline void set(spheroid_type& s, RadiusType const& value)
+    {
+        s.template set_radius<Dimension>(value);
+    }
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+
+namespace srs
+{
+
+/*!
+    \brief Defines sphere radius value for use in spherical CS calculations
+*/
+template <typename RadiusType>
+class sphere
+{
+public:
+    explicit sphere(RadiusType const& r)
+        : m_r(r)
+    {}
+    sphere()
+        : m_r(RadiusType((2.0 * 6378137.0 + 6356752.314245) / 3.0))
+    {}
+
+    template <std::size_t I>
+    RadiusType get_radius() const
+    {
+        BOOST_STATIC_ASSERT(I < 3);
+
+        return m_r;
+    }
+
+    template <std::size_t I>
+    void set_radius(RadiusType const& radius)
+    {
+        BOOST_STATIC_ASSERT(I < 3);
+
+        m_r = radius;
+    }
+
+private:
+    RadiusType m_r; // radius
+};
+
+} // namespace srs
+
+// Traits specializations for sphere
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template <typename RadiusType>
+struct tag< srs::sphere<RadiusType> >
+{
+    typedef srs_sphere_tag type;
+};
+
+template <typename RadiusType>
+struct radius_type< srs::sphere<RadiusType> >
+{
+    typedef RadiusType type;
+};
+
+template <typename RadiusType, std::size_t Dimension>
+struct radius_access<srs::sphere<RadiusType>, Dimension>
+{
+    typedef srs::sphere<RadiusType> sphere_type;
+
+    static inline RadiusType get(sphere_type const& s)
+    {
+        return s.template get_radius<Dimension>();
+    }
+
+    static inline void set(sphere_type& s, RadiusType const& value)
+    {
+        s.template set_radius<Dimension>(value);
+    }
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_CORE_SRS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_linestring_concept.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,91 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_LINESTRING_CONCEPT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_LINESTRING_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+#include <boost/range/metafunctions.hpp>
+
+
+#include <boost/geometry/geometries/concepts/linestring_concept.hpp>
+
+
+namespace boost { namespace geometry { namespace concept
+{
+
+
+/*!
+\brief multi-linestring concept
+\ingroup concepts
+\par Formal definition:
+The multi linestring concept is defined as following:
+- there must be a specialization of traits::tag defining multi_linestring_tag as
+  type
+- it must behave like a Boost.Range
+- its range value must fulfil the Linestring concept
+
+*/
+template <typename Geometry>
+class MultiLinestring
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type linestring_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::Linestring<linestring_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(MultiLinestring)
+    {
+        Geometry* mls = 0;
+        traits::clear<Geometry>::apply(*mls);
+        traits::resize<Geometry>::apply(*mls, 0);
+        linestring_type* ls = 0;
+        traits::push_back<Geometry>::apply(*mls, *ls);
+    }
+#endif
+};
+
+
+/*!
+\brief concept for multi-linestring (const version)
+\ingroup const_concepts
+*/
+template <typename Geometry>
+class ConstMultiLinestring
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type linestring_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::ConstLinestring<linestring_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(ConstMultiLinestring)
+    {
+    }
+#endif
+};
+
+}}} // namespace boost::geometry::concept
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_LINESTRING_CONCEPT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_point_concept.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+#include <boost/range/metafunctions.hpp>
+
+
+#include <boost/geometry/geometries/concepts/point_concept.hpp>
+
+
+namespace boost { namespace geometry { namespace concept
+{
+
+
+/*!
+\brief MultiPoint concept
+\ingroup concepts
+\par Formal definition:
+The multi point concept is defined as following:
+- there must be a specialization of traits::tag defining multi_point_tag as type
+- it must behave like a Boost.Range
+- its range value must fulfil the Point concept
+
+*/
+template <typename Geometry>
+class MultiPoint
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type point_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::Point<point_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(MultiPoint)
+    {
+        Geometry* mp = 0;
+        traits::clear<Geometry>::apply(*mp);
+        traits::resize<Geometry>::apply(*mp, 0);
+        point_type* point = 0;
+        traits::push_back<Geometry>::apply(*mp, *point);
+    }
+#endif
+};
+
+
+/*!
+\brief concept for multi-point (const version)
+\ingroup const_concepts
+*/
+template <typename Geometry>
+class ConstMultiPoint
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type point_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::ConstPoint<point_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(ConstMultiPoint)
+    {
+    }
+#endif
+};
+
+}}} // namespace boost::geometry::concept
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/concepts/multi_polygon_concept.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,91 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POLYGON_CONCEPT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POLYGON_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/geometry/geometries/concepts/polygon_concept.hpp>
+
+
+namespace boost { namespace geometry { namespace concept
+{
+
+
+/*!
+\brief multi-polygon concept
+\ingroup concepts
+\par Formal definition:
+The multi polygon concept is defined as following:
+- there must be a specialization of traits::tag defining multi_polygon_tag
+  as type
+- it must behave like a Boost.Range
+- its range value must fulfil the Polygon concept
+
+*/
+template <typename Geometry>
+class MultiPolygon
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type polygon_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::Polygon<polygon_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(MultiPolygon)
+    {
+        Geometry* mp = 0;
+        traits::clear<Geometry>::apply(*mp);
+        traits::resize<Geometry>::apply(*mp, 0);
+        polygon_type* poly = 0;
+        traits::push_back<Geometry>::apply(*mp, *poly);
+    }
+#endif
+};
+
+
+/*!
+\brief concept for multi-polygon (const version)
+\ingroup const_concepts
+*/
+template <typename Geometry>
+class ConstMultiPolygon
+{
+#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
+    typedef typename boost::range_value<Geometry>::type polygon_type;
+
+    BOOST_CONCEPT_ASSERT( (concept::ConstPolygon<polygon_type>) );
+    BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) );
+
+
+public :
+
+    BOOST_CONCEPT_USAGE(ConstMultiPolygon)
+    {
+    }
+#endif
+};
+
+
+}}} // namespace boost::geometry::concept
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POLYGON_CONCEPT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/multi_linestring.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,120 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_MULTI_LINESTRING_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_MULTI_LINESTRING_HPP
+
+#include <memory>
+#include <vector>
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/geometries/concepts/linestring_concept.hpp>
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+#include <boost/config.hpp>
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#include <initializer_list>
+#endif
+#endif
+
+namespace boost { namespace geometry
+{
+
+
+namespace model
+{
+
+/*!
+\brief multi_line, a collection of linestring
+\details Multi-linestring can be used to group lines belonging to each other,
+        e.g. a highway (with interruptions)
+\ingroup geometries
+
+\qbk{before.synopsis,
+[heading Model of]
+[link geometry.reference.concepts.concept_multi_linestring MultiLineString Concept]
+}
+*/
+template
+<
+    typename LineString,
+    template<typename, typename> class Container = std::vector,
+    template<typename> class Allocator = std::allocator
+>
+class multi_linestring : public Container<LineString, Allocator<LineString> >
+{
+    BOOST_CONCEPT_ASSERT( (concept::Linestring<LineString>) );
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+
+    typedef Container<LineString, Allocator<LineString> > base_type;
+
+public:
+    /// \constructor_default{multi_linestring}
+    multi_linestring()
+        : base_type()
+    {}
+
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+
+    /// \constructor_initializer_list{multi_linestring}
+    inline multi_linestring(std::initializer_list<LineString> l)
+        : base_type(l.begin(), l.end())
+    {}
+
+// Commented out for now in order to support Boost.Assign
+// Without this assignment operator first the object should be created
+//   from initializer list, then it shoudl be moved.
+//// Without this workaround in MSVC the assignment operator is ambiguous
+//#ifndef BOOST_MSVC
+//    /// \assignment_initializer_list{multi_linestring}
+//    inline multi_linestring & operator=(std::initializer_list<LineString> l)
+//    {
+//        base_type::assign(l.begin(), l.end());
+//        return *this;
+//    }
+//#endif
+
+#endif
+#endif
+};
+
+
+} // namespace model
+
+
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template
+<
+    typename LineString,
+    template<typename, typename> class Container,
+    template<typename> class Allocator
+>
+struct tag< model::multi_linestring<LineString, Container, Allocator> >
+{
+    typedef multi_linestring_tag type;
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_MULTI_LINESTRING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/multi_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,125 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_MULTI_POINT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_MULTI_POINT_HPP
+
+#include <memory>
+#include <vector>
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/geometries/concepts/point_concept.hpp>
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+#include <boost/config.hpp>
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#include <initializer_list>
+#endif
+#endif
+
+namespace boost { namespace geometry
+{
+
+namespace model
+{
+
+
+/*!
+\brief multi_point, a collection of points
+\ingroup geometries
+\tparam Point \tparam_point
+\tparam Container \tparam_container
+\tparam Allocator \tparam_allocator
+\details Multipoint can be used to group points belonging to each other,
+        e.g. a constellation, or the result set of an intersection
+\qbk{before.synopsis,
+[heading Model of]
+[link geometry.reference.concepts.concept_multi_point MultiPoint Concept]
+}
+*/
+template
+<
+    typename Point,
+    template<typename, typename> class Container = std::vector,
+    template<typename> class Allocator = std::allocator
+>
+class multi_point : public Container<Point, Allocator<Point> >
+{
+    BOOST_CONCEPT_ASSERT( (concept::Point<Point>) );
+
+    typedef Container<Point, Allocator<Point> > base_type;
+
+public :
+    /// \constructor_default{multi_point}
+    inline multi_point()
+        : base_type()
+    {}
+
+    /// \constructor_begin_end{multi_point}
+    template <typename Iterator>
+    inline multi_point(Iterator begin, Iterator end)
+        : base_type(begin, end)
+    {}
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+
+    /// \constructor_initializer_list{multi_point}
+    inline multi_point(std::initializer_list<Point> l)
+        : base_type(l.begin(), l.end())
+    {}
+
+// Commented out for now in order to support Boost.Assign
+// Without this assignment operator first the object should be created
+//   from initializer list, then it shoudl be moved.
+//// Without this workaround in MSVC the assignment operator is ambiguous
+//#ifndef BOOST_MSVC
+//    /// \assignment_initializer_list{multi_point}
+//    inline multi_point & operator=(std::initializer_list<Point> l)
+//    {
+//        base_type::assign(l.begin(), l.end());
+//        return *this;
+//    }
+//#endif
+
+#endif
+#endif
+};
+
+} // namespace model
+
+
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template
+<
+    typename Point,
+    template<typename, typename> class Container,
+    template<typename> class Allocator
+>
+struct tag< model::multi_point<Point, Container, Allocator> >
+{
+    typedef multi_point_tag type;
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_MULTI_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/multi_polygon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,118 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_MULTI_POLYGON_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_MULTI_POLYGON_HPP
+
+#include <memory>
+#include <vector>
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/geometries/concepts/polygon_concept.hpp>
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+#include <boost/config.hpp>
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#include <initializer_list>
+#endif
+#endif
+
+namespace boost { namespace geometry
+{
+
+namespace model
+{
+
+/*!
+\brief multi_polygon, a collection of polygons
+\details Multi-polygon can be used to group polygons belonging to each other,
+        e.g. Hawaii
+\ingroup geometries
+
+\qbk{before.synopsis,
+[heading Model of]
+[link geometry.reference.concepts.concept_multi_polygon MultiPolygon Concept]
+}
+*/
+template
+<
+    typename Polygon,
+    template<typename, typename> class Container = std::vector,
+    template<typename> class Allocator = std::allocator
+>
+class multi_polygon : public Container<Polygon, Allocator<Polygon> >
+{
+    BOOST_CONCEPT_ASSERT( (concept::Polygon<Polygon>) );
+
+#ifdef BOOST_GEOMETRY_EXPERIMENTAL_ENABLE_INITIALIZER_LIST
+
+    typedef Container<Polygon, Allocator<Polygon> > base_type;
+
+public:
+    /// \constructor_default{multi_polygon}
+    multi_polygon()
+        : base_type()
+    {}
+
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+
+    /// \constructor_initializer_list{multi_polygon}
+    inline multi_polygon(std::initializer_list<Polygon> l)
+        : base_type(l.begin(), l.end())
+    {}
+
+// Commented out for now in order to support Boost.Assign
+// Without this assignment operator first the object should be created
+//   from initializer list, then it shoudl be moved.
+//// Without this workaround in MSVC the assignment operator is ambiguous
+//#ifndef BOOST_MSVC
+//    /// \assignment_initializer_list{multi_polygon}
+//    inline multi_polygon & operator=(std::initializer_list<Polygon> l)
+//    {
+//        base_type::assign(l.begin(), l.end());
+//        return *this;
+//    }
+//#endif
+
+#endif
+#endif
+};
+
+
+} // namespace model
+
+
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template
+<
+    typename Polygon,
+    template<typename, typename> class Container,
+    template<typename> class Allocator
+>
+struct tag< model::multi_polygon<Polygon, Container, Allocator> >
+{
+    typedef multi_polygon_tag type;
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_MULTI_POLYGON_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/pointing_segment.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,143 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_POINTING_SEGMENT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_POINTING_SEGMENT_HPP
+
+#include <cstddef>
+
+#include <boost/assert.hpp>
+#include <boost/concept/assert.hpp>
+#include <boost/core/addressof.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+#include <boost/geometry/geometries/concepts/point_concept.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace model
+{
+
+// const or non-const segment type that is meant to be
+// * default constructible
+// * copy constructible
+// * assignable
+// referring_segment does not fit these requirements, hence the
+// pointing_segment class
+//
+// this class is used by the segment_iterator as its value type
+template <typename ConstOrNonConstPoint>
+class pointing_segment
+{
+    BOOST_CONCEPT_ASSERT( (
+        typename boost::mpl::if_
+            <
+                boost::is_const<ConstOrNonConstPoint>,
+                concept::Point<ConstOrNonConstPoint>,
+                concept::ConstPoint<ConstOrNonConstPoint>
+            >
+    ) );
+
+    typedef ConstOrNonConstPoint point_type;
+
+public:
+    point_type* first;
+    point_type* second;
+
+    inline pointing_segment()
+        : first(NULL)
+        , second(NULL)
+    {}
+
+    inline pointing_segment(point_type const& p1, point_type const& p2)
+        : first(boost::addressof(p1))
+        , second(boost::addressof(p2))
+    {}
+};
+
+
+} // namespace model
+
+
+// Traits specializations for segment above
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template <typename Point>
+struct tag<model::pointing_segment<Point> >
+{
+    typedef segment_tag type;
+};
+
+template <typename Point>
+struct point_type<model::pointing_segment<Point> >
+{
+    typedef Point type;
+};
+
+template <typename Point, std::size_t Dimension>
+struct indexed_access<model::pointing_segment<Point>, 0, Dimension>
+{
+    typedef model::pointing_segment<Point> segment_type;
+    typedef typename geometry::coordinate_type
+        <
+            segment_type
+        >::type coordinate_type;
+
+    static inline coordinate_type get(segment_type const& s)
+    {
+        BOOST_ASSERT( s.first != NULL );
+        return geometry::get<Dimension>(*s.first);
+    }
+
+    static inline void set(segment_type& s, coordinate_type const& value)
+    {
+        BOOST_ASSERT( s.first != NULL );
+        geometry::set<Dimension>(*s.first, value);
+    }
+};
+
+
+template <typename Point, std::size_t Dimension>
+struct indexed_access<model::pointing_segment<Point>, 1, Dimension>
+{
+    typedef model::pointing_segment<Point> segment_type;
+    typedef typename geometry::coordinate_type
+        <
+            segment_type
+        >::type coordinate_type;
+
+    static inline coordinate_type get(segment_type const& s)
+    {
+        BOOST_ASSERT( s.second != NULL );
+        return geometry::get<Dimension>(*s.second);
+    }
+
+    static inline void set(segment_type& s, coordinate_type const& value)
+    {
+        BOOST_ASSERT( s.second != NULL );
+        geometry::set<Dimension>(*s.second, value);
+    }
+};
+
+
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_POINTING_SEGMENT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_linestring.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_LINESTRING_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_LINESTRING_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+/*!
+\brief \brief_macro{multi_linestring}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING, multi_linestring} The
+    multi_linestring may contain template parameters, which must be specified then.
+\param MultiLineString \param_macro_type{multi_linestring}
+
+\qbk{
+[heading Example]
+[register_multi_linestring]
+[register_multi_linestring_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING(MultiLineString) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<> struct tag<MultiLineString> { typedef multi_linestring_tag type; }; \
+}}}
+
+
+/*!
+\brief \brief_macro{templated multi_linestring}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING_TEMPLATED, templated multi_linestring}
+    \details_macro_templated{multi_linestring, linestring}
+\param MultiLineString \param_macro_type{multi_linestring (without template parameters)}
+
+\qbk{
+[heading Example]
+[register_multi_linestring_templated]
+[register_multi_linestring_templated_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING_TEMPLATED(MultiLineString) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<typename LineString> struct tag< MultiLineString<LineString> > { typedef multi_linestring_tag type; }; \
+}}}
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_LINESTRING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POINT_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POINT_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+/*!
+\brief \brief_macro{multi_point}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_POINT, multi_point} The
+    multi_point may contain template parameters, which must be specified then.
+\param MultiPoint \param_macro_type{multi_point}
+
+\qbk{
+[heading Example]
+[register_multi_point]
+[register_multi_point_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_POINT(MultiPoint) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<> struct tag<MultiPoint> { typedef multi_point_tag type; }; \
+}}}
+
+
+/*!
+\brief \brief_macro{templated multi_point}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_POINT_TEMPLATED, templated multi_point}
+    \details_macro_templated{multi_point, point}
+\param MultiPoint \param_macro_type{multi_point (without template parameters)}
+
+\qbk{
+[heading Example]
+[register_multi_point_templated]
+[register_multi_point_templated_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_POINT_TEMPLATED(MultiPoint) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<typename Point> struct tag< MultiPoint<Point> > { typedef multi_point_tag type; }; \
+}}}
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/geometries/register/multi_polygon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POLYGON_HPP
+#define BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POLYGON_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+/*!
+\brief \brief_macro{multi_polygon}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_POLYGON, multi_polygon} The
+    multi_polygon may contain template parameters, which must be specified then.
+\param MultiPolygon \param_macro_type{multi_polygon}
+
+\qbk{
+[heading Example]
+[register_multi_polygon]
+[register_multi_polygon_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_POLYGON(MultiPolygon) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<> struct tag<MultiPolygon> { typedef multi_polygon_tag type; }; \
+}}}
+
+
+/*!
+\brief \brief_macro{templated multi_polygon}
+\ingroup register
+\details \details_macro{BOOST_GEOMETRY_REGISTER_MULTI_POLYGON_TEMPLATED, templated multi_polygon}
+    \details_macro_templated{multi_polygon, polygon}
+\param MultiPolygon \param_macro_type{multi_polygon (without template parameters)}
+
+\qbk{
+[heading Example]
+[register_multi_polygon_templated]
+[register_multi_polygon_templated_output]
+}
+*/
+#define BOOST_GEOMETRY_REGISTER_MULTI_POLYGON_TEMPLATED(MultiPolygon) \
+namespace boost { namespace geometry { namespace traits {  \
+    template<typename Polygon> struct tag< MultiPolygon<Polygon> > { typedef multi_polygon_tag type; }; \
+}}}
+
+
+#endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_MULTI_POLYGON_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/bounded_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,185 @@
+// Boost.Geometry Index
+//
+// This view makes possible to treat some simple primitives as its bounding geometry
+// e.g. box, nsphere, etc.
+//
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
+
+namespace boost { namespace geometry {
+
+namespace index { namespace detail {
+
+template <typename Geometry,
+          typename BoundingGeometry,
+          typename Tag = typename geometry::tag<Geometry>::type,
+          typename BoundingTag = typename geometry::tag<BoundingGeometry>::type>
+struct bounded_view
+{
+    BOOST_MPL_ASSERT_MSG(
+        (false),
+        NOT_IMPLEMENTED_FOR_THOSE_GEOMETRIES,
+        (BoundingTag, Tag));
+};
+
+
+// Segment -> Box
+
+template <typename Segment, typename Box>
+struct bounded_view<Segment, Box, segment_tag, box_tag>
+{
+public:
+    typedef typename geometry::coordinate_type<Box>::type coordinate_type;
+
+    explicit bounded_view(Segment const& segment)
+        : m_segment(segment)
+    {}
+    
+    template <std::size_t Dimension>
+    inline coordinate_type get_min() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                (std::min)( geometry::get<0, Dimension>(m_segment),
+                            geometry::get<1, Dimension>(m_segment) ) );
+    }
+
+    template <std::size_t Dimension>
+    inline coordinate_type get_max() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                (std::max)( geometry::get<0, Dimension>(m_segment),
+                            geometry::get<1, Dimension>(m_segment) ) );
+    }
+
+private:
+    Segment const& m_segment;
+};
+
+// Box -> Box
+
+template <typename BoxIn, typename Box>
+struct bounded_view<BoxIn, Box, box_tag, box_tag>
+{
+public:
+    typedef typename geometry::coordinate_type<Box>::type coordinate_type;
+
+    explicit bounded_view(BoxIn const& box)
+        : m_box(box)
+    {}
+
+    template <std::size_t Dimension>
+    inline coordinate_type get_min() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                geometry::get<min_corner, Dimension>(m_box) );
+    }
+
+    template <std::size_t Dimension>
+    inline coordinate_type get_max() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                geometry::get<max_corner, Dimension>(m_box) );
+    }
+
+private:
+    BoxIn const& m_box;
+};
+
+// Point -> Box
+
+template <typename Point, typename Box>
+struct bounded_view<Point, Box, point_tag, box_tag>
+{
+public:
+    typedef typename geometry::coordinate_type<Box>::type coordinate_type;
+
+    explicit bounded_view(Point const& point)
+        : m_point(point)
+    {}
+
+    template <std::size_t Dimension>
+    inline coordinate_type get_min() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                geometry::get<Dimension>(m_point) );
+    }
+
+    template <std::size_t Dimension>
+    inline coordinate_type get_max() const
+    {
+        return boost::numeric_cast<coordinate_type>(
+                geometry::get<Dimension>(m_point) );
+    }
+
+private:
+    Point const& m_point;
+};
+
+}} // namespace index::detail
+
+// XXX -> Box
+
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template <typename Geometry, typename Box, typename Tag>
+struct tag< index::detail::bounded_view<Geometry, Box, Tag, box_tag> >
+{
+    typedef box_tag type;
+};
+
+template <typename Segment, typename Box, typename Tag>
+struct point_type< index::detail::bounded_view<Segment, Box, Tag, box_tag> >
+{
+    typedef typename point_type<Box>::type type;
+};
+
+template <typename Segment, typename Box, typename Tag, std::size_t Dimension>
+struct indexed_access<index::detail::bounded_view<Segment, Box, Tag, box_tag>,
+                      min_corner, Dimension>
+{
+    typedef index::detail::bounded_view<Segment, Box, Tag, box_tag> box_type;
+    typedef typename geometry::coordinate_type<Box>::type coordinate_type;
+
+    static inline coordinate_type get(box_type const& b)
+    {
+        return b.template get_min<Dimension>();
+    }
+
+    //static inline void set(box_type & b, coordinate_type const& value)
+    //{
+    //    BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view");
+    //}
+};
+
+template <typename Segment, typename Box, typename Tag, std::size_t Dimension>
+struct indexed_access<index::detail::bounded_view<Segment, Box, Tag, box_tag>,
+                      max_corner, Dimension>
+{
+    typedef index::detail::bounded_view<Segment, Box, Tag, box_tag> box_type;
+    typedef typename geometry::coordinate_type<Box>::type coordinate_type;
+
+    static inline coordinate_type get(box_type const& b)
+    {
+        return b.template get_max<Dimension>();
+    }
+
+    //static inline void set(box_type & b, coordinate_type const& value)
+    //{
+    //    BOOST_GEOMETRY_INDEX_ASSERT(false, "unable to modify a box through view");
+    //}
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_BOUNDED_VIEW_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/pushable_array.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-// Boost.Geometry Index
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
-
-#include <boost/array.hpp>
-
-#include <boost/geometry/index/detail/assert.hpp>
-
-namespace boost { namespace geometry { namespace index { namespace detail {
-
-template <typename Element, size_t Capacity>
-class pushable_array
-{
-    typedef typename boost::array<Element, Capacity> array_type;
-
-public:
-    typedef typename array_type::value_type value_type;
-    typedef typename array_type::size_type size_type;
-    typedef typename array_type::iterator iterator;
-    typedef typename array_type::const_iterator const_iterator;
-    typedef typename array_type::reverse_iterator reverse_iterator;
-    typedef typename array_type::const_reverse_iterator const_reverse_iterator;
-    typedef typename array_type::reference reference;
-    typedef typename array_type::const_reference const_reference;
-
-    inline pushable_array()
-        : m_size(0)
-    {}
-
-    inline explicit pushable_array(size_type s)
-        : m_size(s)
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
-    }
-
-    inline void resize(size_type s)
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
-        m_size = s;
-    }
-
-    inline void reserve(size_type /*s*/)
-    {
-        //BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
-        // do nothing
-    }
-
-    inline Element & operator[](size_type i)
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
-        return m_array[i];
-    }
-
-    inline Element const& operator[](size_type i) const
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
-        return m_array[i];
-    }
-
-    inline Element const& front() const
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
-        return m_array.front();
-    }
-
-    inline Element & front()
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
-        return m_array.front();
-    }
-
-    inline Element const& back() const
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
-        return *(begin() + (m_size - 1));
-    }
-
-    inline Element & back()
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
-        return *(begin() + (m_size - 1));
-    }
-
-    inline iterator begin()
-    {
-        return m_array.begin();
-    }
-
-    inline iterator end()
-    {
-        return m_array.begin() + m_size;
-    }
-
-    inline const_iterator begin() const
-    {
-        return m_array.begin();
-    }
-
-    inline const_iterator end() const
-    {
-        return m_array.begin() + m_size;
-    }
-
-    inline reverse_iterator rbegin()
-    {
-        return reverse_iterator(end());
-    }
-
-    inline reverse_iterator rend()
-    {
-        return reverse_iterator(begin());
-    }
-
-    inline const_reverse_iterator rbegin() const
-    {
-        return const_reverse_iterator(end());
-    }
-
-    inline const_reverse_iterator rend() const
-    {
-        return const_reverse_iterator(begin());
-    }
-
-    inline void clear()
-    {
-        m_size = 0;
-    }
-
-    inline void push_back(Element const& v)
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(m_size < Capacity, "can't further increase the size of the container");
-        m_array[m_size] = v;
-        ++m_size;
-    }
-
-    inline void pop_back()
-    {
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
-        --m_size;
-    }
-
-    inline bool empty() const
-    {
-        return m_size == 0;
-    }
-    
-    inline size_t size() const
-    {
-        return m_size;
-    }
-
-    inline size_t capacity() const
-    {
-        return Capacity;
-    }
-    
-private:
-    boost::array<Element, Capacity> m_array;
-    size_type m_size;
-};
-
-}}}} // namespace boost::geometry::index::detail
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/auto_deallocator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree auto deallocator
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_AUTO_DEALLOCATOR_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_AUTO_DEALLOCATOR_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-template <typename Alloc>
-class auto_deallocator
-{
-    auto_deallocator(auto_deallocator const&);
-    auto_deallocator & operator=(auto_deallocator const&);
-public:
-    typedef typename Alloc::pointer pointer;
-    inline auto_deallocator(Alloc & a, pointer p) : m_alloc(a), m_ptr(p) {}
-    inline ~auto_deallocator() { if ( m_ptr ) boost::container::allocator_traits<Alloc>::deallocate(m_alloc, m_ptr, 1); }
-    inline void release() { m_ptr = 0; }
-    inline pointer ptr() { return m_ptr; }
-private:
-    Alloc & m_alloc;
-    pointer m_ptr;
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_AUTO_DEALLOCATOR_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/dynamic_visitor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes dynamic visitor and nodes base type
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_DYNAMIC_VISITOR_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_DYNAMIC_VISITOR_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-// visitor forward declaration
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag, bool IsVisitableConst>
-struct dynamic_visitor;
-
-// node
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct dynamic_node
-{
-    virtual ~dynamic_node() {}
-    virtual void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, Tag, false> &) = 0;
-    virtual void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, Tag, true> &) const = 0;
-};
-
-// nodes variants forward declarations
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct dynamic_internal_node;
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct dynamic_leaf;
-
-// visitor
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct dynamic_visitor<Value, Parameters, Box, Allocators, Tag, true>
-{
-    typedef dynamic_internal_node<Value, Parameters, Box, Allocators, Tag> internal_node;
-    typedef dynamic_leaf<Value, Parameters, Box, Allocators, Tag> leaf;
-
-    virtual ~dynamic_visitor() {}
-
-    virtual void operator()(internal_node const&) = 0;
-    virtual void operator()(leaf const&) = 0;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct dynamic_visitor<Value, Parameters, Box, Allocators, Tag, false>
-{
-    typedef dynamic_internal_node<Value, Parameters, Box, Allocators, Tag> internal_node;
-    typedef dynamic_leaf<Value, Parameters, Box, Allocators, Tag> leaf;
-
-    virtual ~dynamic_visitor() {}
-
-    virtual void operator()(internal_node &) = 0;
-    virtual void operator()(leaf &) = 0;
-};
-
-// nodes conversion
-
-template <typename Derived, typename Parameters, typename Value, typename Box, typename Allocators, typename Tag>
-inline Derived & get(dynamic_node<Value, Parameters, Box, Allocators, Tag> & n)
-{
-    BOOST_GEOMETRY_INDEX_ASSERT(dynamic_cast<Derived*>(&n), "can't cast to a Derived type");
-    return static_cast<Derived&>(n);
-}
-
-// apply visitor
-
-template <typename Visitor, typename Visitable>
-inline void apply_visitor(Visitor & v, Visitable & n)
-{
-    BOOST_GEOMETRY_INDEX_ASSERT(&n, "null ptr");
-    n.apply_visitor(v);
-}
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_DYNAMIC_VISITOR_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree node auto ptr
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_AUTO_PTR_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_AUTO_PTR_HPP
-
-#include <boost/geometry/index/detail/rtree/visitors/destroy.hpp>
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-// TODO - change the name to node_scoped_ptr
-
-template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-class node_auto_ptr
-{
-    typedef typename rtree::node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type node;
-    typedef typename Allocators::node_pointer pointer;
-
-    node_auto_ptr(node_auto_ptr const&);
-    node_auto_ptr & operator=(node_auto_ptr const&);
-
-public:
-    node_auto_ptr(pointer ptr, Allocators & allocators)
-        : m_ptr(ptr)
-        , m_allocators(allocators)
-    {}
-
-    ~node_auto_ptr()
-    {
-        reset();
-    }
-
-    void reset(pointer ptr = 0)
-    {
-        if ( m_ptr )
-        {
-            detail::rtree::visitors::destroy<Value, Options, Translator, Box, Allocators> del_v(m_ptr, m_allocators);
-            detail::rtree::apply_visitor(del_v, *m_ptr);
-        }
-        m_ptr = ptr;
-    }
-
-    void release()
-    {
-        m_ptr = 0;
-    }
-
-    pointer get() const
-    {
-        return m_ptr;
-    }
-
-    node & operator*() const
-    {
-        return *m_ptr;
-    }
-
-    pointer operator->() const
-    {
-        return m_ptr;
-    }
-
-private:
-    pointer m_ptr;
-    Allocators & m_allocators;
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_AUTO_PTR_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes based on run-time polymorphism, storing std::vectors
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct dynamic_internal_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-    : public dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-{
-    typedef typename Allocators::leaf_allocator_type::template rebind<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>
-    >::other elements_allocator_type;
-
-    typedef boost::container::vector<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
-        elements_allocator_type
-    > elements_type;
-
-    template <typename Al>
-    inline dynamic_internal_node(Al const& al)
-        : elements(al)
-    {}
-
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, false> & v) { v(*this); }
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, true> & v) const { v(*this); }
-
-    elements_type elements;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct dynamic_leaf<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-    : public dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-{
-    typedef typename Allocators::leaf_allocator_type::template rebind<
-        Value
-    >::other elements_allocator_type;
-
-    typedef boost::container::vector<
-        Value,
-        elements_allocator_type
-    > elements_type;
-
-    template <typename Al>
-    inline dynamic_leaf(Al const& al)
-        : elements(al)
-    {}
-
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, false> & v) { v(*this); }
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, true> & v) const { v(*this); }
-
-    elements_type elements;
-};
-
-// nodes traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-{
-    typedef dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct internal_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-{
-    typedef dynamic_internal_node<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct leaf<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag>
-{
-    typedef dynamic_leaf<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag> type;
-};
-
-// visitor traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
-struct visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, IsVisitableConst>
-{
-    typedef dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_dynamic_tag, IsVisitableConst> type;
-};
-
-// element's indexable type
-
-template <typename Element, typename Translator>
-struct element_indexable_type
-{
-    typedef typename indexable_type<Translator>::type type;
-};
-
-template <typename First, typename Pointer, typename Translator>
-struct element_indexable_type<
-    rtree::ptr_pair<First, Pointer>,
-    Translator
->
-{
-    typedef First type;
-};
-
-// element's indexable getter
-
-template <typename Element, typename Translator>
-typename result_type<Translator>::type
-element_indexable(Element const& el, Translator const& tr)
-{
-    return tr(el);
-}
-
-template <typename First, typename Pointer, typename Translator>
-First const&
-element_indexable(rtree::ptr_pair<First, Pointer> const& el, Translator const& /*tr*/)
-{
-    return el.first;
-}
-
-// nodes elements
-
-template <typename Node>
-struct elements_type
-{
-    typedef typename Node::elements_type type;
-};
-
-template <typename Node>
-inline typename elements_type<Node>::type &
-elements(Node & n)
-{
-    return n.elements;
-}
-
-template <typename Node>
-inline typename elements_type<Node>::type const&
-elements(Node const& n)
-{
-    return n.elements;
-}
-
-// elements derived type
-template <typename Elements, typename NewValue>
-struct container_from_elements_type
-{
-    typedef boost::container::vector<NewValue> type;
-};
-
-// allocators
-
-template <typename Allocator, typename Value, typename Parameters, typename Box>
-class allocators<Allocator, Value, Parameters, Box, node_d_mem_dynamic_tag>
-    : public Allocator::template rebind<
-        typename internal_node<Value, Parameters, Box, allocators<Allocator, Value, Parameters, Box, node_d_mem_dynamic_tag>, node_d_mem_dynamic_tag>::type
-    >::other
-    , public Allocator::template rebind<
-        typename leaf<Value, Parameters, Box, allocators<Allocator, Value, Parameters, Box, node_d_mem_dynamic_tag>, node_d_mem_dynamic_tag>::type
-    >::other
-{
-    typedef typename Allocator::template rebind<
-        Value
-    >::other value_allocator_type;
-
-public:
-    typedef Allocator allocator_type;
-    
-    typedef Value value_type;
-    typedef typename value_allocator_type::reference reference;
-    typedef typename value_allocator_type::const_reference const_reference;
-    typedef typename value_allocator_type::size_type size_type;
-    typedef typename value_allocator_type::difference_type difference_type;
-    typedef typename value_allocator_type::pointer pointer;
-    typedef typename value_allocator_type::const_pointer const_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_d_mem_dynamic_tag>::type
-    >::other::pointer node_pointer;
-
-//    typedef typename Allocator::template rebind<
-//        typename internal_node<Value, Parameters, Box, allocators, node_d_mem_dynamic_tag>::type
-//    >::other::pointer internal_node_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename internal_node<Value, Parameters, Box, allocators, node_d_mem_dynamic_tag>::type
-    >::other internal_node_allocator_type;
-
-    typedef typename Allocator::template rebind<
-        typename leaf<Value, Parameters, Box, allocators, node_d_mem_dynamic_tag>::type
-    >::other leaf_allocator_type;
-
-    inline allocators()
-        : internal_node_allocator_type()
-        , leaf_allocator_type()
-    {}
-
-    template <typename Alloc>
-    inline explicit allocators(Alloc const& alloc)
-        : internal_node_allocator_type(alloc)
-        , leaf_allocator_type(alloc)
-    {}
-
-    inline allocators(BOOST_FWD_REF(allocators) a)
-        : internal_node_allocator_type(boost::move(a.internal_node_allocator()))
-        , leaf_allocator_type(boost::move(a.leaf_allocator()))
-    {}
-
-    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
-    {
-        internal_node_allocator() = ::boost::move(a.internal_node_allocator());
-        leaf_allocator() = ::boost::move(a.leaf_allocator());
-        return *this;
-    }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    inline allocators & operator=(allocators const& a)
-    {
-        internal_node_allocator() = a.internal_node_allocator();
-        leaf_allocator() = a.leaf_allocator();
-        return *this;
-    }
-#endif
-
-    void swap(allocators & a)
-    {
-        boost::swap(internal_node_allocator(), a.internal_node_allocator());
-        boost::swap(leaf_allocator(), a.leaf_allocator());
-    }
-
-    bool operator==(allocators const& a) const { return leaf_allocator() == a.leaf_allocator(); }
-    template <typename Alloc>
-    bool operator==(Alloc const& a) const { return leaf_allocator() == leaf_allocator_type(a); }
-
-    Allocator allocator() const { return Allocator(leaf_allocator()); }
-
-    internal_node_allocator_type & internal_node_allocator() { return *this; }
-    internal_node_allocator_type const& internal_node_allocator() const { return *this; }
-    leaf_allocator_type & leaf_allocator() { return *this; }
-    leaf_allocator_type const& leaf_allocator() const { return *this; }
-};
-
-// create_node_impl
-
-template <typename BaseNodePtr, typename Node>
-struct create_dynamic_node
-{
-    template <typename AllocNode>
-    static inline BaseNodePtr apply(AllocNode & alloc_node)
-    {
-        typedef boost::container::allocator_traits<AllocNode> Al;
-        typedef typename Al::pointer P;
-
-        P p = Al::allocate(alloc_node, 1);
-
-        if ( 0 == p )
-            throw_runtime_error("boost::geometry::index::rtree node creation failed");
-
-        auto_deallocator<AllocNode> deallocator(alloc_node, p);
-
-        Al::construct(alloc_node, boost::addressof(*p), alloc_node);
-
-        deallocator.release();
-        return p;
-    }
-};
-
-// destroy_node_impl
-
-template <typename Node>
-struct destroy_dynamic_node
-{
-    template <typename AllocNode, typename BaseNodePtr>
-    static inline void apply(AllocNode & alloc_node, BaseNodePtr n)
-    {
-        typedef boost::container::allocator_traits<AllocNode> Al;
-        typedef typename Al::pointer P;
-
-        P p(&static_cast<Node&>(rtree::get<Node>(*n)));
-        Al::destroy(alloc_node, boost::addressof(*p));
-        Al::deallocate(alloc_node, p, 1);
-    }
-};
-
-// create_node
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct create_node<
-    Allocators,
-    dynamic_internal_node<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_dynamic_node<
-            typename Allocators::node_pointer,
-            dynamic_internal_node<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.internal_node_allocator());
-    }
-};
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct create_node<
-    Allocators,
-    dynamic_leaf<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_dynamic_node<
-            typename Allocators::node_pointer,
-            dynamic_leaf<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.leaf_allocator());
-    }
-};
-
-// destroy_node
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct destroy_node<
-    Allocators,
-    dynamic_internal_node<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
-    {
-        destroy_dynamic_node<
-            dynamic_internal_node<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.internal_node_allocator(), n);
-    }
-};
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct destroy_node<
-    Allocators,
-    dynamic_leaf<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
-    {
-        destroy_dynamic_node<
-            dynamic_leaf<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.leaf_allocator(), n);
-    }
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,199 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes based on runtime-polymorphism, storing static-size containers
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct dynamic_internal_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-    : public dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-{
-    typedef typename Allocators::leaf_allocator_type::template rebind<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>
-    >::other elements_allocator_type;
-
-    typedef detail::varray<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
-        Parameters::max_elements + 1
-    > elements_type;
-
-    template <typename Alloc>
-    inline dynamic_internal_node(Alloc const&) {}
-
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, false> & v) { v(*this); }
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, true> & v) const { v(*this); }
-
-    elements_type elements;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct dynamic_leaf<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-    : public dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-{
-    typedef typename Allocators::leaf_allocator_type::template rebind<
-        Value
-    >::other elements_allocator_type;
-
-    typedef detail::varray<
-        Value,
-        Parameters::max_elements + 1
-    > elements_type;
-
-    template <typename Alloc>
-    inline dynamic_leaf(Alloc const&) {}
-
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, false> & v) { v(*this); }
-    void apply_visitor(dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, true> & v) const { v(*this); }
-
-    elements_type elements;
-};
-
-// nodes traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct node<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-{
-    typedef dynamic_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct internal_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-{
-    typedef dynamic_internal_node<Value, Parameters, Box, Allocators, node_d_mem_static_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct leaf<Value, Parameters, Box, Allocators, node_d_mem_static_tag>
-{
-    typedef dynamic_leaf<Value, Parameters, Box, Allocators, node_d_mem_static_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
-struct visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, IsVisitableConst>
-{
-    typedef dynamic_visitor<Value, Parameters, Box, Allocators, node_d_mem_static_tag, IsVisitableConst> type;
-};
-
-// elements derived type
-template <typename OldValue, size_t N, typename NewValue>
-struct container_from_elements_type<detail::varray<OldValue, N>, NewValue>
-{
-    typedef detail::varray<NewValue, N> type;
-};
-
-// allocators
-
-template <typename Allocator, typename Value, typename Parameters, typename Box>
-class allocators<Allocator, Value, Parameters, Box, node_d_mem_static_tag>
-    : public Allocator::template rebind<
-        typename internal_node<
-            Value, Parameters, Box,
-            allocators<Allocator, Value, Parameters, Box, node_d_mem_static_tag>,
-            node_d_mem_static_tag
-        >::type
-    >::other
-    , public Allocator::template rebind<
-        typename leaf<
-            Value, Parameters, Box,
-            allocators<Allocator, Value, Parameters, Box, node_d_mem_static_tag>,
-            node_d_mem_static_tag
-        >::type
-    >::other
-{
-    typedef typename Allocator::template rebind<
-        Value
-    >::other value_allocator_type;
-
-public:
-    typedef Allocator allocator_type;
-
-    typedef Value value_type;
-    typedef value_type & reference;
-    typedef const value_type & const_reference;
-    typedef typename value_allocator_type::size_type size_type;
-    typedef typename value_allocator_type::difference_type difference_type;
-    typedef typename value_allocator_type::pointer pointer;
-    typedef typename value_allocator_type::const_pointer const_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_d_mem_static_tag>::type
-    >::other::pointer node_pointer;
-
-//    typedef typename Allocator::template rebind<
-//        typename internal_node<Value, Parameters, Box, allocators, node_d_mem_static_tag>::type
-//    >::other::pointer internal_node_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename internal_node<Value, Parameters, Box, allocators, node_d_mem_static_tag>::type
-    >::other internal_node_allocator_type;
-
-    typedef typename Allocator::template rebind<
-        typename leaf<Value, Parameters, Box, allocators, node_d_mem_static_tag>::type
-    >::other leaf_allocator_type;
-
-    inline allocators()
-        : internal_node_allocator_type()
-        , leaf_allocator_type()
-    {}
-
-    template <typename Alloc>
-    inline explicit allocators(Alloc const& alloc)
-        : internal_node_allocator_type(alloc)
-        , leaf_allocator_type(alloc)
-    {}
-
-    inline allocators(BOOST_FWD_REF(allocators) a)
-        : internal_node_allocator_type(boost::move(a.internal_node_allocator()))
-        , leaf_allocator_type(boost::move(a.leaf_allocator()))
-    {}
-
-    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
-    {
-        internal_node_allocator() = ::boost::move(a.internal_node_allocator());
-        leaf_allocator() = ::boost::move(a.leaf_allocator());
-        return *this;
-    }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    inline allocators & operator=(allocators const& a)
-    {
-        internal_node_allocator() = a.internal_node_allocator();
-        leaf_allocator() = a.leaf_allocator();
-        return *this;
-    }
-#endif
-
-    void swap(allocators & a)
-    {
-        boost::swap(internal_node_allocator(), a.internal_node_allocator());
-        boost::swap(leaf_allocator(), a.leaf_allocator());
-    }
-
-    bool operator==(allocators const& a) const { return leaf_allocator() == a.leaf_allocator(); }
-    template <typename Alloc>
-    bool operator==(Alloc const& a) const { return leaf_allocator() == leaf_allocator_type(a); }
-
-    Allocator allocator() const { return Allocator(leaf_allocator()); }
-
-    internal_node_allocator_type & internal_node_allocator() { return *this; }
-    internal_node_allocator_type const& internal_node_allocator() const { return *this; }
-    leaf_allocator_type & leaf_allocator() { return *this; }
-    leaf_allocator_type const& leaf_allocator() const{ return *this; }
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_elements.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,95 @@
+// Boost.Geometry Index
+//
+// R-tree node elements access
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_ELEMENTS_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_ELEMENTS_HPP
+
+#include <boost/container/vector.hpp>
+#include <boost/geometry/index/detail/varray.hpp>
+#include <boost/geometry/index/detail/rtree/node/pairs.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+// element's indexable type
+
+template <typename Element, typename Translator>
+struct element_indexable_type
+{
+    typedef typename indexable_type<Translator>::type type;
+};
+
+template <typename First, typename Pointer, typename Translator>
+struct element_indexable_type<
+    rtree::ptr_pair<First, Pointer>,
+    Translator
+>
+{
+    typedef First type;
+};
+
+// element's indexable getter
+
+template <typename Element, typename Translator>
+typename result_type<Translator>::type
+element_indexable(Element const& el, Translator const& tr)
+{
+    return tr(el);
+}
+
+template <typename First, typename Pointer, typename Translator>
+First const&
+element_indexable(rtree::ptr_pair<First, Pointer> const& el, Translator const& /*tr*/)
+{
+    return el.first;
+}
+
+// nodes elements
+
+template <typename Node>
+struct elements_type
+{
+    typedef typename Node::elements_type type;
+};
+
+template <typename Node>
+inline typename elements_type<Node>::type &
+elements(Node & n)
+{
+    return n.elements;
+}
+
+template <typename Node>
+inline typename elements_type<Node>::type const&
+elements(Node const& n)
+{
+    return n.elements;
+}
+
+// elements derived type
+
+template <typename Elements, typename NewValue>
+struct container_from_elements_type
+{
+    typedef boost::container::vector<NewValue> type;
+};
+
+template <typename OldValue, size_t N, typename NewValue>
+struct container_from_elements_type<detail::varray<OldValue, N>, NewValue>
+{
+    typedef detail::varray<NewValue, N> type;
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_ELEMENTS_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes based on Boost.Variant, storing std::vectors
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_VARIANT_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_VARIANT_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-// nodes default types
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct static_internal_node
-{
-    typedef typename Allocators::node_allocator_type::template rebind<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>
-    >::other elements_allocator_type;
-
-    typedef boost::container::vector<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
-        elements_allocator_type
-    > elements_type;
-
-    template <typename Al>
-    inline static_internal_node(Al const& al)
-        : elements(al)
-    {}
-
-    elements_type elements;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct static_leaf
-{
-    typedef typename Allocators::node_allocator_type::template rebind<
-        Value
-    >::other elements_allocator_type;
-
-    typedef boost::container::vector<
-        Value,
-        elements_allocator_type
-    > elements_type;
-
-     template <typename Al>
-    inline static_leaf(Al const& al)
-        : elements(al)
-    {}
-
-    elements_type elements;
-};
-
-// nodes traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct node<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag>
-{
-    typedef boost::variant<
-        static_leaf<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag>,
-        static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag>
-    > type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct internal_node<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag>
-{
-    typedef static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct leaf<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag>
-{
-    typedef static_leaf<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag> type;
-};
-
-// visitor traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
-struct visitor<Value, Parameters, Box, Allocators, node_s_mem_dynamic_tag, IsVisitableConst>
-{
-    typedef static_visitor<> type;
-};
-
-// allocators
-
-template <typename Allocator, typename Value, typename Parameters, typename Box>
-class allocators<Allocator, Value, Parameters, Box, node_s_mem_dynamic_tag>
-    : public Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators<Allocator, Value, Parameters, Box, node_s_mem_dynamic_tag>, node_s_mem_dynamic_tag>::type
-    >::other
-{
-    typedef typename Allocator::template rebind<
-        Value
-    >::other value_allocator_type;
-
-public:
-    typedef Allocator allocator_type;
-
-    typedef Value value_type;
-    typedef typename value_allocator_type::reference reference;
-    typedef typename value_allocator_type::const_reference const_reference;
-    typedef typename value_allocator_type::size_type size_type;
-    typedef typename value_allocator_type::difference_type difference_type;
-    typedef typename value_allocator_type::pointer pointer;
-    typedef typename value_allocator_type::const_pointer const_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_s_mem_dynamic_tag>::type
-    >::other::pointer node_pointer;
-
-//    typedef typename Allocator::template rebind<
-//        typename internal_node<Value, Parameters, Box, allocators, node_s_mem_dynamic_tag>::type
-//    >::other::pointer internal_node_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_s_mem_dynamic_tag>::type
-    >::other node_allocator_type;
-
-    inline allocators()
-        : node_allocator_type()
-    {}
-
-    template <typename Alloc>
-    inline explicit allocators(Alloc const& alloc)
-        : node_allocator_type(alloc)
-    {}
-
-    inline allocators(BOOST_FWD_REF(allocators) a)
-        : node_allocator_type(boost::move(a.node_allocator()))
-    {}
-
-    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
-    {
-        node_allocator() = boost::move(a.node_allocator());
-        return *this;
-    }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    inline allocators & operator=(allocators const& a)
-    {
-        node_allocator() = a.node_allocator();
-        return *this;
-    }
-#endif
-
-    void swap(allocators & a)
-    {
-        boost::swap(node_allocator(), a.node_allocator());
-    }
-
-    bool operator==(allocators const& a) const { return node_allocator() == a.node_allocator(); }
-    template <typename Alloc>
-    bool operator==(Alloc const& a) const { return node_allocator() == node_allocator_type(a); }
-
-    Allocator allocator() const { return Allocator(node_allocator()); }
-
-    node_allocator_type & node_allocator() { return *this; }
-    node_allocator_type const& node_allocator() const { return *this; }
-};
-
-// create_node_variant
-
-template <typename VariantPtr, typename Node>
-struct create_static_node
-{
-    template <typename AllocNode>
-    static inline VariantPtr apply(AllocNode & alloc_node)
-    {
-        typedef boost::container::allocator_traits<AllocNode> Al;
-        typedef typename Al::pointer P;
-
-        P p = Al::allocate(alloc_node, 1);
-
-        if ( 0 == p )
-            throw_runtime_error("boost::geometry::index::rtree node creation failed");
-
-        auto_deallocator<AllocNode> deallocator(alloc_node, p);
-
-        Al::construct(alloc_node, boost::addressof(*p), Node(alloc_node)); // implicit cast to Variant
-
-        deallocator.release();
-        return p;
-    }
-};
-
-// destroy_node_variant
-
-template <typename Node>
-struct destroy_static_node
-{
-    template <typename AllocNode, typename VariantPtr>
-    static inline void apply(AllocNode & alloc_node, VariantPtr n)
-    {
-        typedef boost::container::allocator_traits<AllocNode> Al;
-
-        Al::destroy(alloc_node, boost::addressof(*n));
-        Al::deallocate(alloc_node, n, 1);
-    }
-};
-
-// create_node
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct create_node<
-    Allocators,
-    static_internal_node<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_static_node<
-            typename Allocators::node_pointer,
-            static_internal_node<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.node_allocator());
-    }
-};
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct create_node<
-    Allocators,
-    static_leaf<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_static_node<
-            typename Allocators::node_pointer,
-            static_leaf<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.node_allocator());
-    }
-};
-
-// destroy_node
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct destroy_node<
-    Allocators,
-    static_internal_node<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
-    {
-        destroy_static_node<
-            static_internal_node<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.node_allocator(), n);
-    }
-};
-
-template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
-struct destroy_node<
-    Allocators,
-    static_leaf<Value, Parameters, Box, Allocators, Tag>
->
-{
-    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
-    {
-        destroy_static_node<
-            static_leaf<Value, Parameters, Box, Allocators, Tag>
-        >::apply(allocators.node_allocator(), n);
-    }
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_VARIANT_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes based on Boost.Variant, storing static-size containers
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_VARIANT_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_VARIANT_HPP
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-// nodes default types
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-{
-    typedef typename Allocators::node_allocator_type::template rebind<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>
-    >::other elements_allocator_type;
-
-    typedef detail::varray<
-        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
-        Parameters::max_elements + 1
-    > elements_type;
-
-    template <typename Alloc>
-    inline static_internal_node(Alloc const&) {}
-
-    elements_type elements;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct static_leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-{
-    typedef typename Allocators::node_allocator_type::template rebind<
-        Value
-    >::other elements_allocator_type;
-
-    typedef detail::varray<
-        Value,
-        Parameters::max_elements + 1
-    > elements_type;
-
-    template <typename Alloc>
-    inline static_leaf(Alloc const&) {}
-
-    elements_type elements;
-};
-
-// nodes traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-{
-    typedef boost::variant<
-        static_leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag>,
-        static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-    > type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-{
-    typedef static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag> type;
-};
-
-template <typename Value, typename Parameters, typename Box, typename Allocators>
-struct leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-{
-    typedef static_leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag> type;
-};
-
-// visitor traits
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
-struct visitor<Value, Parameters, Box, Allocators, node_s_mem_static_tag, IsVisitableConst>
-{
-    typedef static_visitor<> type;
-};
-
-// allocators
-
-template <typename Allocator, typename Value, typename Parameters, typename Box>
-struct allocators<Allocator, Value, Parameters, Box, node_s_mem_static_tag>
-    : public Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators<Allocator, Value, Parameters, Box, node_s_mem_static_tag>, node_s_mem_static_tag>::type
-    >::other
-{
-    typedef typename Allocator::template rebind<
-        Value
-    >::other value_allocator_type;
-
-public:
-    typedef Allocator allocator_type;
-
-    typedef Value value_type;
-    typedef value_type & reference;
-    typedef const value_type & const_reference;
-    typedef typename value_allocator_type::size_type size_type;
-    typedef typename value_allocator_type::difference_type difference_type;
-    typedef typename value_allocator_type::pointer pointer;
-    typedef typename value_allocator_type::const_pointer const_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_s_mem_static_tag>::type
-    >::other::pointer node_pointer;
-
-//    typedef typename Allocator::template rebind<
-//        typename internal_node<Value, Parameters, Box, allocators, node_s_mem_static_tag>::type
-//    >::other::pointer internal_node_pointer;
-
-    typedef typename Allocator::template rebind<
-        typename node<Value, Parameters, Box, allocators, node_s_mem_static_tag>::type
-    >::other node_allocator_type;
-
-    inline allocators()
-        : node_allocator_type()
-    {}
-
-    template <typename Alloc>
-    inline explicit allocators(Alloc const& alloc)
-        : node_allocator_type(alloc)
-    {}
-
-    inline allocators(BOOST_FWD_REF(allocators) a)
-        : node_allocator_type(boost::move(a.node_allocator()))
-    {}
-
-    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
-    {
-        node_allocator() = boost::move(a.node_allocator());
-        return *this;
-    }
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-    inline allocators & operator=(allocators const& a)
-    {
-        node_allocator() = a.node_allocator();
-        return *this;
-    }
-#endif
-
-    void swap(allocators & a)
-    {
-        boost::swap(node_allocator(), a.node_allocator());
-    }
-
-    bool operator==(allocators const& a) const { return node_allocator() == a.node_allocator(); }
-    template <typename Alloc>
-    bool operator==(Alloc const& a) const { return node_allocator() == node_allocator_type(a); }
-
-    Allocator allocator() const { return Allocator(node_allocator()); }
-
-    node_allocator_type & node_allocator() { return *this; }
-    node_allocator_type const& node_allocator() const { return *this; }
-};
-
-// create_node
-
-template <typename Allocators, typename Value, typename Parameters, typename Box>
-struct create_node<
-    Allocators,
-    static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_static_node<
-            typename Allocators::node_pointer,
-            static_internal_node<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-        >::template apply(allocators.node_allocator());
-    }
-};
-
-template <typename Allocators, typename Value, typename Parameters, typename Box>
-struct create_node<
-    Allocators,
-    static_leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
->
-{
-    static inline typename Allocators::node_pointer
-    apply(Allocators & allocators)
-    {
-        return create_static_node<
-            typename Allocators::node_pointer,
-            static_leaf<Value, Parameters, Box, Allocators, node_s_mem_static_tag>
-        >::template apply(allocators.node_allocator());
-    }
-};
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_DEFAULT_STATIC_VARIANT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/scoped_deallocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+// Boost.Geometry Index
+//
+// R-tree scoped deallocator
+//
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SCOPED_DEALLOCATOR_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SCOPED_DEALLOCATOR_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+template <typename Alloc>
+class scoped_deallocator
+{
+    scoped_deallocator(scoped_deallocator const&);
+    scoped_deallocator & operator=(scoped_deallocator const&);
+public:
+    typedef typename Alloc::pointer pointer;
+    inline scoped_deallocator(pointer p, Alloc & a)
+        : m_ptr(p), m_alloc(a)
+    {}
+    inline ~scoped_deallocator()
+    {
+        if ( m_ptr )
+        {
+            boost::container::allocator_traits<Alloc>::deallocate(m_alloc, m_ptr, 1);
+        }
+    }
+    inline void release()
+    {
+        m_ptr = 0;
+    }
+private:
+    pointer m_ptr;
+    Alloc & m_alloc;
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SCOPED_DEALLOCATOR_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/static_visitor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-// Boost.Geometry Index
-//
-// R-tree nodes static visitor related code
-//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
-//
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_STATIC_VISITOR_HPP
-#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_STATIC_VISITOR_HPP
-
-#include <boost/variant.hpp>
-
-namespace boost { namespace geometry { namespace index {
-
-namespace detail { namespace rtree {
-
-// nodes variants forward declarations
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct static_internal_node;
-
-template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-struct static_leaf;
-
-// nodes conversion
-
-template <typename V, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-inline V & get(
-    boost::variant<
-        static_leaf<Value, Parameters, Box, Allocators, Tag>,
-        static_internal_node<Value, Parameters, Box, Allocators, Tag>
-    > & v)
-{
-    return boost::get<V>(v);
-}
-
-// apply visitor
-
-template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-inline void apply_visitor(Visitor & v,
-                          boost::variant<
-                              static_leaf<Value, Parameters, Box, Allocators, Tag>,
-                              static_internal_node<Value, Parameters, Box, Allocators, Tag>
-                          > & n)
-{
-    boost::apply_visitor(v, n);
-}
-
-template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
-inline void apply_visitor(Visitor & v,
-                          boost::variant<
-                              static_leaf<Value, Parameters, Box, Allocators, Tag>,
-                              static_internal_node<Value, Parameters, Box, Allocators, Tag>
-                          > const& n)
-{
-    boost::apply_visitor(v, n);
-}
-
-}} // namespace detail::rtree
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_STATIC_VISITOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/subtree_destroyer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+// Boost.Geometry Index
+//
+// R-tree subtree scoped destroyer
+//
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SUBTREE_DESTROYED_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SUBTREE_DESTROYED_HPP
+
+#include <boost/geometry/index/detail/rtree/visitors/destroy.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+class subtree_destroyer
+{
+    typedef typename rtree::node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type node;
+    typedef typename Allocators::node_pointer pointer;
+
+    subtree_destroyer(subtree_destroyer const&);
+    subtree_destroyer & operator=(subtree_destroyer const&);
+
+public:
+    subtree_destroyer(pointer ptr, Allocators & allocators)
+        : m_ptr(ptr)
+        , m_allocators(allocators)
+    {}
+
+    ~subtree_destroyer()
+    {
+        reset();
+    }
+
+    void reset(pointer ptr = 0)
+    {
+        if ( m_ptr && m_ptr != ptr )
+        {
+            detail::rtree::visitors::destroy<Value, Options, Translator, Box, Allocators> del_v(m_ptr, m_allocators);
+            detail::rtree::apply_visitor(del_v, *m_ptr);
+        }
+        m_ptr = ptr;
+    }
+
+    void release()
+    {
+        m_ptr = 0;
+    }
+
+    pointer get() const
+    {
+        return m_ptr;
+    }
+
+    node & operator*() const
+    {
+        return *m_ptr;
+    }
+
+    pointer operator->() const
+    {
+        return m_ptr;
+    }
+
+private:
+    pointer m_ptr;
+    Allocators & m_allocators;
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_SUBTREE_DESTROYED_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_dynamic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,276 @@
+// Boost.Geometry Index
+//
+// R-tree nodes based on Boost.Variant, storing dynamic-size containers
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_DYNAMIC_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_DYNAMIC_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+// nodes default types
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct variant_internal_node
+{
+    typedef boost::container::vector
+        <
+            rtree::ptr_pair<Box, typename Allocators::node_pointer>,
+            typename Allocators::node_allocator_type::template rebind
+                <
+                    rtree::ptr_pair<Box, typename Allocators::node_pointer>
+                >::other
+        > elements_type;
+
+    template <typename Al>
+    inline variant_internal_node(Al const& al)
+        : elements(al)
+    {}
+
+    elements_type elements;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct variant_leaf
+{
+    typedef boost::container::vector
+        <
+            Value,
+            typename Allocators::node_allocator_type::template rebind
+                <
+                    Value
+                >::other
+        > elements_type;
+
+     template <typename Al>
+    inline variant_leaf(Al const& al)
+        : elements(al)
+    {}
+
+    elements_type elements;
+};
+
+// nodes traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct node<Value, Parameters, Box, Allocators, node_variant_dynamic_tag>
+{
+    typedef boost::variant<
+        variant_leaf<Value, Parameters, Box, Allocators, node_variant_dynamic_tag>,
+        variant_internal_node<Value, Parameters, Box, Allocators, node_variant_dynamic_tag>
+    > type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct internal_node<Value, Parameters, Box, Allocators, node_variant_dynamic_tag>
+{
+    typedef variant_internal_node<Value, Parameters, Box, Allocators, node_variant_dynamic_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct leaf<Value, Parameters, Box, Allocators, node_variant_dynamic_tag>
+{
+    typedef variant_leaf<Value, Parameters, Box, Allocators, node_variant_dynamic_tag> type;
+};
+
+// visitor traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
+struct visitor<Value, Parameters, Box, Allocators, node_variant_dynamic_tag, IsVisitableConst>
+{
+    typedef static_visitor<> type;
+};
+
+// allocators
+
+template <typename Allocator, typename Value, typename Parameters, typename Box>
+class allocators<Allocator, Value, Parameters, Box, node_variant_dynamic_tag>
+    : public Allocator::template rebind<
+        typename node<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_variant_dynamic_tag>,
+            node_variant_dynamic_tag
+        >::type
+    >::other
+{
+    typedef typename Allocator::template rebind<
+        Value
+    >::other value_allocator_type;
+
+public:
+    typedef Allocator allocator_type;
+
+    typedef Value value_type;
+    typedef typename value_allocator_type::reference reference;
+    typedef typename value_allocator_type::const_reference const_reference;
+    typedef typename value_allocator_type::size_type size_type;
+    typedef typename value_allocator_type::difference_type difference_type;
+    typedef typename value_allocator_type::pointer pointer;
+    typedef typename value_allocator_type::const_pointer const_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_variant_dynamic_tag>::type
+    >::other::pointer node_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_variant_dynamic_tag>::type
+    >::other node_allocator_type;
+
+    inline allocators()
+        : node_allocator_type()
+    {}
+
+    template <typename Alloc>
+    inline explicit allocators(Alloc const& alloc)
+        : node_allocator_type(alloc)
+    {}
+
+    inline allocators(BOOST_FWD_REF(allocators) a)
+        : node_allocator_type(boost::move(a.node_allocator()))
+    {}
+
+    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
+    {
+        node_allocator() = boost::move(a.node_allocator());
+        return *this;
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    inline allocators & operator=(allocators const& a)
+    {
+        node_allocator() = a.node_allocator();
+        return *this;
+    }
+#endif
+
+    void swap(allocators & a)
+    {
+        boost::swap(node_allocator(), a.node_allocator());
+    }
+
+    bool operator==(allocators const& a) const { return node_allocator() == a.node_allocator(); }
+    template <typename Alloc>
+    bool operator==(Alloc const& a) const { return node_allocator() == node_allocator_type(a); }
+
+    Allocator allocator() const { return Allocator(node_allocator()); }
+
+    node_allocator_type & node_allocator() { return *this; }
+    node_allocator_type const& node_allocator() const { return *this; }
+};
+
+// create_node_variant
+
+template <typename VariantPtr, typename Node>
+struct create_variant_node
+{
+    template <typename AllocNode>
+    static inline VariantPtr apply(AllocNode & alloc_node)
+    {
+        typedef boost::container::allocator_traits<AllocNode> Al;
+        typedef typename Al::pointer P;
+
+        P p = Al::allocate(alloc_node, 1);
+
+        if ( 0 == p )
+            throw_runtime_error("boost::geometry::index::rtree node creation failed");
+
+        scoped_deallocator<AllocNode> deallocator(p, alloc_node);
+
+        Al::construct(alloc_node, boost::addressof(*p), Node(alloc_node)); // implicit cast to Variant
+
+        deallocator.release();
+        return p;
+    }
+};
+
+// destroy_node_variant
+
+template <typename Node>
+struct destroy_variant_node
+{
+    template <typename AllocNode, typename VariantPtr>
+    static inline void apply(AllocNode & alloc_node, VariantPtr n)
+    {
+        typedef boost::container::allocator_traits<AllocNode> Al;
+
+        Al::destroy(alloc_node, boost::addressof(*n));
+        Al::deallocate(alloc_node, n, 1);
+    }
+};
+
+// create_node
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+    Allocators,
+    variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline typename Allocators::node_pointer
+    apply(Allocators & allocators)
+    {
+        return create_variant_node<
+            typename Allocators::node_pointer,
+            variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.node_allocator());
+    }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+    Allocators,
+    variant_leaf<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline typename Allocators::node_pointer
+    apply(Allocators & allocators)
+    {
+        return create_variant_node<
+            typename Allocators::node_pointer,
+            variant_leaf<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.node_allocator());
+    }
+};
+
+// destroy_node
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+    Allocators,
+    variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
+    {
+        destroy_variant_node<
+            variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.node_allocator(), n);
+    }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+    Allocators,
+    variant_leaf<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
+    {
+        destroy_variant_node<
+            variant_leaf<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.node_allocator(), n);
+    }
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_DYNAMIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_static.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,160 @@
+// Boost.Geometry Index
+//
+// R-tree nodes based on Boost.Variant, storing static-size containers
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+// nodes default types
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
+{
+    typedef detail::varray<
+        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
+        Parameters::max_elements + 1
+    > elements_type;
+
+    template <typename Alloc>
+    inline variant_internal_node(Alloc const&) {}
+
+    elements_type elements;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>
+{
+    typedef detail::varray<
+        Value,
+        Parameters::max_elements + 1
+    > elements_type;
+
+    template <typename Alloc>
+    inline variant_leaf(Alloc const&) {}
+
+    elements_type elements;
+};
+
+// nodes traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct node<Value, Parameters, Box, Allocators, node_variant_static_tag>
+{
+    typedef boost::variant<
+        variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>,
+        variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
+    > type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
+{
+    typedef variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>
+{
+    typedef variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag> type;
+};
+
+// visitor traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
+struct visitor<Value, Parameters, Box, Allocators, node_variant_static_tag, IsVisitableConst>
+{
+    typedef static_visitor<> type;
+};
+
+// allocators
+
+template <typename Allocator, typename Value, typename Parameters, typename Box>
+class allocators<Allocator, Value, Parameters, Box, node_variant_static_tag>
+    : public Allocator::template rebind<
+        typename node<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_variant_static_tag>,
+            node_variant_static_tag
+        >::type
+    >::other
+{
+    typedef typename Allocator::template rebind<
+        Value
+    >::other value_allocator_type;
+
+public:
+    typedef Allocator allocator_type;
+
+    typedef Value value_type;
+    typedef value_type & reference;
+    typedef const value_type & const_reference;
+    typedef typename value_allocator_type::size_type size_type;
+    typedef typename value_allocator_type::difference_type difference_type;
+    typedef typename value_allocator_type::pointer pointer;
+    typedef typename value_allocator_type::const_pointer const_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_variant_static_tag>::type
+    >::other::pointer node_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_variant_static_tag>::type
+    >::other node_allocator_type;
+
+    inline allocators()
+        : node_allocator_type()
+    {}
+
+    template <typename Alloc>
+    inline explicit allocators(Alloc const& alloc)
+        : node_allocator_type(alloc)
+    {}
+
+    inline allocators(BOOST_FWD_REF(allocators) a)
+        : node_allocator_type(boost::move(a.node_allocator()))
+    {}
+
+    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
+    {
+        node_allocator() = boost::move(a.node_allocator());
+        return *this;
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    inline allocators & operator=(allocators const& a)
+    {
+        node_allocator() = a.node_allocator();
+        return *this;
+    }
+#endif
+
+    void swap(allocators & a)
+    {
+        boost::swap(node_allocator(), a.node_allocator());
+    }
+
+    bool operator==(allocators const& a) const { return node_allocator() == a.node_allocator(); }
+    template <typename Alloc>
+    bool operator==(Alloc const& a) const { return node_allocator() == node_allocator_type(a); }
+
+    Allocator allocator() const { return Allocator(node_allocator()); }
+
+    node_allocator_type & node_allocator() { return *this; }
+    node_allocator_type const& node_allocator() const { return *this; }
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/variant_visitor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,68 @@
+// Boost.Geometry Index
+//
+// R-tree nodes static visitor related code
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_VISITOR_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_VISITOR_HPP
+
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/variant/get.hpp>
+#include <boost/variant/variant.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+// nodes variants forward declarations
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct variant_internal_node;
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct variant_leaf;
+
+// nodes conversion
+
+template <typename V, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+inline V & get(
+    boost::variant<
+        variant_leaf<Value, Parameters, Box, Allocators, Tag>,
+        variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+    > & v)
+{
+    return boost::get<V>(v);
+}
+
+// apply visitor
+
+template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+inline void apply_visitor(Visitor & v,
+                          boost::variant<
+                              variant_leaf<Value, Parameters, Box, Allocators, Tag>,
+                              variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+                          > & n)
+{
+    boost::apply_visitor(v, n);
+}
+
+template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+inline void apply_visitor(Visitor & v,
+                          boost::variant<
+                              variant_leaf<Value, Parameters, Box, Allocators, Tag>,
+                              variant_internal_node<Value, Parameters, Box, Allocators, Tag>
+                          > const& n)
+{
+    boost::apply_visitor(v, n);
+}
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_VISITOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_dynamic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,294 @@
+// Boost.Geometry Index
+//
+// R-tree nodes based on static conversion, storing dynamic-size containers
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_DYNAMIC_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_DYNAMIC_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct weak_internal_node
+    : public weak_node<Value, Parameters, Box, Allocators, Tag>
+{
+    typedef boost::container::vector
+        <
+            rtree::ptr_pair<Box, typename Allocators::node_pointer>,
+            typename Allocators::internal_node_allocator_type::template rebind
+                <
+                    rtree::ptr_pair<Box, typename Allocators::node_pointer>
+                >::other
+        > elements_type;
+
+    template <typename Al>
+    inline weak_internal_node(Al const& al)
+        : elements(al)
+    {}
+
+    elements_type elements;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct weak_leaf
+    : public weak_node<Value, Parameters, Box, Allocators, Tag>
+{
+    typedef boost::container::vector
+        <
+            Value,
+            typename Allocators::leaf_allocator_type::template rebind
+                <
+                    Value
+                >::other
+        > elements_type;
+
+    template <typename Al>
+    inline weak_leaf(Al const& al)
+        : elements(al)
+    {}
+
+    elements_type elements;
+};
+
+// nodes traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct node<Value, Parameters, Box, Allocators, node_weak_dynamic_tag>
+{
+    typedef weak_node<Value, Parameters, Box, Allocators, node_weak_dynamic_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct internal_node<Value, Parameters, Box, Allocators, node_weak_dynamic_tag>
+{
+    typedef weak_internal_node<Value, Parameters, Box, Allocators, node_weak_dynamic_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct leaf<Value, Parameters, Box, Allocators, node_weak_dynamic_tag>
+{
+    typedef weak_leaf<Value, Parameters, Box, Allocators, node_weak_dynamic_tag> type;
+};
+
+// visitor traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
+struct visitor<Value, Parameters, Box, Allocators, node_weak_dynamic_tag, IsVisitableConst>
+{
+    typedef weak_visitor<Value, Parameters, Box, Allocators, node_weak_dynamic_tag, IsVisitableConst> type;
+};
+
+// allocators
+
+template <typename Allocator, typename Value, typename Parameters, typename Box>
+class allocators<Allocator, Value, Parameters, Box, node_weak_dynamic_tag>
+    : public Allocator::template rebind<
+        typename internal_node<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_weak_dynamic_tag>,
+            node_weak_dynamic_tag
+        >::type
+    >::other
+    , public Allocator::template rebind<
+        typename leaf<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_weak_dynamic_tag>,
+            node_weak_dynamic_tag
+        >::type
+    >::other
+{
+    typedef typename Allocator::template rebind<
+        Value
+    >::other value_allocator_type;
+
+public:
+    typedef Allocator allocator_type;
+    
+    typedef Value value_type;
+    typedef typename value_allocator_type::reference reference;
+    typedef typename value_allocator_type::const_reference const_reference;
+    typedef typename value_allocator_type::size_type size_type;
+    typedef typename value_allocator_type::difference_type difference_type;
+    typedef typename value_allocator_type::pointer pointer;
+    typedef typename value_allocator_type::const_pointer const_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_weak_dynamic_tag>::type
+    >::other::pointer node_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename internal_node<Value, Parameters, Box, allocators, node_weak_dynamic_tag>::type
+    >::other internal_node_allocator_type;
+
+    typedef typename Allocator::template rebind<
+        typename leaf<Value, Parameters, Box, allocators, node_weak_dynamic_tag>::type
+    >::other leaf_allocator_type;
+
+    inline allocators()
+        : internal_node_allocator_type()
+        , leaf_allocator_type()
+    {}
+
+    template <typename Alloc>
+    inline explicit allocators(Alloc const& alloc)
+        : internal_node_allocator_type(alloc)
+        , leaf_allocator_type(alloc)
+    {}
+
+    inline allocators(BOOST_FWD_REF(allocators) a)
+        : internal_node_allocator_type(boost::move(a.internal_node_allocator()))
+        , leaf_allocator_type(boost::move(a.leaf_allocator()))
+    {}
+
+    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
+    {
+        internal_node_allocator() = ::boost::move(a.internal_node_allocator());
+        leaf_allocator() = ::boost::move(a.leaf_allocator());
+        return *this;
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    inline allocators & operator=(allocators const& a)
+    {
+        internal_node_allocator() = a.internal_node_allocator();
+        leaf_allocator() = a.leaf_allocator();
+        return *this;
+    }
+#endif
+
+    void swap(allocators & a)
+    {
+        boost::swap(internal_node_allocator(), a.internal_node_allocator());
+        boost::swap(leaf_allocator(), a.leaf_allocator());
+    }
+
+    bool operator==(allocators const& a) const { return leaf_allocator() == a.leaf_allocator(); }
+    template <typename Alloc>
+    bool operator==(Alloc const& a) const { return leaf_allocator() == leaf_allocator_type(a); }
+
+    Allocator allocator() const { return Allocator(leaf_allocator()); }
+
+    internal_node_allocator_type & internal_node_allocator() { return *this; }
+    internal_node_allocator_type const& internal_node_allocator() const { return *this; }
+    leaf_allocator_type & leaf_allocator() { return *this; }
+    leaf_allocator_type const& leaf_allocator() const { return *this; }
+};
+
+// create_node_impl
+
+template <typename BaseNodePtr, typename Node>
+struct create_weak_node
+{
+    template <typename AllocNode>
+    static inline BaseNodePtr apply(AllocNode & alloc_node)
+    {
+        typedef boost::container::allocator_traits<AllocNode> Al;
+        typedef typename Al::pointer P;
+
+        P p = Al::allocate(alloc_node, 1);
+
+        if ( 0 == p )
+            throw_runtime_error("boost::geometry::index::rtree node creation failed");
+
+        scoped_deallocator<AllocNode> deallocator(p, alloc_node);
+
+        Al::construct(alloc_node, boost::addressof(*p), alloc_node);
+
+        deallocator.release();
+        return p;
+    }
+};
+
+// destroy_node_impl
+
+template <typename Node>
+struct destroy_weak_node
+{
+    template <typename AllocNode, typename BaseNodePtr>
+    static inline void apply(AllocNode & alloc_node, BaseNodePtr n)
+    {
+        typedef boost::container::allocator_traits<AllocNode> Al;
+        typedef typename Al::pointer P;
+
+        P p(&static_cast<Node&>(rtree::get<Node>(*n)));
+        Al::destroy(alloc_node, boost::addressof(*p));
+        Al::deallocate(alloc_node, p, 1);
+    }
+};
+
+// create_node
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+    Allocators,
+    weak_internal_node<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline typename Allocators::node_pointer
+    apply(Allocators & allocators)
+    {
+        return create_weak_node<
+            typename Allocators::node_pointer,
+            weak_internal_node<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.internal_node_allocator());
+    }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+    Allocators,
+    weak_leaf<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline typename Allocators::node_pointer
+    apply(Allocators & allocators)
+    {
+        return create_weak_node<
+            typename Allocators::node_pointer,
+            weak_leaf<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.leaf_allocator());
+    }
+};
+
+// destroy_node
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+    Allocators,
+    weak_internal_node<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
+    {
+        destroy_weak_node<
+            weak_internal_node<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.internal_node_allocator(), n);
+    }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+    Allocators,
+    weak_leaf<Value, Parameters, Box, Allocators, Tag>
+>
+{
+    static inline void apply(Allocators & allocators, typename Allocators::node_pointer n)
+    {
+        destroy_weak_node<
+            weak_leaf<Value, Parameters, Box, Allocators, Tag>
+        >::apply(allocators.leaf_allocator(), n);
+    }
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_DYNAMIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_static.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,174 @@
+// Boost.Geometry Index
+//
+// R-tree nodes based on static conversion, storing static-size containers
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_STATIC_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_STATIC_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct weak_internal_node<Value, Parameters, Box, Allocators, node_weak_static_tag>
+    : public weak_node<Value, Parameters, Box, Allocators, node_weak_static_tag>
+{
+    typedef detail::varray<
+        rtree::ptr_pair<Box, typename Allocators::node_pointer>,
+        Parameters::max_elements + 1
+    > elements_type;
+
+    template <typename Alloc>
+    inline weak_internal_node(Alloc const&) {}
+
+    elements_type elements;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct weak_leaf<Value, Parameters, Box, Allocators, node_weak_static_tag>
+    : public weak_node<Value, Parameters, Box, Allocators, node_weak_static_tag>
+{
+    typedef detail::varray<
+        Value,
+        Parameters::max_elements + 1
+    > elements_type;
+
+    template <typename Alloc>
+    inline weak_leaf(Alloc const&) {}
+
+    elements_type elements;
+};
+
+// nodes traits
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct node<Value, Parameters, Box, Allocators, node_weak_static_tag>
+{
+    typedef weak_node<Value, Parameters, Box, Allocators, node_weak_static_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct internal_node<Value, Parameters, Box, Allocators, node_weak_static_tag>
+{
+    typedef weak_internal_node<Value, Parameters, Box, Allocators, node_weak_static_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators>
+struct leaf<Value, Parameters, Box, Allocators, node_weak_static_tag>
+{
+    typedef weak_leaf<Value, Parameters, Box, Allocators, node_weak_static_tag> type;
+};
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
+struct visitor<Value, Parameters, Box, Allocators, node_weak_static_tag, IsVisitableConst>
+{
+    typedef weak_visitor<Value, Parameters, Box, Allocators, node_weak_static_tag, IsVisitableConst> type;
+};
+
+// allocators
+
+template <typename Allocator, typename Value, typename Parameters, typename Box>
+class allocators<Allocator, Value, Parameters, Box, node_weak_static_tag>
+    : public Allocator::template rebind<
+        typename internal_node<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_weak_static_tag>,
+            node_weak_static_tag
+        >::type
+    >::other
+    , public Allocator::template rebind<
+        typename leaf<
+            Value, Parameters, Box,
+            allocators<Allocator, Value, Parameters, Box, node_weak_static_tag>,
+            node_weak_static_tag
+        >::type
+    >::other
+{
+    typedef typename Allocator::template rebind<
+        Value
+    >::other value_allocator_type;
+
+public:
+    typedef Allocator allocator_type;
+
+    typedef Value value_type;
+    typedef value_type & reference;
+    typedef const value_type & const_reference;
+    typedef typename value_allocator_type::size_type size_type;
+    typedef typename value_allocator_type::difference_type difference_type;
+    typedef typename value_allocator_type::pointer pointer;
+    typedef typename value_allocator_type::const_pointer const_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename node<Value, Parameters, Box, allocators, node_weak_static_tag>::type
+    >::other::pointer node_pointer;
+
+    typedef typename Allocator::template rebind<
+        typename internal_node<Value, Parameters, Box, allocators, node_weak_static_tag>::type
+    >::other internal_node_allocator_type;
+
+    typedef typename Allocator::template rebind<
+        typename leaf<Value, Parameters, Box, allocators, node_weak_static_tag>::type
+    >::other leaf_allocator_type;
+
+    inline allocators()
+        : internal_node_allocator_type()
+        , leaf_allocator_type()
+    {}
+
+    template <typename Alloc>
+    inline explicit allocators(Alloc const& alloc)
+        : internal_node_allocator_type(alloc)
+        , leaf_allocator_type(alloc)
+    {}
+
+    inline allocators(BOOST_FWD_REF(allocators) a)
+        : internal_node_allocator_type(boost::move(a.internal_node_allocator()))
+        , leaf_allocator_type(boost::move(a.leaf_allocator()))
+    {}
+
+    inline allocators & operator=(BOOST_FWD_REF(allocators) a)
+    {
+        internal_node_allocator() = ::boost::move(a.internal_node_allocator());
+        leaf_allocator() = ::boost::move(a.leaf_allocator());
+        return *this;
+    }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    inline allocators & operator=(allocators const& a)
+    {
+        internal_node_allocator() = a.internal_node_allocator();
+        leaf_allocator() = a.leaf_allocator();
+        return *this;
+    }
+#endif
+
+    void swap(allocators & a)
+    {
+        boost::swap(internal_node_allocator(), a.internal_node_allocator());
+        boost::swap(leaf_allocator(), a.leaf_allocator());
+    }
+
+    bool operator==(allocators const& a) const { return leaf_allocator() == a.leaf_allocator(); }
+    template <typename Alloc>
+    bool operator==(Alloc const& a) const { return leaf_allocator() == leaf_allocator_type(a); }
+
+    Allocator allocator() const { return Allocator(leaf_allocator()); }
+
+    internal_node_allocator_type & internal_node_allocator() { return *this; }
+    internal_node_allocator_type const& internal_node_allocator() const { return *this; }
+    leaf_allocator_type & leaf_allocator() { return *this; }
+    leaf_allocator_type const& leaf_allocator() const{ return *this; }
+};
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_STATIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/node/weak_visitor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+// Boost.Geometry Index
+//
+// R-tree nodes weak visitor and nodes base type
+//
+// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_VISITOR_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_VISITOR_HPP
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree {
+
+// empty visitor
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag, bool IsVisitableConst>
+struct weak_visitor {};
+
+// node
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct weak_node {};
+
+// nodes variants forward declarations
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct weak_internal_node;
+
+template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+struct weak_leaf;
+
+// nodes conversion
+
+template <typename Derived, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+inline Derived & get(weak_node<Value, Parameters, Box, Allocators, Tag> & n)
+{
+    return static_cast<Derived&>(n);
+}
+
+// apply visitor
+
+template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag>
+inline void apply_visitor(Visitor & v,
+                          weak_node<Value, Parameters, Box, Allocators, Tag> & n,
+                          bool is_internal_node)
+{
+    BOOST_GEOMETRY_INDEX_ASSERT(&n, "null ptr");
+    if ( is_internal_node )
+    {
+        typedef weak_internal_node<Value, Parameters, Box, Allocators, Tag> internal_node;
+        v(get<internal_node>(n));
+    }
+    else
+    {
+        typedef weak_leaf<Value, Parameters, Box, Allocators, Tag> leaf;
+        v(get<leaf>(n));
+    }
+}
+
+}} // namespace detail::rtree
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_DYNAMIC_VISITOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/rtree/utilities/are_counts_ok.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,110 @@
+// Boost.Geometry Index
+//
+// R-tree nodes elements numbers validating visitor implementation
+//
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP
+
+#include <boost/geometry/index/detail/rtree/node/node.hpp>
+
+namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities {
+
+namespace visitors {
+
+template <typename Value, typename Options, typename Box, typename Allocators>
+class are_counts_ok
+    : public rtree::visitor<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag, true>::type
+{
+    typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
+    typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
+    typedef typename Options::parameters_type parameters_type;
+
+public:
+    inline are_counts_ok(parameters_type const& parameters)
+        : result(true), m_current_level(0), m_parameters(parameters)
+    {}
+
+    inline void operator()(internal_node const& n)
+    {
+        typedef typename rtree::elements_type<internal_node>::type elements_type;
+        elements_type const& elements = rtree::elements(n);
+
+        // root internal node shouldn't contain 0 elements
+        if ( elements.empty()
+          || !check_count(elements) )
+        {
+            result = false;
+            return;
+        }
+
+        size_t current_level_backup = m_current_level;
+        ++m_current_level;
+
+        for ( typename elements_type::const_iterator it = elements.begin();
+              it != elements.end() && result == true ;
+              ++it)
+        {
+            rtree::apply_visitor(*this, *it->second);
+        }
+
+        m_current_level = current_level_backup;
+    }
+
+    inline void operator()(leaf const& n)
+    {
+        typedef typename rtree::elements_type<leaf>::type elements_type;
+        elements_type const& elements = rtree::elements(n);
+
+        // empty leaf in non-root node
+        if ( ( m_current_level > 0 && elements.empty() )
+          || !check_count(elements) )
+        {
+            result = false;
+        }
+    }
+
+    bool result;
+
+private:
+    template <typename Elements>
+    bool check_count(Elements const& elements)
+    {
+        // root may contain count < min but should never contain count > max
+        return elements.size() <= m_parameters.get_max_elements()
+            && ( elements.size() >= m_parameters.get_min_elements()
+              || m_current_level == 0 );
+    }
+
+    size_t m_current_level;
+    parameters_type const& m_parameters;
+};
+
+} // namespace visitors
+
+template <typename Rtree> inline
+bool are_counts_ok(Rtree const& tree)
+{
+    typedef utilities::view<Rtree> RTV;
+    RTV rtv(tree);
+
+    visitors::are_counts_ok<
+        typename RTV::value_type,
+        typename RTV::options_type,
+        typename RTV::box_type,
+        typename RTV::allocators_type
+    > v(tree.parameters());
+    
+    rtv.apply_visitor(v);
+
+    return v.result;
+}
+
+}}}}}} // namespace boost::geometry::index::detail::rtree::utilities
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_ARE_COUNTS_OK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/concatenate_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,154 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
+
+#include <boost/assert.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/iterator.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/iterator/iterator_categories.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+
+template
+<
+    typename Iterator1,
+    typename Iterator2,
+    typename Value,
+    typename Reference = Value&
+>
+class concatenate_iterator
+    : public boost::iterator_facade
+        <
+            concatenate_iterator<Iterator1, Iterator2, Value, Reference>,
+            Value,
+            boost::bidirectional_traversal_tag,
+            Reference
+        >
+{
+private:
+    Iterator1 m_it1, m_end1;
+    Iterator2 m_begin2, m_it2;
+
+public:
+    typedef Iterator1 first_iterator_type;
+    typedef Iterator2 second_iterator_type;
+
+    // default constructor
+    concatenate_iterator() {}
+
+    // for begin
+    concatenate_iterator(Iterator1 it1, Iterator1 end1,
+                         Iterator2 begin2, Iterator2 it2)
+        : m_it1(it1), m_end1(end1), m_begin2(begin2), m_it2(it2)
+    {}
+
+    // for end
+    concatenate_iterator(Iterator1 end1, Iterator2 begin2, Iterator2 end2)
+        : m_it1(end1), m_end1(end1), m_begin2(begin2), m_it2(end2)
+    {}
+
+    template
+    <
+        typename OtherIt1,
+        typename OtherIt2,
+        typename OtherValue,
+        typename OtherReference
+    >
+    concatenate_iterator(concatenate_iterator
+                         <
+                             OtherIt1,
+                             OtherIt2,
+                             OtherValue,
+                             OtherReference
+                         > const& other)
+        : m_it1(other.m_it1)
+        , m_end1(other.m_end1)
+        , m_begin2(other.m_begin2)
+        , m_it2(other.m_it2)
+    {
+        static const bool are_conv
+            = boost::is_convertible<OtherIt1, Iterator1>::value
+           && boost::is_convertible<OtherIt2, Iterator2>::value;
+
+        BOOST_MPL_ASSERT_MSG((are_conv),
+                             NOT_CONVERTIBLE,
+                             (types<OtherIt1, OtherIt2>));
+    }
+
+private:
+    friend class boost::iterator_core_access;
+
+    template <typename It1, typename It2, typename V, typename R>
+    friend class concatenate_iterator;
+
+    inline Reference dereference() const
+    {
+        if ( m_it1 == m_end1 )
+        {
+            return *m_it2;
+        }
+        return *m_it1;
+    }
+
+    template
+    <
+        typename OtherIt1,
+        typename OtherIt2,
+        typename OtherValue,
+        typename OtherReference
+    >
+    inline bool equal(concatenate_iterator
+                      <
+                          OtherIt1,
+                          OtherIt2,
+                          OtherValue,
+                          OtherReference
+                      > const& other) const
+    {
+        return m_it1 == other.m_it1 && m_it2 == other.m_it2;
+    }
+
+    inline void increment()
+    {
+        if ( m_it1 == m_end1 )
+        {
+            ++m_it2;
+        }
+        else
+        {
+            ++m_it1;
+        }
+    }
+
+    inline void decrement()
+    {
+        if ( m_it2 == m_begin2 )
+        {
+            --m_it1;
+        }
+        else
+        {
+            --m_it2;
+        }
+    }
+};
+
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
+
+#include <boost/range.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace point_iterator
+{
+
+
+template
+<
+    typename Geometry, 
+    typename Tag = typename tag<Geometry>::type
+>
+struct inner_range_type
+{
+    typedef typename boost::mpl::if_c
+        <
+            !boost::is_const<Geometry>::type::value,
+            typename boost::range_value<Geometry>::type,
+            typename boost::range_value<Geometry>::type const
+        >::type type;
+};
+
+
+template <typename Polygon>
+struct inner_range_type<Polygon, polygon_tag>
+{
+    typedef typename boost::mpl::if_c
+        <
+            !boost::is_const<Polygon>::type::value,
+            typename geometry::ring_type<Polygon>::type,
+            typename geometry::ring_type<Polygon>::type const
+        >::type type;
+};
+
+
+}} // namespace detail::point_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/iterator_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,136 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/iterators/flatten_iterator.hpp>
+#include <boost/geometry/iterators/concatenate_iterator.hpp>
+
+#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
+#include <boost/geometry/iterators/detail/point_iterator/value_type.hpp>
+
+#include <boost/geometry/iterators/dispatch/point_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace point_iterator
+{
+
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct iterator_type
+    : not_implemented<Geometry>
+{};
+
+
+
+
+template <typename Linestring>
+struct iterator_type<Linestring, linestring_tag>
+{
+    typedef typename boost::range_iterator<Linestring>::type type;
+};
+
+
+template <typename Ring>
+struct iterator_type<Ring, ring_tag>
+{
+    typedef typename boost::range_iterator<Ring>::type type;
+};
+
+
+template <typename Polygon>
+class iterator_type<Polygon, polygon_tag>
+{
+private:
+    typedef typename inner_range_type<Polygon>::type inner_range;
+
+public:
+    typedef concatenate_iterator
+        <
+            typename boost::range_iterator<inner_range>::type,
+            flatten_iterator
+                <
+                    typename boost::range_iterator
+                        <
+                            typename geometry::interior_type<Polygon>::type
+                        >::type,
+                    typename iterator_type<inner_range>::type,
+                    typename value_type<Polygon>::type,
+                    dispatch::points_begin<inner_range>,
+                    dispatch::points_end<inner_range>
+                >,
+            typename value_type<Polygon>::type
+        > type;
+};
+
+
+template <typename MultiPoint>
+struct iterator_type<MultiPoint, multi_point_tag>
+{
+    typedef typename boost::range_iterator<MultiPoint>::type type;
+};
+
+
+template <typename MultiLinestring>
+class iterator_type<MultiLinestring, multi_linestring_tag>
+{
+private:
+    typedef typename inner_range_type<MultiLinestring>::type inner_range;
+
+public:
+    typedef flatten_iterator
+        <
+            typename boost::range_iterator<MultiLinestring>::type,
+            typename iterator_type<inner_range>::type,
+            typename value_type<MultiLinestring>::type,
+            dispatch::points_begin<inner_range>,
+            dispatch::points_end<inner_range>
+        > type;
+};
+
+
+template <typename MultiPolygon>
+class iterator_type<MultiPolygon, multi_polygon_tag>
+{
+private:
+    typedef typename inner_range_type<MultiPolygon>::type inner_range;
+
+public:
+    typedef flatten_iterator
+        <
+            typename boost::range_iterator<MultiPolygon>::type,
+            typename iterator_type<inner_range>::type,
+            typename value_type<MultiPolygon>::type,
+            dispatch::points_begin<inner_range>,
+            dispatch::points_end<inner_range>
+        > type;
+};
+
+
+}} // namespace detail::point_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/point_iterator/value_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
+
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace point_iterator
+{
+
+
+template <typename Geometry>
+struct value_type
+{
+    typedef typename boost::mpl::if_c
+        <
+            !boost::is_const<Geometry>::type::value,
+            typename geometry::point_type<Geometry>::type,
+            typename geometry::point_type<Geometry>::type const
+        >::type type;
+};
+
+
+}} // namespace detail::point_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/iterator_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,153 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/interior_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/core/ring_type.hpp>
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+#include <boost/geometry/iterators/concatenate_iterator.hpp>
+#include <boost/geometry/iterators/flatten_iterator.hpp>
+#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
+
+#include <boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp>
+#include <boost/geometry/iterators/detail/segment_iterator/value_type.hpp>
+
+#include <boost/geometry/iterators/dispatch/segment_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace segment_iterator
+{
+
+
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct iterator_type
+    : not_implemented<Geometry>
+{};
+
+
+template <typename Linestring>
+struct iterator_type<Linestring, linestring_tag>
+{
+    typedef range_segment_iterator
+        <
+            Linestring, typename value_type<Linestring>::type
+        > type;
+};
+
+
+template <typename Ring>
+struct iterator_type<Ring, ring_tag>
+{
+    typedef range_segment_iterator
+        <
+            Ring, typename value_type<Ring>::type
+        > type;
+};
+
+
+template <typename Polygon>
+class iterator_type<Polygon, polygon_tag>
+{
+private:
+    typedef typename detail::point_iterator::inner_range_type
+        <
+            Polygon
+        >::type inner_range;
+
+public:
+    typedef concatenate_iterator
+        <
+            range_segment_iterator
+                <
+                    inner_range,
+                    typename value_type<Polygon>::type
+                >,
+            flatten_iterator
+                <
+                    typename boost::range_iterator
+                        <
+                            typename geometry::interior_type<Polygon>::type
+                        >::type,
+                    typename iterator_type<inner_range>::type,
+                    typename value_type<Polygon>::type,
+                    dispatch::segments_begin<inner_range>,
+                    dispatch::segments_end<inner_range>,
+                    typename value_type<Polygon>::type
+                >,
+            typename value_type<Polygon>::type,
+            typename value_type<Polygon>::type
+        > type;
+};
+
+
+template <typename MultiLinestring>
+class iterator_type<MultiLinestring, multi_linestring_tag>
+{
+private:
+    typedef typename detail::point_iterator::inner_range_type
+        <
+            MultiLinestring
+        >::type inner_range;
+
+public:
+    typedef flatten_iterator
+        <
+            typename boost::range_iterator<MultiLinestring>::type,
+            typename iterator_type<inner_range>::type,
+            typename value_type<MultiLinestring>::type,
+            dispatch::segments_begin<inner_range>,
+            dispatch::segments_end<inner_range>,
+            typename value_type<MultiLinestring>::type
+        > type;
+};
+
+
+template <typename MultiPolygon>
+class iterator_type<MultiPolygon, multi_polygon_tag>
+{
+private:
+    typedef typename detail::point_iterator::inner_range_type
+        <
+            MultiPolygon
+        >::type inner_range;
+public:
+    typedef flatten_iterator
+        <
+            typename boost::range_iterator<MultiPolygon>::type,
+            typename iterator_type<inner_range>::type,
+            typename value_type<MultiPolygon>::type,
+            dispatch::segments_begin<inner_range>,
+            dispatch::segments_end<inner_range>,
+            typename value_type<MultiPolygon>::type
+        > type;
+};
+
+
+
+}} // namespace detail::segment_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,215 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/iterator.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/iterator/iterator_categories.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/iterators/closing_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace segment_iterator
+{
+
+
+template <typename Range, closure_selector Closure = closure<Range>::value>
+struct range_iterator_type
+{
+    typedef typename boost::range_iterator<Range>::type type;
+};
+
+template <typename Range>
+struct range_iterator_type<Range, open>
+{
+    typedef closing_iterator<Range> type;
+};
+
+
+
+template <typename Range, closure_selector Closure = closure<Range>::value>
+struct range_iterator_begin
+{
+    static inline typename range_iterator_type<Range, Closure>::type
+    apply(Range& range)
+    {
+        return boost::begin(range);
+    }
+};
+
+template <typename Range>
+struct range_iterator_begin<Range, open>
+{
+    static inline typename range_iterator_type<Range, open>::type
+    apply(Range& range)
+    {
+        return closing_iterator<Range>(range);
+    }
+};
+
+
+
+template <typename Range, closure_selector Closure = closure<Range>::value>
+struct range_iterator_end
+{
+    static inline typename range_iterator_type<Range, Closure>::type
+    apply(Range& range)
+    {
+        return boost::end(range);
+    }
+};
+
+template <typename Range>
+struct range_iterator_end<Range, open>
+{
+    static inline typename range_iterator_type<Range, open>::type
+    apply(Range& range)
+    {
+        return closing_iterator<Range>(range, true);
+    }
+};
+
+
+
+
+
+
+template <typename Range, typename Value, typename Reference = Value>
+class range_segment_iterator
+    : public boost::iterator_facade
+        <
+            range_segment_iterator<Range, Value, Reference>,
+            Value,
+            boost::bidirectional_traversal_tag,
+            Reference
+        >
+{
+    static inline bool has_less_than_two_elements(Range const& r)
+    {
+        return boost::size(r) < ((closure<Range>::value == open) ? 1u : 2u);
+    }
+
+public:
+    typedef typename range_iterator_type<Range>::type iterator_type;
+
+    // default constructor
+    range_segment_iterator()
+        : m_it(), m_has_less_than_two_elements(false)
+    {}
+
+    // for begin
+    range_segment_iterator(Range& r)
+        : m_it(range_iterator_begin<Range>::apply(r))
+        , m_has_less_than_two_elements(has_less_than_two_elements(r))
+    {}
+
+    // for end
+    range_segment_iterator(Range& r, bool)
+        : m_it(range_iterator_end<Range>::apply(r))
+        , m_has_less_than_two_elements(has_less_than_two_elements(r))
+    {
+        if (! m_has_less_than_two_elements)
+        {
+            // the range consists of at least two items
+            --m_it;
+        }
+    }
+
+    template
+    <
+        typename OtherRange,
+        typename OtherValue,
+        typename OtherReference
+    >
+    range_segment_iterator(range_segment_iterator
+                           <
+                               OtherRange,
+                               OtherValue,
+                               OtherReference
+                           > const& other)
+        : m_it(other.m_it)
+    {
+        typedef typename range_segment_iterator
+            <
+                OtherRange, OtherValue, OtherReference
+            >::iterator_type other_iterator_type;
+
+        static const bool are_conv
+            = boost::is_convertible<other_iterator_type, iterator_type>::value;
+
+        BOOST_MPL_ASSERT_MSG((are_conv), NOT_CONVERTIBLE, (types<OtherRange>));
+    }
+
+private:
+    friend class boost::iterator_core_access;
+
+    template <typename Rng, typename V, typename R>
+    friend class range_segment_iterator;
+
+    inline Reference dereference() const
+    {
+        if (m_has_less_than_two_elements)
+        {
+            return Reference(*m_it, *m_it);
+        }
+
+        iterator_type next(m_it);
+        ++next;
+        return Reference(*m_it, *next);
+    }
+
+    template
+    <
+        typename OtherRange,
+        typename OtherValue,
+        typename OtherReference
+    >
+    inline bool equal(range_segment_iterator
+                      <
+                          OtherRange,
+                          OtherValue,
+                          OtherReference
+                      > const& other) const
+    {
+        return m_it == other.m_it;
+    }
+
+    inline void increment()
+    {
+        ++m_it;
+    }
+
+    inline void decrement()
+    {
+        --m_it;
+    }
+
+private:
+    iterator_type m_it;
+    bool m_has_less_than_two_elements;
+};
+
+
+}} // namespace detail::segment_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/detail/segment_iterator/value_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,43 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
+#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
+
+#include <boost/geometry/iterators/detail/point_iterator/value_type.hpp>
+#include <boost/geometry/geometries/pointing_segment.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace segment_iterator
+{
+
+template <typename Geometry>
+struct value_type
+{
+    typedef typename detail::point_iterator::value_type
+        <
+            Geometry
+        >::type point_iterator_value_type;
+
+    typedef geometry::model::pointing_segment
+        <
+            point_iterator_value_type
+        > type;
+};
+
+}} // namespace detail::segment_iterator
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/dispatch/point_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// dispatch for points_begin
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct points_begin
+    : not_implemented<Geometry>
+{};
+
+
+
+// dispatch for points_end
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct points_end
+    : not_implemented<Geometry>
+{};
+
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/dispatch/segment_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// dispatch for segments_begin
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct segments_begin
+    : not_implemented<Geometry>
+{};
+
+
+
+// dispatch for segments_end
+template <typename Geometry, typename Tag = typename tag<Geometry>::type>
+struct segments_end
+    : not_implemented<Geometry>
+{};
+
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/flatten_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,232 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
+
+#include <boost/assert.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/iterator.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/iterator/iterator_categories.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+
+template
+<
+    typename OuterIterator,
+    typename InnerIterator,
+    typename Value,
+    typename AccessInnerBegin,
+    typename AccessInnerEnd,
+    typename Reference = Value&
+>
+class flatten_iterator
+    : public boost::iterator_facade
+        <
+            flatten_iterator
+                <
+                    OuterIterator,
+                    InnerIterator,
+                    Value,
+                    AccessInnerBegin,
+                    AccessInnerEnd,
+                    Reference
+                >,
+            Value,
+            boost::bidirectional_traversal_tag,
+            Reference
+        >
+{
+private:
+    OuterIterator m_outer_it, m_outer_end;
+    InnerIterator m_inner_it;
+
+public:
+    typedef OuterIterator outer_iterator_type;
+    typedef InnerIterator inner_iterator_type;
+
+    // default constructor
+    flatten_iterator() {}
+
+    // for begin
+    flatten_iterator(OuterIterator outer_it, OuterIterator outer_end)
+        : m_outer_it(outer_it), m_outer_end(outer_end)
+    {
+        advance_through_empty();
+    }
+
+    // for end
+    flatten_iterator(OuterIterator outer_end)
+        : m_outer_it(outer_end), m_outer_end(outer_end)
+    {}
+
+    template
+    <
+        typename OtherOuterIterator, typename OtherInnerIterator,
+        typename OtherValue,
+        typename OtherAccessInnerBegin, typename OtherAccessInnerEnd,
+        typename OtherReference
+    >
+    flatten_iterator(flatten_iterator
+                     <
+                         OtherOuterIterator,
+                         OtherInnerIterator,
+                         OtherValue,
+                         OtherAccessInnerBegin,
+                         OtherAccessInnerEnd,
+                         OtherReference
+                     > const& other)
+        : m_outer_it(other.m_outer_it),
+          m_outer_end(other.m_outer_end),
+          m_inner_it(other.m_inner_it)
+    {
+        static const bool are_conv
+            = boost::is_convertible
+                <
+                    OtherOuterIterator, OuterIterator
+                >::value
+           && boost::is_convertible
+                <
+                    OtherInnerIterator, InnerIterator
+                >::value;
+
+        BOOST_MPL_ASSERT_MSG((are_conv),
+                             NOT_CONVERTIBLE,
+                             (types<OtherOuterIterator, OtherInnerIterator>));
+    }
+
+    flatten_iterator& operator=(flatten_iterator const& other)
+    {
+        m_outer_it = other.m_outer_it;
+        m_outer_end = other.m_outer_end;
+        // avoid assigning an iterator having singular value
+        if ( other.m_outer_it != other.m_outer_end )
+        {
+            m_inner_it = other.m_inner_it;
+        }
+        return *this;
+    }
+
+private:
+    friend class boost::iterator_core_access;
+
+    template
+    <
+        typename Outer,
+        typename Inner,
+        typename V,
+        typename InnerBegin,
+        typename InnerEnd,
+        typename R
+    >
+    friend class flatten_iterator;
+
+    static inline bool empty(OuterIterator outer_it)
+    {
+        return AccessInnerBegin::apply(*outer_it)
+            == AccessInnerEnd::apply(*outer_it);
+    }
+
+    inline void advance_through_empty()
+    {
+        while ( m_outer_it != m_outer_end && empty(m_outer_it) )
+        {
+            ++m_outer_it;
+        }
+
+        if ( m_outer_it != m_outer_end )
+        {
+            m_inner_it = AccessInnerBegin::apply(*m_outer_it);
+        }
+    }
+
+    inline Reference dereference() const
+    {
+        BOOST_ASSERT( m_outer_it != m_outer_end );
+        BOOST_ASSERT( m_inner_it != AccessInnerEnd::apply(*m_outer_it) );
+        return *m_inner_it;
+    }
+
+
+    template
+    <
+        typename OtherOuterIterator,
+        typename OtherInnerIterator,
+        typename OtherValue,
+        typename OtherAccessInnerBegin,
+        typename OtherAccessInnerEnd,
+        typename OtherReference
+    >
+    inline bool equal(flatten_iterator
+                      <
+                          OtherOuterIterator,
+                          OtherInnerIterator,
+                          OtherValue,
+                          OtherAccessInnerBegin,
+                          OtherAccessInnerEnd,
+                          OtherReference
+                      > const& other) const
+    {
+        if ( m_outer_it != other.m_outer_it )
+        {
+            return false;
+        }
+
+        if ( m_outer_it == m_outer_end )
+        {
+            return true;
+        }
+
+        return m_inner_it == other.m_inner_it;
+    }
+
+    inline void increment()
+    {
+        BOOST_ASSERT( m_outer_it != m_outer_end );
+        BOOST_ASSERT( m_inner_it != AccessInnerEnd::apply(*m_outer_it) );
+
+        ++m_inner_it;
+        if ( m_inner_it == AccessInnerEnd::apply(*m_outer_it) )
+        {
+            ++m_outer_it;
+            advance_through_empty();
+        }
+    }
+
+    inline void decrement()
+    {
+        if ( m_outer_it == m_outer_end
+             || m_inner_it == AccessInnerBegin::apply(*m_outer_it) )
+        {
+            do
+            {
+                --m_outer_it;
+            }
+            while ( empty(m_outer_it) );
+            m_inner_it = --AccessInnerEnd::apply(*m_outer_it);
+        }
+        else
+        {
+            --m_inner_it;
+        }
+    }
+};
+
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/has_one_element.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
+#define BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
+
+
+namespace boost { namespace geometry
+{
+
+
+// free function to test if an iterator range has a single element
+template <typename Iterator>
+inline bool has_one_element(Iterator first, Iterator beyond)
+{
+    return first != beyond && ++first == beyond;
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/point_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,309 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
+
+#include <boost/assert.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/iterators/dispatch/point_iterator.hpp>
+#include <boost/geometry/iterators/detail/point_iterator/iterator_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// specializations for points_begin
+
+
+template <typename Linestring>
+struct points_begin<Linestring, linestring_tag>
+{
+    static inline typename detail::point_iterator::iterator_type
+        <
+            Linestring
+        >::type
+    apply(Linestring& linestring)
+    {
+        return boost::begin(linestring);
+    }
+};
+
+
+template <typename Ring>
+struct points_begin<Ring, ring_tag>
+{
+    static inline typename detail::point_iterator::iterator_type<Ring>::type
+    apply(Ring& ring)
+    {
+        return boost::begin(ring);
+    }
+};
+
+
+template <typename Polygon>
+struct points_begin<Polygon, polygon_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            Polygon
+        >::type return_type;
+
+    static inline return_type apply(Polygon& polygon)
+    {
+        typedef typename return_type::second_iterator_type flatten_iterator;
+
+        return return_type
+            (boost::begin(geometry::exterior_ring(polygon)),
+             boost::end(geometry::exterior_ring(polygon)),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              ),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              )
+             );
+    }
+};
+
+
+template <typename MultiPoint>
+struct points_begin<MultiPoint, multi_point_tag>
+{
+    static inline typename detail::point_iterator::iterator_type
+        <
+            MultiPoint
+        >::type
+    apply(MultiPoint& multipoint)
+    {
+        return boost::begin(multipoint);
+    }
+};
+
+
+template <typename MultiLinestring>
+struct points_begin<MultiLinestring, multi_linestring_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            MultiLinestring
+        >::type return_type;
+
+    static inline return_type apply(MultiLinestring& multilinestring)
+    {
+        return return_type(boost::begin(multilinestring),
+                           boost::end(multilinestring));
+    }
+};
+
+
+template <typename MultiPolygon>
+struct points_begin<MultiPolygon, multi_polygon_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            MultiPolygon
+        >::type return_type;
+
+    static inline return_type apply(MultiPolygon& multipolygon)
+    {
+        return return_type(boost::begin(multipolygon),
+                           boost::end(multipolygon));
+    }
+};
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// specializations for points_end
+
+
+template <typename Linestring>
+struct points_end<Linestring, linestring_tag>
+{
+    static inline typename detail::point_iterator::iterator_type
+        <
+            Linestring
+        >::type
+    apply(Linestring& linestring)
+    {
+        return boost::end(linestring);
+    }
+};
+
+
+template <typename Ring>
+struct points_end<Ring, ring_tag>
+{
+    static inline typename detail::point_iterator::iterator_type<Ring>::type
+    apply(Ring& ring)
+    {
+        return boost::end(ring);
+    }
+};
+
+
+template <typename Polygon>
+struct points_end<Polygon, polygon_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            Polygon
+        >::type return_type;
+
+    static inline return_type apply(Polygon& polygon)
+    {
+        typedef typename return_type::second_iterator_type flatten_iterator;
+
+        return return_type
+            (boost::end(geometry::exterior_ring(polygon)),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              ),
+             flatten_iterator( boost::end(geometry::interior_rings(polygon)) )
+             );
+    }
+};
+
+
+template <typename MultiPoint>
+struct points_end<MultiPoint, multi_point_tag>
+{
+    static inline typename detail::point_iterator::iterator_type
+        <
+            MultiPoint
+        >::type
+    apply(MultiPoint& multipoint)
+    {
+        return boost::end(multipoint);
+    }
+};
+
+
+template <typename MultiLinestring>
+struct points_end<MultiLinestring, multi_linestring_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            MultiLinestring
+        >::type return_type;
+
+    static inline return_type apply(MultiLinestring& multilinestring)
+    {
+        return return_type(boost::end(multilinestring));
+    }
+};
+
+
+template <typename MultiPolygon>
+struct points_end<MultiPolygon, multi_polygon_tag>
+{
+    typedef typename detail::point_iterator::iterator_type
+        <
+            MultiPolygon
+        >::type return_type;
+
+    static inline return_type apply(MultiPolygon& multipolygon)
+    {
+        return return_type(boost::end(multipolygon));
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+class point_iterator
+    : public boost::iterator_adaptor
+        <
+            point_iterator<Geometry>,
+            typename detail::point_iterator::iterator_type<Geometry>::type
+        >
+{
+private:
+    template <typename OtherGeometry> friend class point_iterator;
+    template <typename G> friend inline point_iterator<G> points_begin(G&);
+    template <typename G> friend inline point_iterator<G> points_end(G&);
+
+    inline point_iterator(typename point_iterator::base_type const& base_it)
+        : point_iterator::iterator_adaptor_(base_it) {}
+
+public:
+    inline point_iterator() {}
+
+    template <typename OtherGeometry>
+    inline point_iterator(point_iterator<OtherGeometry> const& other)
+        : point_iterator::iterator_adaptor_(other.base())
+    {
+        static const bool is_conv
+            = boost::is_convertible<
+                typename detail::point_iterator::iterator_type
+                    <
+                        OtherGeometry
+                    >::type,
+                typename detail::point_iterator::iterator_type
+                    <
+                        Geometry
+                    >::type
+            >::value;
+
+        BOOST_MPL_ASSERT_MSG((is_conv),
+                             NOT_CONVERTIBLE,
+                             (point_iterator<OtherGeometry>));
+    }
+};
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline point_iterator<Geometry>
+points_begin(Geometry& geometry)
+{
+    return dispatch::points_begin<Geometry>::apply(geometry);
+}
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline point_iterator<Geometry>
+points_end(Geometry& geometry)
+{
+    return dispatch::points_end<Geometry>::apply(geometry);
+}
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/point_reverse_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,89 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
+
+#include <iterator>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+class point_reverse_iterator
+    : public std::reverse_iterator<point_iterator<Geometry> >
+{
+private:
+    typedef std::reverse_iterator<point_iterator<Geometry> > base_type;
+
+    template <typename OtherGeometry> friend class point_reverse_iterator;
+    template <typename G>
+    friend inline point_reverse_iterator<G> points_rbegin(G&);
+
+    template <typename G>
+    friend inline point_reverse_iterator<G> points_rend(G&);
+
+    inline point_reverse_iterator(base_type const& base_it)
+        : base_type(base_it) {}
+
+public:
+    inline point_reverse_iterator() {}
+
+    template <typename OtherGeometry>
+    inline
+    point_reverse_iterator(point_reverse_iterator<OtherGeometry> const& other)
+        : base_type(other.base())
+    {
+        static const bool is_conv = boost::is_convertible
+            <
+                std::reverse_iterator<point_iterator<Geometry> >,
+                std::reverse_iterator<point_iterator<OtherGeometry> >
+            >::value;
+
+        BOOST_MPL_ASSERT_MSG((is_conv),
+                             NOT_CONVERTIBLE,
+                             (point_reverse_iterator<OtherGeometry>));
+    }
+};
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline point_reverse_iterator<Geometry>
+points_rbegin(Geometry& geometry)
+{
+    return std::reverse_iterator
+        <
+            point_iterator<Geometry>
+        >(points_end(geometry));
+}
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline point_reverse_iterator<Geometry>
+points_rend(Geometry& geometry)
+{
+    return std::reverse_iterator
+        <
+            point_iterator<Geometry>
+        >(points_begin(geometry));
+}
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/iterators/segment_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,353 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP
+#define BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/range.hpp>
+
+#include <boost/geometry/core/exterior_ring.hpp>
+#include <boost/geometry/core/interior_rings.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
+#include <boost/geometry/iterators/detail/segment_iterator/iterator_type.hpp>
+
+#include <boost/geometry/iterators/dispatch/segment_iterator.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// specializations for segments_begin
+
+
+template <typename Linestring>
+struct segments_begin<Linestring, linestring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Linestring
+        >::type return_type;
+
+    static inline return_type apply(Linestring& linestring)
+    {
+        return return_type(linestring);
+    }
+};
+
+
+template <typename Ring>
+struct segments_begin<Ring, ring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Ring
+        >::type return_type;
+
+    static inline return_type apply(Ring& ring)
+    {
+        return return_type(ring);
+    }
+};
+
+
+template <typename Polygon>
+struct segments_begin<Polygon, polygon_tag>
+{
+    typedef typename detail::point_iterator::inner_range_type
+        <
+            Polygon
+        >::type inner_range;
+
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Polygon
+        >::type return_type;
+
+    static inline return_type apply(Polygon& polygon)
+    {
+        typedef typename return_type::second_iterator_type flatten_iterator;
+
+        return return_type
+            (segments_begin
+                 <
+                     inner_range
+                 >::apply(geometry::exterior_ring(polygon)),
+             segments_end
+                 <
+                     inner_range
+                 >::apply(geometry::exterior_ring(polygon)),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              ),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              )
+             );
+    }
+};
+
+
+template <typename MultiLinestring>
+struct segments_begin<MultiLinestring, multi_linestring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            MultiLinestring
+        >::type return_type;
+
+    static inline return_type apply(MultiLinestring& multilinestring)
+    {
+        return return_type(boost::begin(multilinestring),
+                           boost::end(multilinestring));
+    }
+};
+
+
+template <typename MultiPolygon>
+struct segments_begin<MultiPolygon, multi_polygon_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            MultiPolygon
+        >::type return_type;
+
+    static inline return_type apply(MultiPolygon& multipolygon)
+    {
+        return return_type(boost::begin(multipolygon),
+                           boost::end(multipolygon));
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+
+// specializations for segments_end
+
+
+template <typename Linestring>
+struct segments_end<Linestring, linestring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Linestring
+        >::type return_type;
+
+    static inline return_type apply(Linestring& linestring)
+    {
+        return return_type(linestring, true);
+    }
+};
+
+
+template <typename Ring>
+struct segments_end<Ring, ring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Ring
+        >::type return_type;
+
+    static inline return_type apply(Ring& ring)
+    {
+        return return_type(ring, true);
+    }
+};
+
+
+template <typename Polygon>
+struct segments_end<Polygon, polygon_tag>
+{
+    typedef typename detail::point_iterator::inner_range_type
+        <
+            Polygon
+        >::type inner_range;
+
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Polygon
+        >::type return_type;
+
+    static inline return_type apply(Polygon& polygon)
+    {
+        typedef typename return_type::second_iterator_type flatten_iterator;
+
+        return return_type
+            (segments_end
+                 <
+                     inner_range
+                 >::apply(geometry::exterior_ring(polygon)),
+             flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
+                              boost::end(geometry::interior_rings(polygon))
+                              ),
+             flatten_iterator( boost::end(geometry::interior_rings(polygon)) )
+             );
+    }
+};
+
+
+template <typename MultiLinestring>
+struct segments_end<MultiLinestring, multi_linestring_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            MultiLinestring
+        >::type return_type;
+
+    static inline return_type apply(MultiLinestring& multilinestring)
+    {
+        return return_type(boost::end(multilinestring));
+    }
+};
+
+
+template <typename MultiPolygon>
+struct segments_end<MultiPolygon, multi_polygon_tag>
+{
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            MultiPolygon
+        >::type return_type;
+
+    static inline return_type apply(MultiPolygon& multipolygon)
+    {
+        return return_type(boost::end(multipolygon));
+    }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+class segment_iterator
+    : public detail::segment_iterator::iterator_type<Geometry>::type
+{
+private:
+    typedef typename detail::segment_iterator::iterator_type
+        <
+            Geometry
+        >::type base;
+
+    inline base const* base_ptr() const
+    {
+        return this;
+    }
+
+    template <typename OtherGeometry> friend class segment_iterator;
+
+    template <typename G>
+    friend inline segment_iterator<G const> segments_begin(G const&);
+
+    template <typename G>
+    friend inline segment_iterator<G const> segments_end(G const&);
+
+    inline segment_iterator(base const& base_it) : base(base_it) {}
+
+public:
+    // The following typedef is needed for this iterator to be
+    // bidirectional.
+    // Normally we would not have to define this. However, due to the
+    // fact that the value type of the iterator is not a reference,
+    // the iterator_facade framework (used to define the base class of
+    // this iterator) degrades automatically the iterator's category
+    // to input iterator. With the following typedef we recover the
+    // correct iterator category.
+    typedef std::bidirectional_iterator_tag iterator_category;
+
+    inline segment_iterator() {}
+
+    template <typename OtherGeometry>
+    inline segment_iterator(segment_iterator<OtherGeometry> const& other)
+        : base(*other.base_ptr())
+    {
+        static const bool is_conv
+            = boost::is_convertible<
+                typename detail::segment_iterator::iterator_type
+                    <
+                        OtherGeometry
+                    >::type,
+                typename detail::segment_iterator::iterator_type<Geometry>::type
+            >::value;
+
+        BOOST_MPL_ASSERT_MSG((is_conv),
+                             NOT_CONVERTIBLE,
+                             (segment_iterator<OtherGeometry>));
+    }
+
+    inline segment_iterator& operator++() // prefix
+    {
+        base::operator++();
+        return *this;
+    }
+
+    inline segment_iterator& operator--() // prefix
+    {
+        base::operator--();
+        return *this;
+    }
+
+    inline segment_iterator operator++(int) // postfix
+    {
+        segment_iterator copy(*this);
+        base::operator++();
+        return copy;
+    }
+
+    inline segment_iterator operator--(int) // postfix
+    {
+        segment_iterator copy(*this);
+        base::operator--();
+        return copy;
+    }
+};
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline segment_iterator<Geometry const>
+segments_begin(Geometry const& geometry)
+{
+    return dispatch::segments_begin<Geometry const>::apply(geometry);
+}
+
+
+// MK:: need to add doc here
+template <typename Geometry>
+inline segment_iterator<Geometry const>
+segments_end(Geometry const& geometry)
+{
+    return dispatch::segments_end<Geometry const>::apply(geometry);
+}
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/detail/extreme_points.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
+#define BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
+
+
+#include <boost/geometry/algorithms/detail/extreme_points.hpp>
+
+
+#endif // BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_EXTREME_POINTS_HPP
--- a/DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_OVERLAY_SELECT_RINGS_HPP
-#define BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_OVERLAY_SELECT_RINGS_HPP
-
-
-#include <boost/range.hpp>
-
-#include <boost/geometry/multi/core/tags.hpp>
-#include <boost/geometry/multi/geometries/concepts/check.hpp>
-
-#include <boost/geometry/algorithms/detail/overlay/select_rings.hpp>
-
-
-namespace boost { namespace geometry
-{
-
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace overlay
-{
-
-namespace dispatch
-{
-
-    template <typename Multi>
-    struct select_rings<multi_polygon_tag, Multi>
-    {
-        template <typename Geometry, typename Map>
-        static inline void apply(Multi const& multi, Geometry const& geometry,
-                    ring_identifier id, Map& map, bool midpoint)
-        {
-            typedef typename boost::range_iterator
-                <
-                    Multi const
-                >::type iterator_type;
-
-            typedef select_rings<polygon_tag, typename boost::range_value<Multi>::type> per_polygon;
-
-            id.multi_index = 0;
-            for (iterator_type it = boost::begin(multi); it != boost::end(multi); ++it)
-            {
-                id.ring_index = -1;
-                per_polygon::apply(*it, geometry, id, map, midpoint);
-                id.multi_index++;
-            }
-        }
-    };
-}
-
-
-}} // namespace detail::overlay
-#endif // DOXYGEN_NO_DETAIL
-
-
-}} // namespace boost::geometry
-
-
-#endif // BOOST_GEOMETRY_MULTI_ALGORITHMS_DETAIL_OVERLAY_SELECT_RINGS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/multi/algorithms/remove_spikes.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_MULTI_ALGORITHMS_REMOVE_SPIKES_HPP
+#define BOOST_GEOMETRY_MULTI_ALGORITHMS_REMOVE_SPIKES_HPP
+
+
+#include <boost/geometry/algorithms/remove_spikes.hpp>
+
+
+#endif // BOOST_GEOMETRY_MULTI_ALGORITHMS_REMOVE_SPIKES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/disjoint_interrupt_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2013-2014.
+// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_POLICIES_DISJOINT_INTERRUPT_POLICY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_POLICIES_DISJOINT_INTERRUPT_POLICY_HPP
+
+#include <boost/range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace disjoint
+{
+
+
+struct disjoint_interrupt_policy
+{
+    static bool const enabled = true;
+    bool has_intersections;
+
+    inline disjoint_interrupt_policy()
+        : has_intersections(false)
+    {}
+
+    template <typename Range>
+    inline bool apply(Range const& range)
+    {
+        // If there is any IP in the range, it is NOT disjoint
+        if (boost::size(range) > 0)
+        {
+            has_intersections = true;
+            return true;
+        }
+        return false;
+    }
+};
+
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_POLICIES_DISJOINT_INTERRUPT_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/default_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_POLICIES_IS_VALID_DEFAULT_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_IS_VALID_DEFAULT_POLICY_HPP
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+template <bool AllowDuplicates = true, bool AllowSpikes = true>
+class is_valid_default_policy
+{
+protected:
+    static inline bool is_valid(validity_failure_type failure)
+    {
+        return failure == no_failure
+            || (AllowDuplicates && failure == failure_duplicate_points);
+    }
+
+    static inline bool is_valid(validity_failure_type failure, bool is_linear)
+    {
+        return is_valid(failure)
+            || (is_linear && AllowSpikes && failure == failure_spikes);
+    }
+
+public:
+    template <validity_failure_type Failure>
+    static inline bool apply()
+    {
+        return is_valid(Failure);
+    }
+
+    template <validity_failure_type Failure, typename Data>
+    static inline bool apply(Data const&)
+    {
+        return is_valid(Failure);
+    }
+
+    template <validity_failure_type Failure, typename Data1, typename Data2>
+    static inline bool apply(Data1 const& data1, Data2 const&)
+    {
+        return is_valid(Failure, data1);
+    }
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_POLICIES_IS_VALID_DEFAULT_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/failing_reason_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,218 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_POLICIES_IS_VALID_FAILING_REASON_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_IS_VALID_FAILING_REASON_POLICY_HPP
+
+#include <sstream>
+
+#include <boost/geometry/io/dsv/write.hpp>
+#include <boost/geometry/util/range.hpp>
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+inline char const* validity_failure_type_message(validity_failure_type failure)
+{
+    switch (failure)
+    {
+    case no_failure:
+        return "Geometry is valid";
+    case failure_few_points:
+        return "Geometry has too few points";
+    case failure_wrong_topological_dimension:
+        return "Geometry has wrong topological dimension";
+    case failure_not_closed:
+        return "Geometry is defined as closed but is open";
+    case failure_spikes:
+        return "Geometry has spikes";
+    case failure_self_intersections:
+        return "Geometry has invalid self-intersections";
+    case failure_wrong_orientation:
+        return "Geometry has wrong orientation";
+    case failure_interior_rings_outside:
+        return "Geometry has interior rings defined outside the outer boundary";
+    case failure_nested_interior_rings:
+        return "Geometry has nested interior rings";
+    case failure_disconnected_interior:
+        return "Geometry has disconnected interior";
+    case failure_intersecting_interiors:
+        return "Multi-polygon has intersecting interiors";
+    case failure_duplicate_points:
+        return "Geometry has duplicate (consecutive) points";
+    case failure_wrong_corner_order:
+        return "Box has corners in wrong order";
+    default: // to avoid -Wreturn-type warning
+        return "";
+    }
+}
+
+
+template <bool AllowDuplicates = true, bool AllowSpikes = true>
+class failing_reason_policy
+{
+private:
+    static inline
+    validity_failure_type transform_failure_type(validity_failure_type failure)
+    {
+        if (AllowDuplicates && failure == failure_duplicate_points)
+        {
+            return no_failure;
+        }
+        return failure;
+    }
+
+    static inline
+    validity_failure_type transform_failure_type(validity_failure_type failure,
+                                                 bool is_linear)
+    {
+        if (is_linear && AllowSpikes && failure == failure_spikes)
+        {
+            return no_failure;
+        }
+        return transform_failure_type(failure);
+    }
+
+    inline void set_failure_message(validity_failure_type failure)
+    {
+        m_oss.str("");
+        m_oss.clear();
+        m_oss << validity_failure_type_message(failure);
+    }
+
+    template
+    <
+        validity_failure_type Failure,
+        typename Data1,
+        typename Data2 = Data1,
+        typename Dummy = void
+    >
+    struct process_data
+    {
+        static inline void apply(std::ostringstream&, Data1 const&)
+        {
+        }
+
+        static inline void apply(std::ostringstream&,
+                                 Data1 const&,
+                                 Data2 const&)
+        {
+        }
+    };
+
+    template <typename SpikePoint>
+    struct process_data<failure_spikes, bool, SpikePoint>
+    {
+        static inline void apply(std::ostringstream& oss,
+                                 bool is_linear,
+                                 SpikePoint const& spike_point)
+        {
+            if (is_linear && AllowSpikes)
+            {
+                return;
+            }
+
+            oss << ". A spike point was found with apex at "
+                << geometry::dsv(spike_point);
+        }
+    };
+
+    template <typename Turns>
+    struct process_data<failure_self_intersections, Turns>
+    {
+        static inline
+        void apply_to_segment_identifier(std::ostringstream& oss,
+                                         segment_identifier seg_id)
+        {
+            oss << "{" << seg_id.source_index
+                << ", " << seg_id.multi_index
+                << ", " << seg_id.ring_index
+                << ", " << seg_id.segment_index
+                << "}";
+        }
+
+        static inline void apply(std::ostringstream& oss,
+                                 Turns const& turns)
+        {
+            typedef typename boost::range_value<Turns>::type turn_type;
+            turn_type const& turn = range::front(turns);
+            oss << ". A self-intersection point was found at "
+                << geometry::dsv(turn.point);
+
+            oss << "; method: " << method_char(turn.method)
+                << "; operations: "
+                << operation_char(turn.operations[0].operation)
+                << "/"
+                << operation_char(turn.operations[1].operation)
+                << "; segment IDs {source, multi, ring, segment}: ";
+            apply_to_segment_identifier(oss, turn.operations[0].seg_id);
+            oss << "/";
+            apply_to_segment_identifier(oss, turn.operations[1].seg_id);
+        }
+    };
+
+    template <typename Point>
+    struct process_data<failure_duplicate_points, Point>
+    {
+        static inline void apply(std::ostringstream& oss,
+                                 Point const& point)
+        {
+            if (AllowDuplicates)
+            {
+                return;
+            }
+            oss << ". Duplicate points were found near point "
+                << geometry::dsv(point);
+        }
+    };
+
+public:
+    failing_reason_policy(std::ostringstream& oss)
+        : m_oss(oss)
+    {}
+
+    template <validity_failure_type Failure>
+    inline bool apply()
+    {
+        validity_failure_type const failure = transform_failure_type(Failure);
+        set_failure_message(failure);
+        return failure == no_failure;
+    }
+
+    template <validity_failure_type Failure, typename Data>
+    inline bool apply(Data const& data)
+    {
+        validity_failure_type const failure = transform_failure_type(Failure);
+        set_failure_message(failure);
+        process_data<Failure, Data>::apply(m_oss, data);
+        return failure == no_failure;
+    }
+
+    template <validity_failure_type Failure, typename Data1, typename Data2>
+    inline bool apply(Data1 const& data1, Data2 const& data2)
+    {
+        validity_failure_type const failure
+            = transform_failure_type(Failure, data1);
+        set_failure_message(failure);
+        process_data<Failure, Data1, Data2>::apply(m_oss, data1, data2);
+        return failure == no_failure;
+    }
+
+private:
+    std::ostringstream& m_oss;
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_POLICIES_IS_VALID_FAILING_REASON_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/is_valid/failure_type_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_POLICIES_IS_VALID_FAILURE_TYPE_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_IS_VALID_FAILURE_TYPE_POLICY_HPP
+
+#include <boost/geometry/algorithms/validity_failure_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+// policy that simply keeps (and can return) the failure type
+template <bool AllowDuplicates = true, bool AllowSpikes = true>
+class failure_type_policy
+{
+private:
+    static inline
+    validity_failure_type transform_failure_type(validity_failure_type failure)
+    {
+        if (AllowDuplicates && failure == failure_duplicate_points)
+        {
+            return no_failure;
+        }
+        return failure;
+    }
+
+    static inline
+    validity_failure_type transform_failure_type(validity_failure_type failure,
+                                                 bool is_linear)
+    {
+        if (is_linear && AllowSpikes && failure == failure_spikes)
+        {
+            return no_failure;
+        }
+        return transform_failure_type(failure);
+    }
+
+public:
+    failure_type_policy()
+        : m_failure(no_failure)
+    {}
+
+    template <validity_failure_type Failure>
+    inline bool apply()
+    {
+        m_failure = transform_failure_type(Failure);
+        return m_failure == no_failure;
+    }
+
+    template <validity_failure_type Failure, typename Data>
+    inline bool apply(Data const&)
+    {
+        return apply<Failure>();
+    }
+
+    template <validity_failure_type Failure, typename Data1, typename Data2>
+    inline bool apply(Data1 const& data1, Data2 const&)
+    {
+        m_failure = transform_failure_type(Failure, data1);
+        return m_failure == no_failure;
+    }
+
+    validity_failure_type failure() const
+    {
+        return m_failure;
+    }
+
+private:
+    validity_failure_type m_failure;
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_POLICIES_IS_VALID_FAILURE_TYPE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/predicate_based_interrupt_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,101 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+
+template
+<
+    typename IsAcceptableTurnPredicate,
+    bool AllowEmptyTurnRange = true // by default, allow an empty turn range
+>
+struct stateless_predicate_based_interrupt_policy
+{
+    static bool const enabled = true;
+    bool has_intersections; // set to true if there is at least one
+                            // unacceptable turn
+
+    inline stateless_predicate_based_interrupt_policy()
+        : has_intersections(false)
+    {}
+
+    template <typename Range>
+    inline bool apply(Range const& range)
+    {
+        // if there is at least one unacceptable turn in the range, return false
+        has_intersections = !detail::check_iterator_range
+            <
+                IsAcceptableTurnPredicate,
+                AllowEmptyTurnRange
+            >::apply(boost::begin(range), boost::end(range));
+
+        return has_intersections;
+    }
+};
+
+
+
+
+template
+<
+    typename IsAcceptableTurnPredicate,
+    bool AllowEmptyTurnRange = true // by default, allow an empty turn range
+>
+struct predicate_based_interrupt_policy
+{
+    static bool const enabled = true;
+    bool has_intersections; // set to true if there is at least one
+                            // unacceptable turn
+    IsAcceptableTurnPredicate const& m_predicate;
+
+    inline
+    predicate_based_interrupt_policy(IsAcceptableTurnPredicate const& predicate)
+        : has_intersections(false)
+        , m_predicate(predicate)
+    {}
+
+    template <typename Range>
+    inline bool apply(Range const& range)
+    {
+        // if there is at least one unacceptable turn in the range, return false
+        has_intersections = !detail::check_iterator_range
+            <
+                IsAcceptableTurnPredicate,
+                AllowEmptyTurnRange
+            >::apply(boost::begin(range), boost::end(range), m_predicate);
+
+        return has_intersections;
+    }
+};
+
+
+
+
+}} // namespace detail::overlay
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/relate/intersection_ratios.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,127 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_INTERSECTION_RATIOS_HPP
+#define BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_INTERSECTION_RATIOS_HPP
+
+
+#include <algorithm>
+#include <string>
+
+#include <boost/concept_check.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/geometry/algorithms/detail/assign_indexed_point.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/strategies/side_info.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace policies { namespace relate
+{
+
+
+/*!
+\brief Policy returning segment ratios
+\note Template argument FractionType should be a fraction_type<SegmentRatio>
+ */
+template
+<
+    typename FractionType
+>
+struct segments_intersection_ratios
+{
+    typedef FractionType return_type;
+
+    template
+    <
+        typename Segment1,
+        typename Segment2,
+        typename SegmentIntersectionInfo
+    >
+    static inline return_type segments_crosses(side_info const&,
+                    SegmentIntersectionInfo const& sinfo,
+                    Segment1 const& , Segment2 const& )
+    {
+        return_type result;
+        result.assign(sinfo);
+        return result;
+    }
+
+    template <typename Segment1, typename Segment2, typename Ratio>
+    static inline return_type segments_collinear(
+        Segment1 const& , Segment2 const& ,
+        Ratio const& ra_from_wrt_b, Ratio const& ra_to_wrt_b,
+        Ratio const& rb_from_wrt_a, Ratio const& rb_to_wrt_a)
+    {
+        // We have only one result, for (potentially) two IP's,
+        // so we take a first one
+        return_type result;
+
+        if (ra_from_wrt_b.on_segment())
+        {
+            result.assign(Ratio::zero(), ra_from_wrt_b);
+        }
+        else if (rb_from_wrt_a.in_segment())
+        {
+            result.assign(rb_from_wrt_a, Ratio::zero());
+        }
+        else if (ra_to_wrt_b.on_segment())
+        {
+            result.assign(Ratio::one(), ra_to_wrt_b);
+        }
+        else if (rb_to_wrt_a.in_segment())
+        {
+            result.assign(rb_to_wrt_a, Ratio::one());
+        }
+
+        return result;
+    }
+
+    static inline return_type disjoint()
+    {
+        return return_type();
+    }
+    static inline return_type error(std::string const&)
+    {
+        return return_type();
+    }
+
+    template <typename Segment>
+    static inline return_type degenerate(Segment const& segment, bool)
+    {
+        return return_type();
+    }
+
+    template <typename Segment, typename Ratio>
+    static inline return_type one_degenerate(Segment const& ,
+            Ratio const& ratio, bool a_degenerate)
+    {
+        return_type result;
+        if (a_degenerate)
+        {
+            // IP lies on ratio w.r.t. segment b
+            result.assign(Ratio::zero(), ratio);
+        }
+        else
+        {
+            result.assign(ratio, Ratio::zero());
+        }
+        return result;
+    }
+
+};
+
+
+}} // namespace policies::relate
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_INTERSECTION_RATIOS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/get_rescale_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,294 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2014-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2014-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2014-2015 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_GET_RESCALE_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_GET_RESCALE_POLICY_HPP
+
+
+#include <cstddef>
+
+#include <boost/type_traits.hpp>
+#include <boost/mpl/assert.hpp>
+
+#include <boost/geometry/core/tag_cast.hpp>
+
+#include <boost/geometry/algorithms/envelope.hpp>
+#include <boost/geometry/algorithms/expand.hpp>
+#include <boost/geometry/algorithms/detail/recalculate.hpp>
+#include <boost/geometry/algorithms/detail/get_max_size.hpp>
+#include <boost/geometry/policies/robustness/robust_type.hpp>
+
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/policies/robustness/no_rescale_policy.hpp>
+#include <boost/geometry/policies/robustness/rescale_policy.hpp>
+
+#include <boost/geometry/util/promote_floating_point.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace get_rescale_policy
+{
+
+template
+<
+    typename Box,
+    typename Point,
+    typename RobustPoint,
+    typename Factor
+>
+inline void scale_box_to_integer_range(Box const& box,
+                                       Point& min_point,
+                                       RobustPoint& min_robust_point,
+                                       Factor& factor)
+{
+    // Scale box to integer-range
+    typedef typename promote_floating_point
+        <
+            typename geometry::coordinate_type<Point>::type
+        >::type num_type;
+    num_type const diff = boost::numeric_cast<num_type>(detail::get_max_size(box));
+    num_type const range = 10000000.0; // Define a large range to get precise integer coordinates
+    num_type const half = 0.5;
+    factor = math::equals(diff, num_type()) || diff >= range ? 1
+        : boost::numeric_cast<num_type>(
+            boost::numeric_cast<boost::long_long_type>(half + range / diff));
+
+    BOOST_ASSERT(factor >= 1);
+
+    // Assign input/output minimal points
+    detail::assign_point_from_index<0>(box, min_point);
+    num_type const two = 2;
+    boost::long_long_type const min_coordinate
+        = boost::numeric_cast<boost::long_long_type>(-range / two);
+    assign_values(min_robust_point, min_coordinate, min_coordinate);
+}
+
+template <typename Point, typename RobustPoint, typename Geometry, typename Factor>
+static inline void init_rescale_policy(Geometry const& geometry,
+        Point& min_point,
+        RobustPoint& min_robust_point,
+        Factor& factor)
+{
+    // Get bounding boxes
+    model::box<Point> env = geometry::return_envelope<model::box<Point> >(geometry);
+
+    scale_box_to_integer_range(env, min_point, min_robust_point, factor);
+}
+
+template <typename Point, typename RobustPoint, typename Geometry1, typename Geometry2, typename Factor>
+static inline void init_rescale_policy(Geometry1 const& geometry1,
+        Geometry2 const& geometry2,
+        Point& min_point,
+        RobustPoint& min_robust_point,
+        Factor& factor)
+{
+    // Get bounding boxes
+    model::box<Point> env = geometry::return_envelope<model::box<Point> >(geometry1);
+    model::box<Point> env2 = geometry::return_envelope<model::box<Point> >(geometry2);
+    geometry::expand(env, env2);
+
+    scale_box_to_integer_range(env, min_point, min_robust_point, factor);
+}
+
+
+template
+<
+    typename Point,
+    bool IsFloatingPoint
+>
+struct rescale_policy_type
+{
+    typedef no_rescale_policy type;
+};
+
+// We rescale only all FP types
+template
+<
+    typename Point
+>
+struct rescale_policy_type<Point, true>
+{
+    typedef typename geometry::coordinate_type<Point>::type coordinate_type;
+    typedef model::point
+    <
+        typename detail::robust_type<coordinate_type>::type,
+        geometry::dimension<Point>::value,
+        typename geometry::coordinate_system<Point>::type
+    > robust_point_type;
+    typedef typename promote_floating_point<coordinate_type>::type factor_type;
+    typedef detail::robust_policy<Point, robust_point_type, factor_type> type;
+};
+
+template <typename Policy>
+struct get_rescale_policy
+{
+    template <typename Geometry>
+    static inline Policy apply(Geometry const& geometry)
+    {
+        typedef typename point_type<Geometry>::type point_type;
+        typedef typename geometry::coordinate_type<Geometry>::type coordinate_type;
+        typedef typename promote_floating_point<coordinate_type>::type factor_type;
+        typedef model::point
+        <
+            typename detail::robust_type<coordinate_type>::type,
+            geometry::dimension<point_type>::value,
+            typename geometry::coordinate_system<point_type>::type
+        > robust_point_type;
+
+        point_type min_point;
+        robust_point_type min_robust_point;
+        factor_type factor;
+        init_rescale_policy(geometry, min_point, min_robust_point, factor);
+
+        return Policy(min_point, min_robust_point, factor);
+    }
+
+    template <typename Geometry1, typename Geometry2>
+    static inline Policy apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        typedef typename point_type<Geometry1>::type point_type;
+        typedef typename geometry::coordinate_type<Geometry1>::type coordinate_type;
+        typedef typename promote_floating_point<coordinate_type>::type factor_type;
+        typedef model::point
+        <
+            typename detail::robust_type<coordinate_type>::type,
+            geometry::dimension<point_type>::value,
+            typename geometry::coordinate_system<point_type>::type
+        > robust_point_type;
+
+        point_type min_point;
+        robust_point_type min_robust_point;
+        factor_type factor;
+        init_rescale_policy(geometry1, geometry2, min_point, min_robust_point, factor);
+
+        return Policy(min_point, min_robust_point, factor);
+    }
+};
+
+// Specialization for no-rescaling
+template <>
+struct get_rescale_policy<no_rescale_policy>
+{
+    template <typename Geometry>
+    static inline no_rescale_policy apply(Geometry const& )
+    {
+        return no_rescale_policy();
+    }
+
+    template <typename Geometry1, typename Geometry2>
+    static inline no_rescale_policy apply(Geometry1 const& , Geometry2 const& )
+    {
+        return no_rescale_policy();
+    }
+};
+
+
+}} // namespace detail::get_rescale_policy
+#endif // DOXYGEN_NO_DETAIL
+
+template<typename Point>
+struct rescale_policy_type
+    : public detail::get_rescale_policy::rescale_policy_type
+    <
+        Point,
+#if defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
+        false
+#else
+        boost::is_floating_point
+        <
+            typename geometry::coordinate_type<Point>::type
+        >::type::value
+#endif
+    >
+{
+    static const bool is_point
+        = boost::is_same
+            <
+                typename geometry::tag<Point>::type,
+                geometry::point_tag
+            >::type::value;
+
+    BOOST_MPL_ASSERT_MSG((is_point),
+                         INVALID_INPUT_GEOMETRY,
+                         (typename geometry::tag<Point>::type));
+};
+
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename Tag1 = typename tag_cast
+    <
+        typename tag<Geometry1>::type,
+        box_tag,
+        pointlike_tag,
+        linear_tag,
+        areal_tag
+    >::type,
+    typename Tag2 = typename tag_cast
+    <
+        typename tag<Geometry2>::type,
+        box_tag,
+        pointlike_tag,
+        linear_tag,
+        areal_tag
+    >::type
+>
+struct rescale_overlay_policy_type
+    // Default: no rescaling
+    : public detail::get_rescale_policy::rescale_policy_type
+        <
+            typename geometry::point_type<Geometry1>::type,
+            false
+        >
+{};
+
+// Areal/areal: get rescale policy based on coordinate type
+template
+<
+    typename Geometry1,
+    typename Geometry2
+>
+struct rescale_overlay_policy_type<Geometry1, Geometry2, areal_tag, areal_tag>
+    : public rescale_policy_type
+        <
+            typename geometry::point_type<Geometry1>::type
+        >
+{};
+
+
+template <typename Policy, typename Geometry>
+inline Policy get_rescale_policy(Geometry const& geometry)
+{
+    return detail::get_rescale_policy::get_rescale_policy<Policy>::apply(geometry);
+}
+
+template <typename Policy, typename Geometry1, typename Geometry2>
+inline Policy get_rescale_policy(Geometry1 const& geometry1, Geometry2 const& geometry2)
+{
+    return detail::get_rescale_policy::get_rescale_policy<Policy>::apply(geometry1, geometry2);
+}
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_GET_RESCALE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/no_rescale_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_NO_RESCALE_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_NO_RESCALE_POLICY_HPP
+
+#include <stddef.h>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/policies/robustness/robust_point_type.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio_type.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+// Probably this will be moved out of namespace detail
+struct no_rescale_policy
+{
+    static bool const enabled = false;
+
+    // We don't rescale but return the reference of the input
+    template <std::size_t Dimension, typename Value>
+    inline Value const& apply(Value const& value) const
+    {
+        return value;
+    }
+};
+
+} // namespace detail
+#endif
+
+
+// Implement meta-functions for this policy
+template <typename Point>
+struct robust_point_type<Point, detail::no_rescale_policy>
+{
+    // The point itself
+    typedef Point type;
+};
+
+template <typename Point>
+struct segment_ratio_type<Point, detail::no_rescale_policy>
+{
+    // Define a segment_ratio defined on coordinate type, e.g.
+    // int/int or float/float
+    typedef typename geometry::coordinate_type<Point>::type coordinate_type;
+    typedef segment_ratio<coordinate_type> type;
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_NO_RESCALE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/rescale_policy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP
+
+#include <cstddef>
+
+#include <boost/type_traits.hpp>
+
+#include <boost/geometry/policies/robustness/segment_ratio.hpp>
+#include <boost/geometry/policies/robustness/segment_ratio_type.hpp>
+#include <boost/geometry/policies/robustness/robust_point_type.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename FpPoint, typename IntPoint, typename CalculationType>
+struct robust_policy
+{
+    static bool const enabled = true;
+
+    typedef typename geometry::coordinate_type<IntPoint>::type output_ct;
+
+    robust_policy(FpPoint const& fp_min, IntPoint const& int_min, CalculationType const& the_factor)
+        : m_fp_min(fp_min)
+        , m_int_min(int_min)
+        , m_multiplier(the_factor)
+    {
+    }
+
+    template <std::size_t Dimension, typename Value>
+    inline output_ct apply(Value const& value) const
+    {
+        // a + (v-b)*f
+        CalculationType const a = static_cast<CalculationType>(get<Dimension>(m_int_min));
+        CalculationType const b = static_cast<CalculationType>(get<Dimension>(m_fp_min));
+        CalculationType const result = a + (value - b) * m_multiplier;
+        return static_cast<output_ct>(result);
+    }
+
+    FpPoint m_fp_min;
+    IntPoint m_int_min;
+    CalculationType m_multiplier;
+};
+
+} // namespace detail
+#endif
+
+
+// Implement meta-functions for this policy
+
+// Define the IntPoint as a robust-point type
+template <typename Point, typename FpPoint, typename IntPoint, typename CalculationType>
+struct robust_point_type<Point, detail::robust_policy<FpPoint, IntPoint, CalculationType> >
+{
+    typedef IntPoint type;
+};
+
+// Meta function for rescaling, if rescaling is done segment_ratio is based on long long
+template <typename Point, typename FpPoint, typename IntPoint, typename CalculationType>
+struct segment_ratio_type<Point, detail::robust_policy<FpPoint, IntPoint, CalculationType> >
+{
+    typedef segment_ratio<boost::long_long_type> type;
+};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_RESCALE_POLICY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/robust_point_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_POINT_TYPE_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_POINT_TYPE_HPP
+
+namespace boost { namespace geometry
+{
+
+// Meta-function to typedef a robust point type for a policy
+template <typename Point, typename Policy>
+struct robust_point_type
+{
+    // By default, the point itself is the robust type
+    typedef Point type;
+};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_POINT_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/robust_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2014 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_TYPE_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_TYPE_HPP
+
+
+#include <boost/type_traits.hpp>
+#include <boost/config.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+
+namespace detail_dispatch
+{
+
+template <typename CoordinateType, typename IsFloatingPoint>
+struct robust_type
+{
+};
+
+template <typename CoordinateType>
+struct robust_type<CoordinateType, boost::false_type>
+{
+    typedef CoordinateType type;
+};
+
+template <typename CoordinateType>
+struct robust_type<CoordinateType, boost::true_type>
+{
+    typedef boost::long_long_type type;
+};
+
+} // namespace detail_dispatch
+
+namespace detail
+{
+
+template <typename CoordinateType>
+struct robust_type
+{
+    typedef typename detail_dispatch::robust_type
+        <
+            CoordinateType,
+            typename boost::is_floating_point<CoordinateType>::type
+        >::type type;
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_ROBUST_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/segment_ratio.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,239 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2013 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_HPP
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/rational.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/promote_floating_point.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+namespace detail { namespace segment_ratio
+{
+
+template
+<
+    typename Type,
+    bool IsIntegral = boost::is_integral<Type>::type::value
+>
+struct less {};
+
+template <typename Type>
+struct less<Type, true>
+{
+    template <typename Ratio>
+    static inline bool apply(Ratio const& lhs, Ratio const& rhs)
+    {
+        return boost::rational<Type>(lhs.numerator(), lhs.denominator())
+             < boost::rational<Type>(rhs.numerator(), rhs.denominator());
+    }
+};
+
+template <typename Type>
+struct less<Type, false>
+{
+    template <typename Ratio>
+    static inline bool apply(Ratio const& lhs, Ratio const& rhs)
+    {
+        BOOST_ASSERT(lhs.denominator() != 0);
+        BOOST_ASSERT(rhs.denominator() != 0);
+        return lhs.numerator() * rhs.denominator()
+             < rhs.numerator() * lhs.denominator();
+    }
+};
+
+template
+<
+    typename Type,
+    bool IsIntegral = boost::is_integral<Type>::type::value
+>
+struct equal {};
+
+template <typename Type>
+struct equal<Type, true>
+{
+    template <typename Ratio>
+    static inline bool apply(Ratio const& lhs, Ratio const& rhs)
+    {
+        return boost::rational<Type>(lhs.numerator(), lhs.denominator())
+            == boost::rational<Type>(rhs.numerator(), rhs.denominator());
+    }
+};
+
+template <typename Type>
+struct equal<Type, false>
+{
+    template <typename Ratio>
+    static inline bool apply(Ratio const& lhs, Ratio const& rhs)
+    {
+        BOOST_ASSERT(lhs.denominator() != 0);
+        BOOST_ASSERT(rhs.denominator() != 0);
+        return geometry::math::equals
+            (
+                lhs.numerator() * rhs.denominator(),
+                rhs.numerator() * lhs.denominator()
+            );
+    }
+};
+
+}}
+
+//! Small class to keep a ratio (e.g. 1/4)
+//! Main purpose is intersections and checking on 0, 1, and smaller/larger
+//! The prototype used Boost.Rational. However, we also want to store FP ratios,
+//! (so numerator/denominator both in float)
+//! and Boost.Rational starts with GCD which we prefer to avoid if not necessary
+//! On a segment means: this ratio is between 0 and 1 (both inclusive)
+//!
+template <typename Type>
+class segment_ratio
+{
+public :
+    typedef Type numeric_type;
+
+    // Type-alias for the type itself
+    typedef segment_ratio<Type> thistype;
+
+    inline segment_ratio()
+        : m_numerator(0)
+        , m_denominator(1)
+        , m_approximation(0)
+    {}
+
+    inline segment_ratio(const Type& nominator, const Type& denominator)
+        : m_numerator(nominator)
+        , m_denominator(denominator)
+    {
+        initialize();
+    }
+
+    inline Type const& numerator() const { return m_numerator; }
+    inline Type const& denominator() const { return m_denominator; }
+
+    inline void assign(const Type& nominator, const Type& denominator)
+    {
+        m_numerator = nominator;
+        m_denominator = denominator;
+        initialize();
+    }
+
+    inline void initialize()
+    {
+        // Minimal normalization
+        // 1/-4 => -1/4, -1/-4 => 1/4
+        if (m_denominator < 0)
+        {
+            m_numerator = -m_numerator;
+            m_denominator = -m_denominator;
+        }
+
+        typedef typename promote_floating_point<Type>::type num_type;
+        static const num_type scale = 1000000.0;
+        m_approximation =
+            m_denominator == 0 ? 0
+            : boost::numeric_cast<double>
+                (
+                    boost::numeric_cast<num_type>(m_numerator) * scale
+                  / boost::numeric_cast<num_type>(m_denominator)
+                );
+    }
+
+    inline bool is_zero() const { return math::equals(m_numerator, 0); }
+    inline bool is_one() const { return math::equals(m_numerator, m_denominator); }
+    inline bool on_segment() const
+    {
+        // e.g. 0/4 or 4/4 or 2/4
+        return m_numerator >= 0 && m_numerator <= m_denominator;
+    }
+    inline bool in_segment() const
+    {
+        // e.g. 1/4
+        return m_numerator > 0 && m_numerator < m_denominator;
+    }
+    inline bool on_end() const
+    {
+        // e.g. 0/4 or 4/4
+        return is_zero() || is_one();
+    }
+    inline bool left() const
+    {
+        // e.g. -1/4
+        return m_numerator < 0;
+    }
+    inline bool right() const
+    {
+        // e.g. 5/4
+        return m_numerator > m_denominator;
+    }
+
+    inline bool close_to(thistype const& other) const
+    {
+        return geometry::math::abs(m_approximation - other.m_approximation) < 2;
+    }
+
+    inline bool operator< (thistype const& other) const
+    {
+        return close_to(other)
+            ? detail::segment_ratio::less<Type>::apply(*this, other)
+            : m_approximation < other.m_approximation;
+    }
+
+    inline bool operator== (thistype const& other) const
+    {
+        return close_to(other)
+            && detail::segment_ratio::equal<Type>::apply(*this, other);
+    }
+
+    static inline thistype zero()
+    {
+        static thistype result(0, 1);
+        return result;
+    }
+
+    static inline thistype one()
+    {
+        static thistype result(1, 1);
+        return result;
+    }
+
+#if defined(BOOST_GEOMETRY_DEFINE_STREAM_OPERATOR_SEGMENT_RATIO)
+    friend std::ostream& operator<<(std::ostream &os, segment_ratio const& ratio)
+    {
+        os << ratio.m_numerator << "/" << ratio.m_denominator
+           << " (" << (static_cast<double>(ratio.m_numerator)
+                        / static_cast<double>(ratio.m_denominator))
+           << ")";
+        return os;
+    }
+#endif
+
+
+
+private :
+    Type m_numerator;
+    Type m_denominator;
+
+    // Contains ratio on scale 0..1000000 (for 0..1)
+    // This is an approximation for fast and rough comparisons
+    // Boost.Rational is used if the approximations are close.
+    // Reason: performance, Boost.Rational does a GCD by default and also the
+    // comparisons contain while-loops.
+    double m_approximation;
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/policies/robustness/segment_ratio_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2013 Mateusz Loskot, London, UK.
+// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_TYPE_HPP
+#define BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_TYPE_HPP
+
+#include <boost/geometry/algorithms/not_implemented.hpp>
+
+namespace boost { namespace geometry
+{
+
+// Meta-function to access segment-ratio for a policy
+template <typename Point, typename Policy>
+struct segment_ratio_type {}; // : not_implemented<> {};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_POLICIES_ROBUSTNESS_SEGMENT_RATIO_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/buffer_distance_asymmetric.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,114 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_ASYMMETRIC_HPP
+#define BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_ASYMMETRIC_HPP
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+
+/*!
+\brief Let the buffer for linestrings be asymmetric
+\ingroup strategies
+\tparam NumericType \tparam_numeric
+\details This strategy can be used as DistanceStrategy for the buffer algorithm.
+    It can be applied for (multi)linestrings. It uses a (potentially) different
+    distances for left and for right. This means the (multi)linestrings are
+    interpreted having a direction.
+
+\qbk{
+[heading Example]
+[buffer_distance_asymmetric]
+[heading Output]
+[$img/strategies/buffer_distance_asymmetric.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_distance_symmetric distance_symmetric]
+}
+ */
+template<typename NumericType>
+class distance_asymmetric
+{
+public :
+    //! \brief Constructs the strategy, two distances must be specified
+    //! \param left The distance (or radius) of the buffer on the left side
+    //! \param right The distance on the right side
+    distance_asymmetric(NumericType const& left,
+                NumericType const& right)
+        : m_left(left)
+        , m_right(right)
+    {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Returns the distance-value for the specified side
+    template <typename Point>
+    inline NumericType apply(Point const& , Point const& ,
+                buffer_side_selector side)  const
+    {
+        NumericType result = side == buffer_side_left ? m_left : m_right;
+        return negative() ? math::abs(result) : result;
+    }
+
+    //! Used internally, returns -1 for deflate, 1 for inflate
+    inline int factor() const
+    {
+        return negative() ? -1 : 1;
+    }
+
+    //! Returns true if both distances are negative
+    inline bool negative() const
+    {
+        return m_left < 0 && m_right < 0;
+    }
+
+    //! Returns the max distance distance up to the buffer will reach
+    template <typename JoinStrategy, typename EndStrategy>
+    inline NumericType max_distance(JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy) const
+    {
+        boost::ignore_unused(join_strategy, end_strategy);
+
+        NumericType const left = geometry::math::abs(m_left);
+        NumericType const right = geometry::math::abs(m_right);
+        NumericType const dist = (std::max)(left, right);
+        return (std::max)(join_strategy.max_distance(dist),
+                          end_strategy.max_distance(dist));
+    }
+
+    //! Returns the distance at which the input is simplified before the buffer process
+    inline NumericType simplify_distance() const
+    {
+        NumericType const left = geometry::math::abs(m_left);
+        NumericType const right = geometry::math::abs(m_right);
+        return (std::min)(left, right) / 1000.0;
+    }
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+    NumericType m_left;
+    NumericType m_right;
+};
+
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_ASYMMETRIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP
+#define BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP
+
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+
+/*!
+\brief Let the buffer algorithm create buffers with same distances
+\ingroup strategies
+\tparam NumericType \tparam_numeric
+\details This strategy can be used as DistanceStrategy for the buffer algorithm.
+    It can be applied for all geometries. It uses one distance for left and
+    for right.
+    If the distance is negative and used with a (multi)polygon or ring, the
+    geometry will shrink (deflate) instead of expand (inflate).
+
+\qbk{
+[heading Example]
+[buffer_distance_symmetric]
+[heading Output]
+[$img/strategies/buffer_distance_symmetric.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_distance_asymmetric distance_asymmetric]
+}
+ */
+template<typename NumericType>
+class distance_symmetric
+{
+public :
+    //! \brief Constructs the strategy, a distance must be specified
+    //! \param distance The distance (or radius) of the buffer
+    explicit inline distance_symmetric(NumericType const& distance)
+        : m_distance(distance)
+    {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Returns the distance-value
+    template <typename Point>
+    inline NumericType apply(Point const& , Point const& ,
+                buffer_side_selector )  const
+    {
+        return negative() ? geometry::math::abs(m_distance) : m_distance;
+    }
+
+    //! Used internally, returns -1 for deflate, 1 for inflate
+    inline int factor() const
+    {
+        return negative() ? -1 : 1;
+    }
+
+    //! Returns true if distance is negative
+    inline bool negative() const
+    {
+        return m_distance < 0;
+    }
+
+    //! Returns the max distance distance up to the buffer will reach
+    template <typename JoinStrategy, typename EndStrategy>
+    inline NumericType max_distance(JoinStrategy const& join_strategy,
+            EndStrategy const& end_strategy) const
+    {
+        boost::ignore_unused(join_strategy, end_strategy);
+
+        NumericType const dist = geometry::math::abs(m_distance);
+        return (std::max)(join_strategy.max_distance(dist),
+                          end_strategy.max_distance(dist));
+    }
+
+
+    //! Returns the distance at which the input is simplified before the buffer process
+    inline NumericType simplify_distance() const
+    {
+        return geometry::math::abs(m_distance) / 1000.0;
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+    NumericType m_distance;
+};
+
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/point_in_point.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,136 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_STRATEGY_AGNOSTIC_POINT_IN_POINT_HPP
+#define BOOST_GEOMETRY_STRATEGY_AGNOSTIC_POINT_IN_POINT_HPP
+
+#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+
+#include <boost/geometry/strategies/covered_by.hpp>
+#include <boost/geometry/strategies/within.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace within
+{
+
+template
+<
+    typename Point1, typename Point2
+>
+struct point_in_point
+{
+    static inline bool apply(Point1 const& point1, Point2 const& point2)
+    {
+        return detail::equals::equals_point_point(point1, point2);
+    }
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+namespace services
+{
+
+template <typename Point1, typename Point2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, cartesian_tag, cartesian_tag, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point1, typename Point2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, spherical_tag, spherical_tag, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point1, typename Point2, typename AnyCS1, typename AnyCS2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, AnyCS1, AnyCS2, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point, typename MultiPoint>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, cartesian_tag, cartesian_tag, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+template <typename Point, typename MultiPoint>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, spherical_tag, spherical_tag, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+template <typename Point, typename MultiPoint, typename AnyCS1, typename AnyCS2>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, AnyCS1, AnyCS2, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+} // namespace services
+
+#endif
+
+
+}} // namespace strategy::within
+
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace strategy { namespace covered_by { namespace services
+{
+
+template <typename Point1, typename Point2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, cartesian_tag, cartesian_tag, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point1, typename Point2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, spherical_tag, spherical_tag, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point1, typename Point2, typename AnyCS1, typename AnyCS2>
+struct default_strategy<point_tag, point_tag, point_tag, point_tag, AnyCS1, AnyCS2, Point1, Point2>
+{
+    typedef strategy::within::point_in_point<Point1, Point2> type;
+};
+
+template <typename Point, typename MultiPoint>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, cartesian_tag, cartesian_tag, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+template <typename Point, typename MultiPoint>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, spherical_tag, spherical_tag, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+template <typename Point, typename MultiPoint, typename AnyCS1, typename AnyCS2>
+struct default_strategy<point_tag, multi_point_tag, point_tag, multi_point_tag, AnyCS1, AnyCS2, Point, MultiPoint>
+{
+    typedef strategy::within::point_in_point<Point, typename point_type<MultiPoint>::type> type;
+};
+
+}}} // namespace strategy::covered_by::services
+#endif
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGY_AGNOSTIC_POINT_IN_POINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/relate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,110 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014 Oracle and/or its affiliates.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_STRATEGY_AGNOSTIC_RELATE_HPP
+#define BOOST_GEOMETRY_STRATEGY_AGNOSTIC_RELATE_HPP
+
+#include <boost/geometry/algorithms/detail/relate/relate.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace relate
+{
+
+template <typename Geometry1, typename Geometry2, typename StaticMask>
+struct relate
+{
+    static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2)
+    {
+        return detail::relate::relate<StaticMask>(geometry1, geometry2);
+    }
+};
+
+} // namespace relate
+
+namespace within
+{
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+namespace services
+{
+
+
+template <typename Geometry1, typename Geometry2, typename AnyTag1, typename AnyTag2, typename AnyCS>
+struct default_strategy<AnyTag1, AnyTag2, AnyTag1, AnyTag2, AnyCS, AnyCS, Geometry1, Geometry2>
+{
+    typedef strategy::relate::relate
+        <
+            Geometry1,
+            Geometry2,
+            detail::relate::static_mask_within
+        > type;
+};
+
+template <typename Geometry1, typename Geometry2, typename AnyTag1, typename AnyTag2, typename AnyCS>
+struct default_strategy<AnyTag1, AnyTag2, AnyTag1, areal_tag, AnyCS, AnyCS, Geometry1, Geometry2>
+{
+    typedef strategy::relate::relate
+        <
+            Geometry1,
+            Geometry2,
+            detail::relate::static_mask_within
+        > type;
+};
+
+
+} // namespace services
+
+#endif
+
+
+}} // namespace strategy::within
+
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace strategy { namespace covered_by { namespace services
+{
+
+
+template <typename Geometry1, typename Geometry2, typename AnyTag1, typename AnyTag2, typename AnyCS>
+struct default_strategy<AnyTag1, AnyTag2, AnyTag1, AnyTag2, AnyCS, AnyCS, Geometry1, Geometry2>
+{
+    typedef strategy::relate::relate
+        <
+            Geometry1,
+            Geometry2,
+            detail::relate::static_mask_covered_by
+        > type;
+};
+
+template <typename Geometry1, typename Geometry2, typename AnyTag1, typename AnyTag2, typename AnyCS>
+struct default_strategy<AnyTag1, AnyTag2, AnyTag1, areal_tag, AnyCS, AnyCS, Geometry1, Geometry2>
+{
+    typedef strategy::relate::relate
+        <
+            Geometry1,
+            Geometry2,
+            detail::relate::static_mask_covered_by
+        > type;
+};
+
+
+}}} // namespace strategy::covered_by::services
+#endif
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGY_AGNOSTIC_RELATE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/agnostic/side_by_azimuth.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+// Boost.Geometry
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_SIDE_BY_AZIMUTH_HPP
+#define BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_SIDE_BY_AZIMUTH_HPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/radian_access.hpp>
+
+#include <boost/geometry/algorithms/detail/azimuth.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/promote_floating_point.hpp>
+#include <boost/geometry/util/select_calculation_type.hpp>
+
+#include <boost/geometry/strategies/side.hpp>
+//#include <boost/geometry/strategies/concepts/side_concept.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace side
+{
+
+/*!
+\brief Check at which side of a segment a point lies
+         left of segment (> 0), right of segment (< 0), on segment (0)
+\ingroup strategies
+\tparam Model Reference model of coordinate system.
+\tparam CalculationType \tparam_calculation
+ */
+template <typename Model, typename CalculationType = void>
+class side_by_azimuth
+{
+public:
+    side_by_azimuth(Model const& model = Model())
+        : m_model(model)
+    {}
+
+    template <typename P1, typename P2, typename P>
+    inline int apply(P1 const& p1, P2 const& p2, P const& p)
+    {
+        typedef typename promote_floating_point
+            <
+                typename select_calculation_type_alt
+                    <
+                        CalculationType,
+                        P1, P2, P
+                    >::type
+            >::type calc_t;
+
+        calc_t d1 = 0.001;
+        calc_t crs_AD = geometry::detail::azimuth<calc_t>(p1, p, m_model);
+        calc_t crs_AB = geometry::detail::azimuth<calc_t>(p1, p2, m_model);
+        calc_t XTD = asin(sin(d1) * sin(crs_AD - crs_AB));
+
+        return math::equals(XTD, 0) ? 0 : XTD < 0 ? 1 : -1;
+    }
+
+private:
+    Model m_model;
+};
+
+}} // namespace strategy::side
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_SIDE_BY_AZIMUTH_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/buffer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,91 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_HPP
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+/*
+
+   A Buffer-join strategy gets 4 input points.
+   On the two consecutive segments s1 and s2 (joining at vertex v):
+
+   The lines from parallel at s1, s2 (at buffer-distance) end/start
+   in two points perpendicular to the segments: p1 and p2.
+   These parallel lines interesct in point ip
+
+             (s2)
+              |
+              |
+              ^
+              |
+        (p2)  |(v)
+        *     +----<--- (s1)
+
+        x(ip) *(p1)
+
+
+    So, in clockwise order:
+        v : vertex point
+        p1: perpendicular on left side of segment1<1> (perp1)
+        ip: intersection point
+        p2: perpendicular on left side of segment2<0> (perp2)
+*/
+
+
+
+/*!
+\brief Enumerates options for side of buffer (left/right w.r.t. directed
+    segment)
+\ingroup enum
+\details Around a linestring, a buffer can be defined left or right.
+    Around a polygon, assumed clockwise internally,
+    a buffer is either on the left side (inflates the polygon), or on the
+    right side (deflates the polygon)
+*/
+enum buffer_side_selector { buffer_side_left, buffer_side_right };
+
+/*!
+\brief Enumerates types of pieces (parts of buffer) around geometries
+\ingroup enum
+*/
+enum piece_type
+{
+    buffered_segment,
+    buffered_join,
+    buffered_round_end,
+    buffered_flat_end,
+    buffered_point,
+    buffered_concave   // always on the inside
+};
+
+
+/*!
+\brief Enumerates types of joins
+\ingroup enum
+*/
+enum join_selector
+{
+    join_convex,
+    join_concave,
+    join_continue, // collinear, next segment touches previous segment
+    join_spike     // collinear, with overlap, next segment goes back
+};
+
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_end_flat.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,112 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_FLAT_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_FLAT_HPP
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+#include <boost/geometry/strategies/side.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace buffer
+{
+
+
+/*!
+\brief Let the buffer create flat ends
+\ingroup strategies
+\details This strategy can be used as EndStrategy for the buffer algorithm.
+    It creates a flat end for each linestring-end. It can be applied
+    for (multi)linestrings. Also it is applicable for spikes in (multi)polygons.
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_end_flat]
+[heading Output]
+[$img/strategies/buffer_end_flat.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_end_round end_round]
+}
+ */
+class end_flat
+{
+
+public :
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Fills output_range with a flat end
+    template <typename Point, typename RangeOut, typename DistanceStrategy>
+    inline void apply(Point const& penultimate_point,
+                Point const& perp_left_point,
+                Point const& ultimate_point,
+                Point const& perp_right_point,
+                buffer_side_selector side,
+                DistanceStrategy const& distance,
+                RangeOut& range_out) const
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+
+        typedef typename geometry::select_most_precise
+        <
+            coordinate_type,
+            double
+        >::type promoted_type;
+
+        promoted_type const dist_left = distance.apply(penultimate_point, ultimate_point, buffer_side_left);
+        promoted_type const dist_right = distance.apply(penultimate_point, ultimate_point, buffer_side_right);
+
+        bool reversed = (side == buffer_side_left && dist_right < 0 && -dist_right > dist_left)
+                    || (side == buffer_side_right && dist_left < 0 && -dist_left > dist_right)
+                    ;
+        if (reversed)
+        {
+            range_out.push_back(perp_right_point);
+            range_out.push_back(perp_left_point);
+        }
+        else
+        {
+            range_out.push_back(perp_left_point);
+            range_out.push_back(perp_right_point);
+        }
+        // Don't add the ultimate_point (endpoint of the linestring).
+        // The buffer might be generated completely at one side.
+        // In other cases it does no harm but is further useless
+    }
+
+    template <typename NumericType>
+    static inline NumericType max_distance(NumericType const& distance)
+    {
+        return distance;
+    }
+
+    //! Returns the piece_type (flat end)
+    static inline piece_type get_piece_type()
+    {
+        return buffered_flat_end;
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_FLAT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_end_round.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,174 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_ROUND_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_ROUND_HPP
+
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/strategies/tags.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+#include <boost/geometry/io/wkt/wkt.hpp>
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace buffer
+{
+
+
+/*!
+\brief Let the buffer create rounded ends
+\ingroup strategies
+\details This strategy can be used as EndStrategy for the buffer algorithm.
+    It creates a rounded end for each linestring-end. It can be applied
+    for (multi)linestrings. Also it is applicable for spikes in (multi)polygons.
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_end_round]
+[heading Output]
+[$img/strategies/buffer_end_round.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_end_flat end_flat]
+}
+ */
+class end_round
+{
+private :
+    std::size_t m_points_per_circle;
+
+    template
+    <
+        typename Point,
+        typename PromotedType,
+        typename DistanceType,
+        typename RangeOut
+    >
+    inline void generate_points(Point const& point,
+                PromotedType alpha, // by value
+                DistanceType const& buffer_distance,
+                RangeOut& range_out) const
+    {
+        PromotedType const two = 2.0;
+        PromotedType const two_pi = two * geometry::math::pi<PromotedType>();
+
+        std::size_t point_buffer_count = m_points_per_circle;
+
+        PromotedType const diff = two_pi / PromotedType(point_buffer_count);
+
+        // For half circle:
+        point_buffer_count /= 2;
+        point_buffer_count++;
+
+        for (std::size_t i = 0; i < point_buffer_count; i++, alpha -= diff)
+        {
+            typename boost::range_value<RangeOut>::type p;
+            set<0>(p, get<0>(point) + buffer_distance * cos(alpha));
+            set<1>(p, get<1>(point) + buffer_distance * sin(alpha));
+            range_out.push_back(p);
+        }
+    }
+
+    template <typename T, typename P1, typename P2>
+    static inline T calculate_angle(P1 const& from_point, P2 const& to_point)
+    {
+        typedef P1 vector_type;
+        vector_type v = from_point;
+        geometry::subtract_point(v, to_point);
+        return atan2(geometry::get<1>(v), geometry::get<0>(v));
+    }
+
+public :
+
+    //! \brief Constructs the strategy
+    //! \param points_per_circle points which would be used for a full circle
+    //! (if points_per_circle is smaller than 4, it is internally set to 4)
+    explicit inline end_round(std::size_t points_per_circle = 90)
+        : m_points_per_circle((points_per_circle < 4u) ? 4u : points_per_circle)
+    {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+    //! Fills output_range with a flat end
+    template <typename Point, typename RangeOut, typename DistanceStrategy>
+    inline void apply(Point const& penultimate_point,
+                Point const& perp_left_point,
+                Point const& ultimate_point,
+                Point const& perp_right_point,
+                buffer_side_selector side,
+                DistanceStrategy const& distance,
+                RangeOut& range_out) const
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+
+        typedef typename geometry::select_most_precise
+        <
+            coordinate_type,
+            double
+        >::type promoted_type;
+
+        promoted_type const alpha = calculate_angle<promoted_type>(perp_left_point, ultimate_point);
+
+        promoted_type const dist_left = distance.apply(penultimate_point, ultimate_point, buffer_side_left);
+        promoted_type const dist_right = distance.apply(penultimate_point, ultimate_point, buffer_side_right);
+        if (geometry::math::equals(dist_left, dist_right))
+        {
+            generate_points(ultimate_point, alpha, dist_left, range_out);
+        }
+        else
+        {
+            promoted_type const two = 2.0;
+            promoted_type dist_half_diff = (dist_left - dist_right) / two;
+
+            if (side == buffer_side_right)
+            {
+                dist_half_diff = -dist_half_diff;
+            }
+
+            Point shifted_point;
+            set<0>(shifted_point, get<0>(ultimate_point) + dist_half_diff * cos(alpha));
+            set<1>(shifted_point, get<1>(ultimate_point) + dist_half_diff * sin(alpha));
+            generate_points(shifted_point, alpha, (dist_left + dist_right) / two, range_out);
+        }
+
+        if (m_points_per_circle % 2 == 1)
+        {
+            // For a half circle, if the number of points is not even,
+            // we should insert the end point too, to generate a full cap
+            range_out.push_back(perp_right_point);
+        }
+    }
+
+    template <typename NumericType>
+    static inline NumericType max_distance(NumericType const& distance)
+    {
+        return distance;
+    }
+
+    //! Returns the piece_type (flat end)
+    static inline piece_type get_piece_type()
+    {
+        return buffered_round_end;
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_END_ROUND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_miter.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,142 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_MITER_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_MITER_HPP
+
+#include <boost/assert.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+/*!
+\brief Let the buffer create sharp corners
+\ingroup strategies
+\details This strategy can be used as JoinStrategy for the buffer algorithm.
+    It creates a sharp corners around each convex vertex. It can be applied
+    for (multi)linestrings and (multi)polygons.
+    If corners are sharp by themselves, the miters might become very long. Therefore
+    there is a limit (miter_limit), in terms of the used distance, which limits
+    their length. The miter is not changed to a bevel form (as done in some
+    other software), it is just adapted to the specified miter_limit but keeps
+    its miter form.
+    If the buffer distance is 5.0, and the miter limit is 2.0, generated points
+    will be located at a distance of at most 10.0 (2*5) units.
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_join_miter]
+[heading Output]
+[$img/strategies/buffer_join_miter.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_join_round join_round]
+}
+ */
+class join_miter
+{
+public:
+
+    //! \brief Constructs the strategy
+    //! \param miter_limit The miter limit, to avoid excessively long miters around sharp corners
+    explicit inline join_miter(double miter_limit = 5.0)
+        : m_miter_limit(valid_limit(miter_limit))
+    {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Fills output_range with a sharp shape around a vertex
+    template <typename Point, typename DistanceType, typename RangeOut>
+    inline bool apply(Point const& ip, Point const& vertex,
+                Point const& perp1, Point const& perp2,
+                DistanceType const& buffer_distance,
+                RangeOut& range_out) const
+    {
+        geometry::equal_to<Point> equals;
+        if (equals(ip, vertex))
+        {
+            return false;
+        }
+        if (equals(perp1, perp2))
+        {
+            return false;
+        }
+
+        typedef typename coordinate_type<Point>::type coordinate_type;
+        typedef typename geometry::select_most_precise
+        <
+            coordinate_type,
+            double
+        >::type promoted_type;
+
+        Point p = ip;
+
+        // Check the distance ip-vertex (= miter distance)
+        // (We calculate it manually (not using Pythagoras strategy) to reuse
+        //  dx and dy)
+        coordinate_type const dx = get<0>(p) - get<0>(vertex);
+        coordinate_type const dy = get<1>(p) - get<1>(vertex);
+
+        promoted_type const distance = geometry::math::sqrt(dx * dx + dy * dy);
+
+        promoted_type const max_distance
+            = m_miter_limit * geometry::math::abs(buffer_distance);
+
+        if (distance > max_distance)
+        {
+            BOOST_ASSERT(distance != 0.0);
+
+            promoted_type const proportion = max_distance / distance;
+            set<0>(p, get<0>(vertex) + dx * proportion);
+            set<1>(p, get<1>(vertex) + dy * proportion);
+        }
+
+        range_out.push_back(perp1);
+        range_out.push_back(p);
+        range_out.push_back(perp2);
+        return true;
+    }
+
+    template <typename NumericType>
+    inline NumericType max_distance(NumericType const& distance) const
+    {
+        return distance * m_miter_limit;
+    }
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+    double valid_limit(double miter_limit) const
+    {
+        if (miter_limit < 1.0)
+        {
+            // It should always exceed the buffer distance
+            miter_limit = 1.0;
+        }
+        return miter_limit;
+    }
+
+    double m_miter_limit;
+};
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_MITER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_round.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,183 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_HPP
+
+#include <algorithm>
+
+#include <boost/assert.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#ifdef BOOST_GEOMETRY_DEBUG_BUFFER_WARN
+#include <boost/geometry/io/wkt/wkt.hpp>
+#endif
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace buffer
+{
+
+/*!
+\brief Let the buffer create rounded corners
+\ingroup strategies
+\details This strategy can be used as JoinStrategy for the buffer algorithm.
+    It creates a rounded corners around each convex vertex. It can be applied
+    for (multi)linestrings and (multi)polygons.
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_join_round]
+[heading Output]
+[$img/strategies/buffer_join_round.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_join_miter join_miter]
+}
+ */
+class join_round
+{
+public :
+
+    //! \brief Constructs the strategy
+    //! \param points_per_circle points which would be used for a full circle
+    explicit inline join_round(std::size_t points_per_circle = 90)
+        : m_points_per_circle(points_per_circle)
+    {}
+
+private :
+    template
+    <
+        typename PromotedType,
+        typename Point,
+        typename DistanceType,
+        typename RangeOut
+    >
+    inline void generate_points(Point const& vertex,
+                Point const& perp1, Point const& perp2,
+                DistanceType const& buffer_distance,
+                RangeOut& range_out) const
+    {
+        PromotedType const dx1 = get<0>(perp1) - get<0>(vertex);
+        PromotedType const dy1 = get<1>(perp1) - get<1>(vertex);
+        PromotedType const dx2 = get<0>(perp2) - get<0>(vertex);
+        PromotedType const dy2 = get<1>(perp2) - get<1>(vertex);
+
+        PromotedType const two = 2.0;
+        PromotedType const two_pi = two * geometry::math::pi<PromotedType>();
+
+        PromotedType const angle1 = atan2(dy1, dx1);
+        PromotedType angle2 = atan2(dy2, dx2);
+        while (angle2 > angle1)
+        {
+            angle2 -= two_pi;
+        }
+        PromotedType const angle_diff = angle1 - angle2;
+
+        // Divide the angle into an integer amount of steps to make it
+        // visually correct also for a low number of points / circle
+
+        // If a full circle is divided into 3 parts (e.g. angle is 125),
+        // the one point in between must still be generated
+        // The calculation below:
+        // - generates 1 point  in between for an angle of 125 based on 3 points
+        // - generates 0 points in between for an angle of 90  based on 4 points
+
+        int const n = (std::max)(static_cast<int>(
+            ceil(m_points_per_circle * angle_diff / two_pi)), 1);
+
+        PromotedType const diff = angle_diff / static_cast<PromotedType>(n);
+        PromotedType a = angle1 - diff;
+
+        // Walk to n - 1 to avoid generating the last point
+        for (int i = 0; i < n - 1; i++, a -= diff)
+        {
+            Point p;
+            set<0>(p, get<0>(vertex) + buffer_distance * cos(a));
+            set<1>(p, get<1>(vertex) + buffer_distance * sin(a));
+            range_out.push_back(p);
+        }
+    }
+
+public :
+
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Fills output_range with a rounded shape around a vertex
+    template <typename Point, typename DistanceType, typename RangeOut>
+    inline bool apply(Point const& ip, Point const& vertex,
+                Point const& perp1, Point const& perp2,
+                DistanceType const& buffer_distance,
+                RangeOut& range_out) const
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+        typedef typename boost::range_value<RangeOut>::type output_point_type;
+
+        typedef typename geometry::select_most_precise
+            <
+                typename geometry::select_most_precise
+                    <
+                        coordinate_type,
+                        typename geometry::coordinate_type<output_point_type>::type
+                    >::type,
+                double
+            >::type promoted_type;
+
+        geometry::equal_to<Point> equals;
+        if (equals(perp1, perp2))
+        {
+#ifdef BOOST_GEOMETRY_DEBUG_BUFFER_WARN
+            std::cout << "Corner for equal points " << geometry::wkt(ip) << " " << geometry::wkt(perp1) << std::endl;
+#endif
+            return false;
+        }
+
+        // Generate 'vectors'
+        coordinate_type vix = (get<0>(ip) - get<0>(vertex));
+        coordinate_type viy = (get<1>(ip) - get<1>(vertex));
+
+        promoted_type length_i = geometry::math::sqrt(vix * vix + viy * viy);
+        DistanceType const bd = geometry::math::abs(buffer_distance);
+        promoted_type prop = bd / length_i;
+
+        Point bp;
+        set<0>(bp, get<0>(vertex) + vix * prop);
+        set<1>(bp, get<1>(vertex) + viy * prop);
+
+        range_out.push_back(perp1);
+        generate_points<promoted_type>(vertex, perp1, perp2, bd, range_out);
+        range_out.push_back(perp2);
+        return true;
+    }
+
+    template <typename NumericType>
+    static inline NumericType max_distance(NumericType const& distance)
+    {
+        return distance;
+    }
+
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+    std::size_t m_points_per_circle;
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_join_round_by_divide.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,155 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_BY_DIVIDE_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_BY_DIVIDE_HPP
+
+#include <boost/assert.hpp>
+#include <boost/geometry/core/cs.hpp>
+#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#ifdef BOOST_GEOMETRY_DEBUG_BUFFER_WARN
+#include <boost/geometry/io/wkt/wkt.hpp>
+#endif
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace buffer
+{
+
+
+class join_round_by_divide
+{
+public :
+
+    inline join_round_by_divide(std::size_t max_level = 4)
+        : m_max_level(max_level)
+    {}
+
+    template
+    <
+        typename PromotedType,
+        typename Point,
+        typename DistanceType,
+        typename RangeOut
+    >
+    inline void mid_points(Point const& vertex,
+                Point const& p1, Point const& p2,
+                DistanceType const& buffer_distance,
+                RangeOut& range_out,
+                std::size_t level = 1) const
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+
+        // Generate 'vectors'
+        coordinate_type const vp1_x = get<0>(p1) - get<0>(vertex);
+        coordinate_type const vp1_y = get<1>(p1) - get<1>(vertex);
+
+        coordinate_type const vp2_x = (get<0>(p2) - get<0>(vertex));
+        coordinate_type const vp2_y = (get<1>(p2) - get<1>(vertex));
+
+        // Average them to generate vector in between
+        coordinate_type const two = 2;
+        coordinate_type const v_x = (vp1_x + vp2_x) / two;
+        coordinate_type const v_y = (vp1_y + vp2_y) / two;
+
+        PromotedType const length2 = geometry::math::sqrt(v_x * v_x + v_y * v_y);
+
+        PromotedType prop = buffer_distance / length2;
+
+        Point mid_point;
+        set<0>(mid_point, get<0>(vertex) + v_x * prop);
+        set<1>(mid_point, get<1>(vertex) + v_y * prop);
+
+        if (level < m_max_level)
+        {
+            mid_points<PromotedType>(vertex, p1, mid_point, buffer_distance, range_out, level + 1);
+        }
+        range_out.push_back(mid_point);
+        if (level < m_max_level)
+        {
+            mid_points<PromotedType>(vertex, mid_point, p2, buffer_distance, range_out, level + 1);
+        }
+    }
+
+    template <typename Point, typename DistanceType, typename RangeOut>
+    inline bool apply(Point const& ip, Point const& vertex,
+                Point const& perp1, Point const& perp2,
+                DistanceType const& buffer_distance,
+                RangeOut& range_out) const
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+
+        typedef typename geometry::select_most_precise
+            <
+                coordinate_type,
+                double
+            >::type promoted_type;
+
+        geometry::equal_to<Point> equals;
+
+        if (equals(perp1, perp2))
+        {
+#ifdef BOOST_GEOMETRY_DEBUG_BUFFER_WARN
+            std::cout << "Corner for equal points " << geometry::wkt(ip) << " " << geometry::wkt(perp1) << std::endl;
+#endif
+            return false;
+        }
+
+        // Generate 'vectors'
+        coordinate_type const vix = (get<0>(ip) - get<0>(vertex));
+        coordinate_type const viy = (get<1>(ip) - get<1>(vertex));
+
+        promoted_type const length_i = geometry::math::sqrt(vix * vix + viy * viy);
+
+        promoted_type const bd = geometry::math::abs(buffer_distance);
+        promoted_type prop = bd / length_i;
+
+        Point bp;
+        set<0>(bp, get<0>(vertex) + vix * prop);
+        set<1>(bp, get<1>(vertex) + viy * prop);
+
+        range_out.push_back(perp1);
+
+        if (m_max_level > 1)
+        {
+            mid_points<promoted_type>(vertex, perp1, bp, bd, range_out);
+            range_out.push_back(bp);
+            mid_points<promoted_type>(vertex, bp, perp2, bd, range_out);
+        }
+        else if (m_max_level == 1)
+        {
+            range_out.push_back(bp);
+        }
+
+        range_out.push_back(perp2);
+        return true;
+    }
+
+    template <typename NumericType>
+    static inline NumericType max_distance(NumericType const& distance)
+    {
+        return distance;
+    }
+
+private :
+    std::size_t m_max_level;
+};
+
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_JOIN_ROUND_BY_DIVIDE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_point_circle.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,116 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_CIRCLE_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_CIRCLE_HPP
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+/*!
+\brief Create a circular buffer around a point
+\ingroup strategies
+\details This strategy can be used as PointStrategy for the buffer algorithm.
+    It creates a circular buffer around a point. It can be applied
+    for points and multi_points, but also for a linestring (if it is degenerate,
+    so consisting of only one point) and for polygons (if it is degenerate).
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_point_circle]
+[heading Output]
+[$img/strategies/buffer_point_circle.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_point_square point_square]
+}
+ */
+class point_circle
+{
+public :
+    //! \brief Constructs the strategy
+    //! \param count number of points for the created circle (if count
+    //! is smaller than 3, count is internally set to 3)
+    explicit point_circle(std::size_t count = 90)
+        : m_count((count < 3u) ? 3u : count)
+    {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Fills output_range with a circle around point using distance_strategy
+    template
+    <
+        typename Point,
+        typename OutputRange,
+        typename DistanceStrategy
+    >
+    inline void apply(Point const& point,
+                DistanceStrategy const& distance_strategy,
+                OutputRange& output_range) const
+    {
+        typedef typename boost::range_value<OutputRange>::type output_point_type;
+
+        typedef typename geometry::select_most_precise
+            <
+                typename geometry::select_most_precise
+                    <
+                        typename geometry::coordinate_type<Point>::type,
+                        typename geometry::coordinate_type<output_point_type>::type
+                    >::type,
+                double
+            >::type promoted_type;
+
+        promoted_type const buffer_distance = distance_strategy.apply(point, point,
+                        strategy::buffer::buffer_side_left);
+
+        promoted_type const two = 2.0;
+        promoted_type const two_pi = two * geometry::math::pi<promoted_type>();
+
+        promoted_type const diff = two_pi / promoted_type(m_count);
+        promoted_type a = 0;
+
+        for (std::size_t i = 0; i < m_count; i++, a -= diff)
+        {
+            output_point_type p;
+            set<0>(p, get<0>(point) + buffer_distance * cos(a));
+            set<1>(p, get<1>(point) + buffer_distance * sin(a));
+            output_range.push_back(p);
+        }
+
+        // Close it:
+        output_range.push_back(output_range.front());
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+    std::size_t m_count;
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_CIRCLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_point_square.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,109 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
+
+#include <cstddef>
+
+#include <boost/range.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+/*!
+\brief Create a squared form buffer around a point
+\ingroup strategies
+\details This strategy can be used as PointStrategy for the buffer algorithm.
+    It creates a square from each point, where the point lies in the center.
+    It can be applied for points and multi_points, but also for a linestring (if it is degenerate,
+    so consisting of only one point) and for polygons (if it is degenerate).
+    This strategy is only applicable for Cartesian coordinate systems.
+
+\qbk{
+[heading Example]
+[buffer_point_square]
+[heading Output]
+[$img/strategies/buffer_point_square.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_point_circle point_circle]
+}
+ */
+class point_square
+{
+    template
+    <
+        typename Point,
+        typename DistanceType,
+        typename OutputRange
+    >
+    inline void add_point(Point const& point,
+                DistanceType const& distance,
+                DistanceType const& x,
+                DistanceType const& y,
+                OutputRange& output_range) const
+    {
+        typename boost::range_value<OutputRange>::type p;
+        set<0>(p, get<0>(point) + x * distance);
+        set<1>(p, get<1>(point) + y * distance);
+        output_range.push_back(p);
+    }
+
+    template
+    <
+        typename Point,
+        typename DistanceType,
+        typename OutputRange
+    >
+    inline void add_points(Point const& point,
+                DistanceType const& distance,
+                OutputRange& output_range) const
+    {
+        add_point(point, distance, -1.0, -1.0, output_range);
+        add_point(point, distance, -1.0, +1.0, output_range);
+        add_point(point, distance, +1.0, +1.0, output_range);
+        add_point(point, distance, +1.0, -1.0, output_range);
+
+        // Close it:
+        output_range.push_back(output_range.front());
+    }
+
+public :
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    //! Fills output_range with a square around point using distance_strategy
+    template
+    <
+        typename Point,
+        typename DistanceStrategy,
+        typename OutputRange
+    >
+    inline void apply(Point const& point,
+                DistanceStrategy const& distance_strategy,
+                OutputRange& output_range) const
+    {
+        add_points(point, distance_strategy.apply(point, point,
+                        strategy::buffer::buffer_side_left), output_range);
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/buffer_side_straight.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,105 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_SIDE_STRAIGHT_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_SIDE_STRAIGHT_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/strategies/side.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+
+
+/*!
+\brief Let the buffer use straight sides along segments (the default)
+\ingroup strategies
+\details This strategy can be used as SideStrategy for the buffer algorithm.
+    It is currently the only provided strategy for this purpose
+
+\qbk{
+[heading Example]
+See the examples for other buffer strategies\, for example
+[link geometry.reference.strategies.strategy_buffer_join_round join_round]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+}
+ */
+class side_straight
+{
+public :
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    template
+    <
+        typename Point,
+        typename OutputRange,
+        typename DistanceStrategy
+    >
+    static inline void apply(
+                Point const& input_p1, Point const& input_p2,
+                strategy::buffer::buffer_side_selector side,
+                DistanceStrategy const& distance,
+                OutputRange& output_range)
+    {
+        typedef typename coordinate_type<Point>::type coordinate_type;
+        typedef typename geometry::select_most_precise
+        <
+            coordinate_type,
+            double
+        >::type promoted_type;
+
+        // Generate a block along (left or right of) the segment
+
+        // Simulate a vector d (dx,dy)
+        coordinate_type const dx = get<0>(input_p2) - get<0>(input_p1);
+        coordinate_type const dy = get<1>(input_p2) - get<1>(input_p1);
+
+        // For normalization [0,1] (=dot product d.d, sqrt)
+        promoted_type const length = geometry::math::sqrt(dx * dx + dy * dy);
+
+        if (geometry::math::equals(length, 0))
+        {
+            // Coordinates are simplified and therefore most often not equal.
+            // But if simplify is skipped, or for lines with two
+            // equal points, length is 0 and we cannot generate output.
+            return;
+        }
+
+        // Generate the normalized perpendicular p, to the left (ccw)
+        promoted_type const px = -dy / length;
+        promoted_type const py = dx / length;
+
+        promoted_type const d = distance.apply(input_p1, input_p2, side);
+
+        output_range.resize(2);
+
+        set<0>(output_range.front(), get<0>(input_p1) + px * d);
+        set<1>(output_range.front(), get<1>(input_p1) + py * d);
+        set<0>(output_range.back(), get<0>(input_p2) + px * d);
+        set<1>(output_range.back(), get<1>(input_p2) + py * d);
+    }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+};
+
+
+}} // namespace strategy::buffer
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_SIDE_STRAIGHT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/centroid_average.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,126 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
+
+
+#include <cstddef>
+
+#include <boost/geometry/algorithms/assign.hpp>
+#include <boost/geometry/arithmetic/arithmetic.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+#include <boost/geometry/strategies/centroid.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace centroid
+{
+
+
+/*!
+\brief Centroid calculation taking average of points
+\ingroup strategies
+*/
+template
+<
+    typename PointCentroid,
+    typename Point = PointCentroid
+>
+class average
+{
+private :
+
+    /*! subclass to keep state */
+    class sum
+    {
+        friend class average;
+        std::size_t count;
+        PointCentroid centroid;
+
+    public :
+        inline sum()
+            : count(0)
+        {
+            assign_zero(centroid);
+        }
+    };
+
+public :
+    typedef sum state_type;
+    typedef PointCentroid centroid_point_type;
+    typedef Point point_type;
+
+    static inline void apply(Point const& p, sum& state)
+    {
+        add_point(state.centroid, p);
+        state.count++;
+    }
+
+    static inline bool result(sum const& state, PointCentroid& centroid)
+    {
+        centroid = state.centroid;
+        if ( state.count > 0 )
+        {
+            divide_value(centroid, state.count);
+            return true;
+        }
+        return false;
+    }
+
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+namespace services
+{
+
+template <typename Point, std::size_t DimensionCount, typename Geometry>
+struct default_strategy
+<
+    cartesian_tag,
+    pointlike_tag,
+    DimensionCount,
+    Point,
+    Geometry
+>
+{
+    typedef average
+        <
+            Point,
+            typename point_type<Geometry>::type
+        > type;
+};
+
+} // namespace services
+
+#endif
+
+
+}} // namespace strategy::centroid
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_CENTROID_AVERAGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_projected_point_ax.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,316 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2008-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PROJECTED_POINT_AX_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PROJECTED_POINT_AX_HPP
+
+
+#include <algorithm>
+
+#include <boost/concept_check.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/algorithms/convert.hpp>
+#include <boost/geometry/arithmetic/arithmetic.hpp>
+#include <boost/geometry/arithmetic/dot_product.hpp>
+
+#include <boost/geometry/strategies/tags.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+#include <boost/geometry/strategies/default_distance_result.hpp>
+#include <boost/geometry/strategies/cartesian/distance_pythagoras.hpp>
+#include <boost/geometry/strategies/cartesian/distance_projected_point.hpp>
+
+#include <boost/geometry/util/select_coordinate_type.hpp>
+
+// Helper geometry (projected point on line)
+#include <boost/geometry/geometries/point.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace strategy { namespace distance
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename T>
+struct projected_point_ax_result
+{
+    typedef T value_type;
+
+    projected_point_ax_result(T const& c = T(0))
+        : atd(c), xtd(c)
+    {}
+
+    projected_point_ax_result(T const& a, T const& x)
+        : atd(a), xtd(x)
+    {}
+
+    friend inline bool operator<(projected_point_ax_result const& left,
+                                 projected_point_ax_result const& right)
+    {
+        return left.xtd < right.xtd || left.atd < right.atd;
+    }
+
+    T atd, xtd;
+};
+
+// This less-comparator may be used as a parameter of detail::douglas_peucker.
+// In this simplify strategy distances are compared in 2 places
+// 1. to choose the furthest candidate (md < dist)
+// 2. to check if the candidate is further than max_distance (max_distance < md)
+template <typename Distance>
+class projected_point_ax_less
+{
+public:
+    projected_point_ax_less(Distance const& max_distance)
+        : m_max_distance(max_distance)
+    {}
+
+    inline bool operator()(Distance const& left, Distance const& right) const
+    {
+        //return left.xtd < right.xtd && right.atd < m_max_distance.atd;
+
+        typedef typename Distance::value_type value_type;
+
+        value_type const lx = left.xtd > m_max_distance.xtd ? left.xtd - m_max_distance.xtd : 0;
+        value_type const rx = right.xtd > m_max_distance.xtd ? right.xtd - m_max_distance.xtd : 0;
+        value_type const la = left.atd > m_max_distance.atd ? left.atd - m_max_distance.atd : 0;
+        value_type const ra = right.atd > m_max_distance.atd ? right.atd - m_max_distance.atd : 0;
+
+        value_type const l = (std::max)(lx, la);
+        value_type const r = (std::max)(rx, ra);
+
+        return l < r;
+    }
+private:
+    Distance const& m_max_distance;
+};
+
+// This strategy returns 2-component Point/Segment distance.
+// The ATD (along track distance) is parallel to the Segment
+// and is a distance between Point projected into a line defined by a Segment and the nearest Segment's endpoint.
+// If the projected Point intersects the Segment the ATD is equal to 0.
+// The XTD (cross track distance) is perpendicular to the Segment
+// and is a distance between input Point and its projection.
+// If the Segment has length equal to 0, ATD and XTD has value equal
+// to the distance between the input Point and one of the Segment's endpoints.
+//
+//          p3         p4
+//          ^         7
+//          |        /
+// p1<-----e========e----->p2
+//
+// p1: atd=D,   xtd=0
+// p2: atd=D,   xtd=0
+// p3: atd=0,   xtd=D
+// p4: atd=D/2, xtd=D
+template
+<
+    typename CalculationType = void,
+    typename Strategy = pythagoras<CalculationType>
+>
+class projected_point_ax
+{
+public :
+    template <typename Point, typename PointOfSegment>
+    struct calculation_type
+        : public projected_point<CalculationType, Strategy>
+            ::template calculation_type<Point, PointOfSegment>
+    {};
+
+    template <typename Point, typename PointOfSegment>
+    struct result_type
+    {
+        typedef projected_point_ax_result
+                    <
+                        typename calculation_type<Point, PointOfSegment>::type
+                    > type;
+    };
+
+public :
+
+    template <typename Point, typename PointOfSegment>
+    inline typename result_type<Point, PointOfSegment>::type
+    apply(Point const& p, PointOfSegment const& p1, PointOfSegment const& p2) const
+    {
+        assert_dimension_equal<Point, PointOfSegment>();
+
+        typedef typename calculation_type<Point, PointOfSegment>::type calculation_type;
+
+        // A projected point of points in Integer coordinates must be able to be
+        // represented in FP.
+        typedef model::point
+            <
+                calculation_type,
+                dimension<PointOfSegment>::value,
+                typename coordinate_system<PointOfSegment>::type
+            > fp_point_type;
+
+        // For convenience
+        typedef fp_point_type fp_vector_type;
+
+        /*
+            Algorithm [p: (px,py), p1: (x1,y1), p2: (x2,y2)]
+            VECTOR v(x2 - x1, y2 - y1)
+            VECTOR w(px - x1, py - y1)
+            c1 = w . v
+            c2 = v . v
+            b = c1 / c2
+            RETURN POINT(x1 + b * vx, y1 + b * vy)
+        */
+
+        // v is multiplied below with a (possibly) FP-value, so should be in FP
+        // For consistency we define w also in FP
+        fp_vector_type v, w, projected;
+
+        geometry::convert(p2, v);
+        geometry::convert(p, w);
+        geometry::convert(p1, projected);
+        subtract_point(v, projected);
+        subtract_point(w, projected);
+
+        Strategy strategy;
+        boost::ignore_unused_variable_warning(strategy);
+
+        typename result_type<Point, PointOfSegment>::type result;
+
+        calculation_type const zero = calculation_type();
+        calculation_type const c2 = dot_product(v, v);
+        if ( math::equals(c2, zero) )
+        {
+            result.xtd = strategy.apply(p, projected);
+            // assume that the 0-length segment is perpendicular to the Pt->ProjPt vector
+            result.atd = 0;
+            return result;
+        }
+
+        calculation_type const c1 = dot_product(w, v);
+        calculation_type const b = c1 / c2;
+        multiply_value(v, b);
+        add_point(projected, v);
+
+        result.xtd = strategy.apply(p, projected);
+
+        if (c1 <= zero)
+        {
+            result.atd = strategy.apply(p1, projected);
+        }
+        else if (c2 <= c1)
+        {
+            result.atd = strategy.apply(p2, projected);
+        }
+        else
+        {
+            result.atd = 0;
+        }
+
+        return result;
+    }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+
+template <typename CalculationType, typename Strategy>
+struct tag<detail::projected_point_ax<CalculationType, Strategy> >
+{
+    typedef strategy_tag_distance_point_segment type;
+};
+
+
+template <typename CalculationType, typename Strategy, typename P, typename PS>
+struct return_type<detail::projected_point_ax<CalculationType, Strategy>, P, PS>
+{
+    typedef typename detail::projected_point_ax<CalculationType, Strategy>
+                        ::template result_type<P, PS>::type type;
+};
+
+
+template <typename CalculationType, typename Strategy>
+struct comparable_type<detail::projected_point_ax<CalculationType, Strategy> >
+{
+    // Define a projected_point strategy with its underlying point-point-strategy
+    // being comparable
+    typedef detail::projected_point_ax
+        <
+            CalculationType,
+            typename comparable_type<Strategy>::type
+        > type;
+};
+
+
+template <typename CalculationType, typename Strategy>
+struct get_comparable<detail::projected_point_ax<CalculationType, Strategy> >
+{
+    typedef typename comparable_type
+        <
+            detail::projected_point_ax<CalculationType, Strategy>
+        >::type comparable_type;
+public :
+    static inline comparable_type apply(detail::projected_point_ax<CalculationType, Strategy> const& )
+    {
+        return comparable_type();
+    }
+};
+
+
+template <typename CalculationType, typename Strategy, typename P, typename PS>
+struct result_from_distance<detail::projected_point_ax<CalculationType, Strategy>, P, PS>
+{
+private :
+    typedef typename return_type<detail::projected_point_ax<CalculationType, Strategy>, P, PS>::type return_type;
+public :
+    template <typename T>
+    static inline return_type apply(detail::projected_point_ax<CalculationType, Strategy> const& , T const& value)
+    {
+        Strategy s;
+        return_type ret;
+        ret.atd = result_from_distance<Strategy, P, PS>::apply(s, value.atd);
+        ret.xtd = result_from_distance<Strategy, P, PS>::apply(s, value.xtd);
+        return ret;
+    }
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PROJECTED_POINT_AX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_pythagoras_box_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,338 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2008-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_BOX_BOX_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_BOX_BOX_HPP
+
+
+#include <boost/geometry/core/access.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/calculation_type.hpp>
+
+
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace distance
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <std::size_t I>
+struct compute_pythagoras_box_box
+{
+    template <typename Box1, typename Box2, typename T>
+    static inline void apply(Box1 const& box1, Box2 const& box2, T& result)
+    {
+        T const b1_min_coord =
+            boost::numeric_cast<T>(geometry::get<min_corner, I-1>(box1));
+        T const b1_max_coord =
+            boost::numeric_cast<T>(geometry::get<max_corner, I-1>(box1));
+
+        T const b2_min_coord =
+            boost::numeric_cast<T>(geometry::get<min_corner, I-1>(box2));
+        T const b2_max_coord =
+            boost::numeric_cast<T>(geometry::get<max_corner, I-1>(box2));
+
+        if ( b1_max_coord < b2_min_coord )
+        {
+            T diff = b2_min_coord - b1_max_coord;
+            result += diff * diff;
+        }
+        if ( b1_min_coord > b2_max_coord )
+        {
+            T diff = b1_min_coord - b2_max_coord;
+            result += diff * diff;
+        }
+
+        compute_pythagoras_box_box<I-1>::apply(box1, box2, result);
+    }
+};
+
+template <>
+struct compute_pythagoras_box_box<0>
+{
+    template <typename Box1, typename Box2, typename T>
+    static inline void apply(Box1 const&, Box2 const&, T&)
+    {
+    }
+};
+
+}
+#endif // DOXYGEN_NO_DETAIL
+
+
+namespace comparable
+{
+
+/*!
+\brief Strategy to calculate comparable distance between two boxes
+\ingroup strategies
+\tparam Box1 \tparam_first_box
+\tparam Box2 \tparam_second_box
+\tparam CalculationType \tparam_calculation
+*/
+template <typename CalculationType = void>
+class pythagoras_box_box
+{
+public :
+
+    template <typename Box1, typename Box2>
+    struct calculation_type
+    {
+        typedef typename util::calculation_type::geometric::binary
+            <
+                Box1,
+                Box2,
+                CalculationType
+            >::type type;
+    };
+
+    template <typename Box1, typename Box2>
+    static inline typename calculation_type<Box1, Box2>::type
+    apply(Box1 const& box1, Box2 const& box2)
+    {
+        BOOST_CONCEPT_ASSERT
+            ( (concept::ConstPoint<typename point_type<Box1>::type>) );
+        BOOST_CONCEPT_ASSERT
+            ( (concept::ConstPoint<typename point_type<Box2>::type>) );
+
+        // Calculate distance using Pythagoras
+        // (Leave comment above for Doxygen)
+
+        assert_dimension_equal<Box1, Box2>();
+
+        typename calculation_type<Box1, Box2>::type result(0);
+        
+        detail::compute_pythagoras_box_box
+            <
+                dimension<Box1>::value
+            >::apply(box1, box2, result);
+
+        return result;
+    }
+};
+
+} // namespace comparable
+
+
+/*!
+\brief Strategy to calculate the distance between two boxes
+\ingroup strategies
+\tparam CalculationType \tparam_calculation
+
+\qbk{
+[heading Notes]
+[note Can be used for boxes with two\, three or more dimensions]
+[heading See also]
+[link geometry.reference.algorithms.distance.distance_3_with_strategy distance (with strategy)]
+}
+
+*/
+template
+<
+    typename CalculationType = void
+>
+class pythagoras_box_box
+{
+public :
+
+    template <typename Box1, typename Box2>
+    struct calculation_type
+        : util::calculation_type::geometric::binary
+          <
+              Box1,
+              Box2,
+              CalculationType,
+              double,
+              double // promote integer to double
+          >
+    {};
+
+    /*!
+    \brief applies the distance calculation using pythagoras_box_box
+    \return the calculated distance (including taking the square root)
+    \param box1 first box
+    \param box2 second box
+    */
+    template <typename Box1, typename Box2>
+    static inline typename calculation_type<Box1, Box2>::type
+    apply(Box1 const& box1, Box2 const& box2)
+    {
+        // The cast is necessary for MSVC which considers sqrt __int64 as an ambiguous call
+        return math::sqrt
+            (
+                 boost::numeric_cast<typename calculation_type
+                     <
+                         Box1, Box2
+                     >::type>
+                    (
+                        comparable::pythagoras_box_box
+                            <
+                                CalculationType
+                            >::apply(box1, box2)
+                    )
+            );
+    }
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+template <typename CalculationType>
+struct tag<pythagoras_box_box<CalculationType> >
+{
+    typedef strategy_tag_distance_box_box type;
+};
+
+
+template <typename CalculationType, typename Box1, typename Box2>
+struct return_type<distance::pythagoras_box_box<CalculationType>, Box1, Box2>
+    : pythagoras_box_box<CalculationType>::template calculation_type<Box1, Box2>
+{};
+
+
+template <typename CalculationType>
+struct comparable_type<pythagoras_box_box<CalculationType> >
+{
+    typedef comparable::pythagoras_box_box<CalculationType> type;
+};
+
+
+template <typename CalculationType>
+struct get_comparable<pythagoras_box_box<CalculationType> >
+{
+    typedef comparable::pythagoras_box_box<CalculationType> comparable_type;
+public :
+    static inline comparable_type
+    apply(pythagoras_box_box<CalculationType> const& )
+    {
+        return comparable_type();
+    }
+};
+
+
+template <typename CalculationType, typename Box1, typename Box2>
+struct result_from_distance<pythagoras_box_box<CalculationType>, Box1, Box2>
+{
+private:
+    typedef typename return_type
+        <
+            pythagoras_box_box<CalculationType>, Box1, Box2
+        >::type return_type;
+public:
+    template <typename T>
+    static inline return_type
+    apply(pythagoras_box_box<CalculationType> const& , T const& value)
+    {
+        return return_type(value);
+    }
+};
+
+
+// Specializations for comparable::pythagoras_box_box
+template <typename CalculationType>
+struct tag<comparable::pythagoras_box_box<CalculationType> >
+{
+    typedef strategy_tag_distance_box_box type;
+};
+
+
+template <typename CalculationType, typename Box1, typename Box2>
+struct return_type<comparable::pythagoras_box_box<CalculationType>, Box1, Box2>
+    : comparable::pythagoras_box_box
+        <
+            CalculationType
+        >::template calculation_type<Box1, Box2>
+{};
+
+
+
+
+template <typename CalculationType>
+struct comparable_type<comparable::pythagoras_box_box<CalculationType> >
+{
+    typedef comparable::pythagoras_box_box<CalculationType> type;
+};
+
+
+template <typename CalculationType>
+struct get_comparable<comparable::pythagoras_box_box<CalculationType> >
+{
+    typedef comparable::pythagoras_box_box<CalculationType> comparable_type;
+public :
+    static inline comparable_type apply(comparable_type const& )
+    {
+        return comparable_type();
+    }
+};
+
+
+template <typename CalculationType, typename Box1, typename Box2>
+struct result_from_distance
+    <
+        comparable::pythagoras_box_box<CalculationType>, Box1, Box2
+    >
+{
+private :
+    typedef typename return_type
+        <
+            comparable::pythagoras_box_box<CalculationType>, Box1, Box2
+        >::type return_type;
+public :
+    template <typename T>
+    static inline return_type
+    apply(comparable::pythagoras_box_box<CalculationType> const&,
+          T const& value)
+    {
+        return_type const v = value;
+        return v * v;
+    }
+};
+
+
+template <typename BoxPoint1, typename BoxPoint2>
+struct default_strategy
+    <
+        box_tag, box_tag, BoxPoint1, BoxPoint2, cartesian_tag, cartesian_tag
+    >
+{
+    typedef pythagoras_box_box<> type;
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_BOX_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/distance_pythagoras_point_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,349 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2008-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_POINT_BOX_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_POINT_BOX_HPP
+
+
+#include <boost/geometry/core/access.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/calculation_type.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace distance
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <size_t I>
+struct compute_pythagoras_point_box
+{
+    template <typename Point, typename Box, typename T>
+    static inline void apply(Point const& point, Box const& box, T& result)
+    {
+        T const p_coord = boost::numeric_cast<T>(geometry::get<I-1>(point));
+        T const b_min_coord =
+            boost::numeric_cast<T>(geometry::get<min_corner, I-1>(box));
+        T const b_max_coord =
+            boost::numeric_cast<T>(geometry::get<max_corner, I-1>(box));
+
+        if ( p_coord < b_min_coord )
+        {
+            T diff = b_min_coord - p_coord;
+            result += diff * diff;
+        }
+        if ( p_coord > b_max_coord )
+        {
+            T diff = p_coord - b_max_coord;
+            result += diff * diff;
+        }
+
+        compute_pythagoras_point_box<I-1>::apply(point, box, result);
+    }
+};
+
+template <>
+struct compute_pythagoras_point_box<0>
+{
+    template <typename Point, typename Box, typename T>
+    static inline void apply(Point const&, Box const&, T&)
+    {
+    }
+};
+
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+
+namespace comparable
+{
+
+/*!
+    \brief Strategy to calculate comparable distance between a point
+    and a box
+    \ingroup strategies
+    \tparam Point \tparam_first_point
+    \tparam Box \tparam_second_box
+    \tparam CalculationType \tparam_calculation
+*/
+template <typename CalculationType = void>
+class pythagoras_point_box
+{
+public :
+
+    template <typename Point, typename Box>
+    struct calculation_type
+    {
+        typedef typename util::calculation_type::geometric::binary
+            <
+                Point, Box, CalculationType
+            >::type type;
+    };
+
+    template <typename Point, typename Box>
+    static inline typename calculation_type<Point, Box>::type
+    apply(Point const& point, Box const& box)
+    {
+        BOOST_CONCEPT_ASSERT( (concept::ConstPoint<Point>) );
+        BOOST_CONCEPT_ASSERT
+            ( (concept::ConstPoint<typename point_type<Box>::type>) );
+
+        // Calculate distance using Pythagoras
+        // (Leave comment above for Doxygen)
+
+        assert_dimension_equal<Point, Box>();
+
+        typename calculation_type<Point, Box>::type result(0);
+        
+        detail::compute_pythagoras_point_box
+            <
+                dimension<Point>::value
+            >::apply(point, box, result);
+
+        return result;
+    }
+};
+
+} // namespace comparable
+
+
+/*!
+\brief Strategy to calculate the distance between a point and a box
+\ingroup strategies
+\tparam CalculationType \tparam_calculation
+
+\qbk{
+[heading Notes]
+[note Can be used for points and boxes with two\, three or more dimensions]
+[heading See also]
+[link geometry.reference.algorithms.distance.distance_3_with_strategy distance (with strategy)]
+}
+
+*/
+template
+<
+    typename CalculationType = void
+>
+class pythagoras_point_box
+{
+public :
+
+    template <typename Point, typename Box>
+    struct calculation_type
+        : util::calculation_type::geometric::binary
+          <
+              Point,
+              Box,
+              CalculationType,
+              double,
+              double // promote integer to double
+          >
+    {};
+
+    /*!
+    \brief applies the distance calculation using pythagoras
+    \return the calculated distance (including taking the square root)
+    \param point point
+    \param box box
+    */
+    template <typename Point, typename Box>
+    static inline typename calculation_type<Point, Box>::type
+    apply(Point const& point, Box const& box)
+    {
+        // The cast is necessary for MSVC which considers sqrt __int64 as an ambiguous call
+        return math::sqrt
+            (
+                 boost::numeric_cast<typename calculation_type
+                     <
+                         Point, Box
+                     >::type>
+                    (
+                        comparable::pythagoras_point_box
+                            <
+                                CalculationType
+                            >::apply(point, box)
+                    )
+            );
+    }
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+template <typename CalculationType>
+struct tag<pythagoras_point_box<CalculationType> >
+{
+    typedef strategy_tag_distance_point_box type;
+};
+
+
+template <typename CalculationType, typename Point, typename Box>
+struct return_type<distance::pythagoras_point_box<CalculationType>, Point, Box>
+    : pythagoras_point_box
+        <
+            CalculationType
+        >::template calculation_type<Point, Box>
+{};
+
+
+template <typename CalculationType>
+struct comparable_type<pythagoras_point_box<CalculationType> >
+{
+    typedef comparable::pythagoras_point_box<CalculationType> type;
+};
+
+
+template <typename CalculationType>
+struct get_comparable<pythagoras_point_box<CalculationType> >
+{
+    typedef comparable::pythagoras_point_box<CalculationType> comparable_type;
+public :
+    static inline comparable_type
+    apply(pythagoras_point_box<CalculationType> const& )
+    {
+        return comparable_type();
+    }
+};
+
+
+template <typename CalculationType, typename Point, typename Box>
+struct result_from_distance<pythagoras_point_box<CalculationType>, Point, Box>
+{
+private :
+    typedef typename return_type
+        <
+            pythagoras_point_box<CalculationType>, Point, Box
+        >::type return_type;
+public :
+    template <typename T>
+    static inline return_type
+    apply(pythagoras_point_box<CalculationType> const& , T const& value)
+    {
+        return return_type(value);
+    }
+};
+
+
+// Specializations for comparable::pythagoras_point_box
+template <typename CalculationType>
+struct tag<comparable::pythagoras_point_box<CalculationType> >
+{
+    typedef strategy_tag_distance_point_box type;
+};
+
+
+template <typename CalculationType, typename Point, typename Box>
+struct return_type
+    <
+        comparable::pythagoras_point_box<CalculationType>, Point, Box
+    > : comparable::pythagoras_point_box
+        <
+            CalculationType
+        >::template calculation_type<Point, Box>
+{};
+
+
+
+
+template <typename CalculationType>
+struct comparable_type<comparable::pythagoras_point_box<CalculationType> >
+{
+    typedef comparable::pythagoras_point_box<CalculationType> type;
+};
+
+
+template <typename CalculationType>
+struct get_comparable<comparable::pythagoras_point_box<CalculationType> >
+{
+    typedef comparable::pythagoras_point_box<CalculationType> comparable_type;
+public :
+    static inline comparable_type apply(comparable_type const& )
+    {
+        return comparable_type();
+    }
+};
+
+
+template <typename CalculationType, typename Point, typename Box>
+struct result_from_distance
+    <
+        comparable::pythagoras_point_box<CalculationType>, Point, Box
+    >
+{
+private :
+    typedef typename return_type
+        <
+            comparable::pythagoras_point_box<CalculationType>, Point, Box
+        >::type return_type;
+public :
+    template <typename T>
+    static inline return_type
+    apply(comparable::pythagoras_point_box<CalculationType> const& ,
+          T const& value)
+    {
+        return_type const v = value;
+        return v * v;
+    }
+};
+
+
+template <typename Point, typename BoxPoint>
+struct default_strategy
+    <
+        point_tag, box_tag, Point, BoxPoint, cartesian_tag, cartesian_tag
+    >
+{
+    typedef pythagoras_point_box<> type;
+};
+
+template <typename BoxPoint, typename Point>
+struct default_strategy
+    <
+        box_tag, point_tag, BoxPoint, Point, cartesian_tag, cartesian_tag
+    >
+{
+    typedef typename default_strategy
+        <
+            point_tag, box_tag, Point, BoxPoint, cartesian_tag, cartesian_tag
+        >::type type;
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_DISTANCE_PYTHAGORAS_POINT_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/cartesian/side_of_intersection.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,119 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_SIDE_OF_INTERSECTION_HPP
+#define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_SIDE_OF_INTERSECTION_HPP
+
+
+#include <boost/geometry/arithmetic/determinant.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace side
+{
+
+// Calculates the side of the intersection-point (if any) of
+// of segment a//b w.r.t. segment c
+// This is calculated without (re)calculating the IP itself again and fully
+// based on integer mathematics; there are no divisions
+// It can be used for either integer (rescaled) points, and also for FP
+class side_of_intersection
+{
+public :
+
+    // Calculates the side of the intersection-point (if any) of
+    // of segment a//b w.r.t. segment c
+    // This is calculated without (re)calculating the IP itself again and fully
+    // based on integer mathematics
+    template <typename T, typename Segment>
+    static inline T side_value(Segment const& a, Segment const& b,
+                Segment const& c)
+    {
+        // The first point of the three segments is reused several times
+        T const ax = get<0, 0>(a);
+        T const ay = get<0, 1>(a);
+        T const bx = get<0, 0>(b);
+        T const by = get<0, 1>(b);
+        T const cx = get<0, 0>(c);
+        T const cy = get<0, 1>(c);
+
+        T const dx_a = get<1, 0>(a) - ax;
+        T const dy_a = get<1, 1>(a) - ay;
+
+        T const dx_b = get<1, 0>(b) - bx;
+        T const dy_b = get<1, 1>(b) - by;
+
+        T const dx_c = get<1, 0>(c) - cx;
+        T const dy_c = get<1, 1>(c) - cy;
+
+        // Cramer's rule: d (see cart_intersect.hpp)
+        T const d = geometry::detail::determinant<T>
+                    (
+                        dx_a, dy_a,
+                        dx_b, dy_b
+                    );
+
+        T const zero = T();
+        if (d == zero)
+        {
+            // There is no IP of a//b, they are collinear or parallel
+            // We don't have to divide but we can already conclude the side-value
+            // is meaningless and the resulting determinant will be 0
+            return zero;
+        }
+
+        // Cramer's rule: da (see cart_intersect.hpp)
+        T const da = geometry::detail::determinant<T>
+                    (
+                        dx_b,    dy_b,
+                        ax - bx, ay - by
+                    );
+
+        // IP is at (ax + (da/d) * dx_a, ay + (da/d) * dy_a)
+        // Side of IP is w.r.t. c is: determinant(dx_c, dy_c, ipx-cx, ipy-cy)
+        // We replace ipx by expression above and multiply each term by d
+        T const result = geometry::detail::determinant<T>
+                    (
+                        dx_c * d,                   dy_c * d,
+                        d * (ax - cx) + dx_a * da,  d * (ay - cy) + dy_a * da
+                    );
+
+        // Note: result / (d * d)
+        // is identical to the side_value of side_by_triangle
+        // Therefore, the sign is always the same as that result, and the
+        // resulting side (left,right,collinear) is the same
+
+        return result;
+
+    }
+
+    template <typename Segment>
+    static inline int apply(Segment const& a, Segment const& b, Segment const& c)
+    {
+        typedef typename geometry::coordinate_type<Segment>::type coordinate_type;
+        coordinate_type const s = side_value<coordinate_type>(a, b, c);
+        coordinate_type const zero = coordinate_type();
+        return math::equals(s, zero) ? 0
+            : s > zero ? 1
+            : -1;
+    }
+
+};
+
+
+}} // namespace strategy::side
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_SIDE_OF_INTERSECTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/comparable_distance_result.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,196 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP
+#define BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP
+
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector.hpp>
+
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/default_strategy.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/compress_variant.hpp>
+#include <boost/geometry/util/transform_variant.hpp>
+#include <boost/geometry/util/combine_if.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace resolve_strategy
+{
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+struct comparable_distance_result
+    : strategy::distance::services::return_type
+        <
+            typename strategy::distance::services::comparable_type
+                <
+                    Strategy
+                >::type,
+            typename point_type<Geometry1>::type,
+            typename point_type<Geometry2>::type
+        >
+{};
+
+template <typename Geometry1, typename Geometry2>
+struct comparable_distance_result<Geometry1, Geometry2, default_strategy>
+    : comparable_distance_result
+        <
+            Geometry1,
+            Geometry2,
+            typename detail::distance::default_strategy
+                <
+                    Geometry1, Geometry2
+                >::type
+        >
+{};
+
+} // namespace resolve_strategy
+
+
+namespace resolve_variant
+{
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+struct comparable_distance_result
+    : resolve_strategy::comparable_distance_result
+        <
+            Geometry1,
+            Geometry2,
+            Strategy
+        >
+{};
+
+
+template
+<
+    typename Geometry1,
+    BOOST_VARIANT_ENUM_PARAMS(typename T),
+    typename Strategy
+>
+struct comparable_distance_result
+    <
+        Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Strategy
+    >
+{
+    // A set of all variant type combinations that are compatible and
+    // implemented
+    typedef typename util::combine_if<
+        typename boost::mpl::vector1<Geometry1>,
+        typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+        boost::mpl::always<boost::mpl::true_>
+    >::type possible_input_types;
+
+    // The (possibly variant) result type resulting from these combinations
+    typedef typename compress_variant<
+        typename transform_variant<
+            possible_input_types,
+            resolve_strategy::comparable_distance_result<
+                boost::mpl::first<boost::mpl::_>,
+                boost::mpl::second<boost::mpl::_>,
+                Strategy
+            >,
+            boost::mpl::back_inserter<boost::mpl::vector0<> >
+        >::type
+    >::type type;
+};
+
+
+// Distance arguments are commutative
+template
+<
+    BOOST_VARIANT_ENUM_PARAMS(typename T),
+    typename Geometry2,
+    typename Strategy
+>
+struct comparable_distance_result
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        Geometry2,
+        Strategy
+    > : public comparable_distance_result
+        <
+            Geometry2, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Strategy
+        >
+{};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Strategy>
+struct comparable_distance_result
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        Strategy
+    >
+{
+    // A set of all variant type combinations that are compatible and
+    // implemented
+    typedef typename util::combine_if
+        <
+            typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+            typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+            boost::mpl::always<boost::mpl::true_>
+        >::type possible_input_types;
+
+    // The (possibly variant) result type resulting from these combinations
+    typedef typename compress_variant<
+        typename transform_variant<
+            possible_input_types,
+            resolve_strategy::comparable_distance_result<
+                boost::mpl::first<boost::mpl::_>,
+                boost::mpl::second<boost::mpl::_>,
+                Strategy
+            >,
+            boost::mpl::back_inserter<boost::mpl::vector0<> >
+        >::type
+    >::type type;
+};
+
+} // namespace resolve_variant
+
+
+
+
+
+/*!
+\brief Meta-function defining return type of comparable_distance function
+\ingroup distance
+*/
+template
+<
+    typename Geometry1,
+    typename Geometry2 = Geometry1,
+    typename Strategy = void
+>
+struct comparable_distance_result
+    : resolve_variant::comparable_distance_result
+        <
+            Geometry1, Geometry2, Strategy
+        >
+{};
+
+template <typename Geometry1, typename Geometry2>
+struct comparable_distance_result<Geometry1, Geometry2, void>
+    : comparable_distance_result<Geometry1, Geometry2, default_strategy>
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_COMPARABLE_DISTANCE_RESULT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/default_comparable_distance_result.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,43 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_DEFAULT_COMPARABLE_DISTANCE_RESULT_HPP
+#define BOOST_GEOMETRY_STRATEGIES_DEFAULT_COMPARABLE_DISTANCE_RESULT_HPP
+
+#include <boost/geometry/strategies/comparable_distance_result.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+/*!
+\brief Meta-function defining return type of comparable_distance function
+\ingroup distance
+\note The strategy defines the return-type (so this situation is different
+    from length, where distance is sqr/sqrt, but length always squared)
+ */
+template <typename Geometry1, typename Geometry2 = Geometry1>
+struct default_comparable_distance_result
+    : comparable_distance_result<Geometry1, Geometry2, void>
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_DEFAULT_COMPARABLE_DISTANCE_RESULT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/default_strategy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,34 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
+// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_DEFAULT_STRATEGY_HPP
+#define BOOST_GEOMETRY_STRATEGIES_DEFAULT_STRATEGY_HPP
+
+
+namespace boost { namespace geometry
+{
+
+// This is a strategy placeholder type, which is passed by the algorithm free
+// functions to the multi-stage resolving process. It's resolved into an actual
+// strategy type during the resolve_strategy stage, possibly depending on the
+// input geometry type(s). This typically happens after the resolve_variant
+// stage, as it needs to be based on concrete geometry types - as opposed to
+// variant geometry types.
+
+struct default_strategy {};
+
+}} // namespace boost::geometry
+
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_DEFAULT_STRATEGY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/distance_result.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,213 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2014-2015 Samuel Debionne, Grenoble, France.
+
+// This file was modified by Oracle on 2014, 2015.
+// Modifications copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_DISTANCE_RESULT_HPP
+#define BOOST_GEOMETRY_STRATEGIES_DISTANCE_RESULT_HPP
+
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector.hpp>
+
+#include <boost/variant/variant_fwd.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/default_strategy.hpp>
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/compress_variant.hpp>
+#include <boost/geometry/util/transform_variant.hpp>
+#include <boost/geometry/util/combine_if.hpp>
+
+#include <boost/geometry/algorithms/detail/distance/default_strategies.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace resolve_strategy
+{
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+struct distance_result
+    : strategy::distance::services::return_type
+        <
+            Strategy,
+            typename point_type<Geometry1>::type,
+            typename point_type<Geometry2>::type
+        >
+{};
+
+template <typename Geometry1, typename Geometry2>
+struct distance_result<Geometry1, Geometry2, default_strategy>
+    : distance_result
+        <
+            Geometry1,
+            Geometry2,
+            typename detail::distance::default_strategy
+                <
+                    Geometry1, Geometry2
+                >::type
+        >
+{};
+
+} // namespace resolve_strategy
+
+
+namespace resolve_variant
+{
+
+template <typename Geometry1, typename Geometry2, typename Strategy>
+struct distance_result
+    : resolve_strategy::distance_result
+        <
+            Geometry1,
+            Geometry2,
+            Strategy
+        >
+{};
+
+
+template
+<
+    typename Geometry1,
+    BOOST_VARIANT_ENUM_PARAMS(typename T),
+    typename Strategy
+>
+struct distance_result
+    <
+        Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Strategy
+    >
+{
+    // A set of all variant type combinations that are compatible and
+    // implemented
+    typedef typename util::combine_if<
+        typename boost::mpl::vector1<Geometry1>,
+        typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+        // Here we want should remove most of the combinations that
+        // are not valid, mostly to limit the size of the resulting MPL set.
+        // But is_implementedn is not ready for prime time
+        //
+        // util::is_implemented2<boost::mpl::_1, boost::mpl::_2, dispatch::distance<boost::mpl::_1, boost::mpl::_2> >
+        boost::mpl::always<boost::mpl::true_>
+    >::type possible_input_types;
+
+    // The (possibly variant) result type resulting from these combinations
+    typedef typename compress_variant<
+        typename transform_variant<
+            possible_input_types,
+            resolve_strategy::distance_result<
+                boost::mpl::first<boost::mpl::_>,
+                boost::mpl::second<boost::mpl::_>,
+                Strategy
+            >,
+            boost::mpl::back_inserter<boost::mpl::vector0<> >
+        >::type
+    >::type type;
+};
+
+
+// Distance arguments are commutative
+template
+<
+    BOOST_VARIANT_ENUM_PARAMS(typename T),
+    typename Geometry2,
+    typename Strategy
+>
+struct distance_result
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        Geometry2,
+        Strategy
+    > : public distance_result
+        <
+            Geometry2, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Strategy
+        >
+{};
+
+
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Strategy>
+struct distance_result
+    <
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
+        Strategy
+    >
+{
+    // A set of all variant type combinations that are compatible and
+    // implemented
+    typedef typename util::combine_if
+        <
+            typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+            typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+            // Here we want to try to remove most of the combinations
+            // that are not valid, mostly to limit the size of the
+            // resulting MPL vector.
+            // But is_implemented is not ready for prime time
+            //
+            // util::is_implemented2<boost::mpl::_1, boost::mpl::_2, dispatch::distance<boost::mpl::_1, boost::mpl::_2> >
+            boost::mpl::always<boost::mpl::true_>
+        >::type possible_input_types;
+
+    // The (possibly variant) result type resulting from these combinations
+    typedef typename compress_variant<
+        typename transform_variant<
+            possible_input_types,
+            resolve_strategy::distance_result<
+                boost::mpl::first<boost::mpl::_>,
+                boost::mpl::second<boost::mpl::_>,
+                Strategy
+            >,
+            boost::mpl::back_inserter<boost::mpl::vector0<> >
+        >::type
+    >::type type;
+};
+
+} // namespace resolve_variant
+
+
+/*!
+\brief Meta-function defining return type of distance function
+\ingroup distance
+\note The strategy defines the return-type (so this situation is different
+    from length, where distance is sqr/sqrt, but length always squared)
+ */
+template
+<
+    typename Geometry1,
+    typename Geometry2 = Geometry1,
+    typename Strategy = void
+>
+struct distance_result
+    : resolve_variant::distance_result<Geometry1, Geometry2, Strategy>
+{};
+
+
+template <typename Geometry1, typename Geometry2>
+struct distance_result<Geometry1, Geometry2, void>
+    : distance_result<Geometry1, Geometry2, default_strategy>
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_DISTANCE_RESULT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/distance_andoyer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,224 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_ANDOYER_HPP
+#define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_ANDOYER_HPP
+
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/radian_access.hpp>
+#include <boost/geometry/core/radius.hpp>
+#include <boost/geometry/core/srs.hpp>
+
+#include <boost/geometry/algorithms/detail/flattening.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/promote_floating_point.hpp>
+#include <boost/geometry/util/select_calculation_type.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace distance
+{
+
+
+/*!
+\brief Point-point distance approximation taking flattening into account
+\ingroup distance
+\tparam Spheroid The reference spheroid model
+\tparam CalculationType \tparam_calculation
+\author After Andoyer, 19xx, republished 1950, republished by Meeus, 1999
+\note Although not so well-known, the approximation is very good: in all cases the results
+are about the same as Vincenty. In my (Barend's) testcases the results didn't differ more than 6 m
+\see http://nacc.upc.es/tierra/node16.html
+\see http://sci.tech-archive.net/Archive/sci.geo.satellite-nav/2004-12/2724.html
+\see http://home.att.net/~srschmitt/great_circle_route.html (implementation)
+\see http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115 (implementation)
+\see http://futureboy.homeip.net/frinksamp/navigation.frink (implementation)
+\see http://www.voidware.com/earthdist.htm (implementation)
+*/
+template
+<
+    typename Spheroid,
+    typename CalculationType = void
+>
+class andoyer
+{
+public :
+    template <typename Point1, typename Point2>
+    struct calculation_type
+        : promote_floating_point
+          <
+              typename select_calculation_type
+                  <
+                      Point1,
+                      Point2,
+                      CalculationType
+                  >::type
+          >
+    {};
+
+    typedef Spheroid model_type;
+
+    inline andoyer()
+        : m_spheroid()
+    {}
+
+    explicit inline andoyer(Spheroid const& spheroid)
+        : m_spheroid(spheroid)
+    {}
+
+
+    template <typename Point1, typename Point2>
+    inline typename calculation_type<Point1, Point2>::type
+    apply(Point1 const& point1, Point2 const& point2) const
+    {
+        return calc<typename calculation_type<Point1, Point2>::type>
+            (
+                get_as_radian<0>(point1), get_as_radian<1>(point1),
+                get_as_radian<0>(point2), get_as_radian<1>(point2)
+            );
+    }
+
+    inline Spheroid const& model() const
+    {
+        return m_spheroid;
+    }
+
+private :
+    template <typename CT, typename T>
+    inline CT calc(T const& lon1,
+                T const& lat1,
+                T const& lon2,
+                T const& lat2) const
+    {
+        CT const G = (lat1 - lat2) / 2.0;
+        CT const lambda = (lon1 - lon2) / 2.0;
+
+        if (geometry::math::equals(lambda, 0.0)
+            && geometry::math::equals(G, 0.0))
+        {
+            return 0.0;
+        }
+
+        CT const F = (lat1 + lat2) / 2.0;
+
+        CT const sinG2 = math::sqr(sin(G));
+        CT const cosG2 = math::sqr(cos(G));
+        CT const sinF2 = math::sqr(sin(F));
+        CT const cosF2 = math::sqr(cos(F));
+        CT const sinL2 = math::sqr(sin(lambda));
+        CT const cosL2 = math::sqr(cos(lambda));
+
+        CT const S = sinG2 * cosL2 + cosF2 * sinL2;
+        CT const C = cosG2 * cosL2 + sinF2 * sinL2;
+
+        CT const c0 = 0;
+        CT const c1 = 1;
+        CT const c2 = 2;
+        CT const c3 = 3;
+
+        if (geometry::math::equals(S, c0) || geometry::math::equals(C, c0))
+        {
+            return c0;
+        }
+
+        CT const radius_a = CT(get_radius<0>(m_spheroid));
+        CT const flattening = geometry::detail::flattening<CT>(m_spheroid);
+
+        CT const omega = atan(math::sqrt(S / C));
+        CT const r3 = c3 * math::sqrt(S * C) / omega; // not sure if this is r or greek nu
+        CT const D = c2 * omega * radius_a;
+        CT const H1 = (r3 - c1) / (c2 * C);
+        CT const H2 = (r3 + c1) / (c2 * S);
+
+        return D * (c1 + flattening * (H1 * sinF2 * cosG2 - H2 * cosF2 * sinG2) );
+    }
+
+    Spheroid m_spheroid;
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+template <typename Spheroid, typename CalculationType>
+struct tag<andoyer<Spheroid, CalculationType> >
+{
+    typedef strategy_tag_distance_point_point type;
+};
+
+
+template <typename Spheroid, typename CalculationType, typename P1, typename P2>
+struct return_type<andoyer<Spheroid, CalculationType>, P1, P2>
+    : andoyer<Spheroid, CalculationType>::template calculation_type<P1, P2>
+{};
+
+
+template <typename Spheroid, typename CalculationType>
+struct comparable_type<andoyer<Spheroid, CalculationType> >
+{
+    typedef andoyer<Spheroid, CalculationType> type;
+};
+
+
+template <typename Spheroid, typename CalculationType>
+struct get_comparable<andoyer<Spheroid, CalculationType> >
+{
+    static inline andoyer<Spheroid, CalculationType> apply(andoyer<Spheroid, CalculationType> const& input)
+    {
+        return input;
+    }
+};
+
+template <typename Spheroid, typename CalculationType, typename P1, typename P2>
+struct result_from_distance<andoyer<Spheroid, CalculationType>, P1, P2>
+{
+    template <typename T>
+    static inline typename return_type<andoyer<Spheroid, CalculationType>, P1, P2>::type
+        apply(andoyer<Spheroid, CalculationType> const& , T const& value)
+    {
+        return value;
+    }
+};
+
+
+template <typename Point1, typename Point2>
+struct default_strategy<point_tag, point_tag, Point1, Point2, geographic_tag, geographic_tag>
+{
+    typedef strategy::distance::andoyer
+                <
+                    srs::spheroid
+                        <
+                            typename select_coordinate_type<Point1, Point2>::type
+                        >
+                > type;
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_ANDOYER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/distance_vincenty.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,161 @@
+// Boost.Geometry
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP
+#define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP
+
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/radian_access.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/promote_floating_point.hpp>
+#include <boost/geometry/util/select_calculation_type.hpp>
+
+#include <boost/geometry/algorithms/detail/vincenty_inverse.hpp>
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace distance
+{
+
+/*!
+\brief Distance calculation formulae on latlong coordinates, after Vincenty, 1975
+\ingroup distance
+\tparam Spheroid The reference spheroid model
+\tparam CalculationType \tparam_calculation
+\author See
+    - http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
+    - http://www.icsm.gov.au/gda/gdav2.3.pdf
+\author Adapted from various implementations to get it close to the original document
+    - http://www.movable-type.co.uk/scripts/LatLongVincenty.html
+    - http://exogen.case.edu/projects/geopy/source/geopy.distance.html
+    - http://futureboy.homeip.net/fsp/colorize.fsp?fileName=navigation.frink
+
+*/
+template
+<
+    typename Spheroid,
+    typename CalculationType = void
+>
+class vincenty
+{
+public :
+    template <typename Point1, typename Point2>
+    struct calculation_type
+        : promote_floating_point
+          <
+              typename select_calculation_type
+                  <
+                      Point1,
+                      Point2,
+                      CalculationType
+                  >::type
+          >
+    {};
+
+    typedef Spheroid model_type;
+
+    inline vincenty()
+        : m_spheroid()
+    {}
+
+    explicit inline vincenty(Spheroid const& spheroid)
+        : m_spheroid(spheroid)
+    {}
+
+    template <typename Point1, typename Point2>
+    inline typename calculation_type<Point1, Point2>::type
+    apply(Point1 const& point1, Point2 const& point2) const
+    {
+        return geometry::detail::vincenty_inverse
+                <
+                    typename calculation_type<Point1, Point2>::type
+                >(get_as_radian<0>(point1),
+                  get_as_radian<1>(point1),
+                  get_as_radian<0>(point2),
+                  get_as_radian<1>(point2),
+                  m_spheroid).distance();
+    }
+
+    inline Spheroid const& model() const
+    {
+        return m_spheroid;
+    }
+
+private :
+    Spheroid m_spheroid;
+};
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+template <typename Spheroid, typename CalculationType>
+struct tag<vincenty<Spheroid, CalculationType> >
+{
+    typedef strategy_tag_distance_point_point type;
+};
+
+
+template <typename Spheroid, typename CalculationType, typename P1, typename P2>
+struct return_type<vincenty<Spheroid, CalculationType>, P1, P2>
+    : vincenty<Spheroid, CalculationType>::template calculation_type<P1, P2>
+{};
+
+
+template <typename Spheroid, typename CalculationType>
+struct comparable_type<vincenty<Spheroid, CalculationType> >
+{
+    typedef vincenty<Spheroid, CalculationType> type;
+};
+
+
+template <typename Spheroid, typename CalculationType>
+struct get_comparable<vincenty<Spheroid, CalculationType> >
+{
+    static inline vincenty<Spheroid, CalculationType> apply(vincenty<Spheroid, CalculationType> const& input)
+    {
+        return input;
+    }
+};
+
+template <typename Spheroid, typename CalculationType, typename P1, typename P2>
+struct result_from_distance<vincenty<Spheroid, CalculationType>, P1, P2 >
+{
+    template <typename T>
+    static inline typename return_type<vincenty<Spheroid, CalculationType>, P1, P2>::type
+        apply(vincenty<Spheroid, CalculationType> const& , T const& value)
+    {
+        return value;
+    }
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+// We might add a vincenty-like strategy also for point-segment distance, but to calculate the projected point is not trivial
+
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/geographic/mapping_ssf.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,185 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2011-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_MAPPING_SSF_HPP
+#define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_MAPPING_SSF_HPP
+
+
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/geometry/core/radius.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/promote_floating_point.hpp>
+#include <boost/geometry/util/select_calculation_type.hpp>
+
+#include <boost/geometry/strategies/side.hpp>
+#include <boost/geometry/strategies/spherical/ssf.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace side
+{
+
+
+// An enumeration type defining types of mapping of geographical
+// latitude to spherical latitude.
+// See: http://en.wikipedia.org/wiki/Great_ellipse
+//      http://en.wikipedia.org/wiki/Latitude#Auxiliary_latitudes
+enum mapping_type { mapping_geodetic, mapping_reduced, mapping_geocentric };
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+template <typename Spheroid, mapping_type Mapping>
+struct mapper
+{
+    explicit inline mapper(Spheroid const& /*spheroid*/) {}
+
+    template <typename CalculationType>
+    static inline CalculationType const& apply(CalculationType const& lat)
+    {
+        return lat;
+    }
+};
+
+template <typename Spheroid>
+struct mapper<Spheroid, mapping_reduced>
+{
+    typedef typename promote_floating_point
+        <
+            typename radius_type<Spheroid>::type
+        >::type fraction_type;
+
+    explicit inline mapper(Spheroid const& spheroid)
+    {
+        fraction_type const a = geometry::get_radius<0>(spheroid);
+        fraction_type const b = geometry::get_radius<2>(spheroid);
+        b_div_a = b / a;
+    }
+
+    template <typename CalculationType>
+    inline CalculationType apply(CalculationType const& lat) const
+    {
+        return atan(static_cast<CalculationType>(b_div_a) * tan(lat));
+    }
+
+    fraction_type b_div_a;
+};
+
+template <typename Spheroid>
+struct mapper<Spheroid, mapping_geocentric>
+{
+    typedef typename promote_floating_point
+        <
+            typename radius_type<Spheroid>::type
+        >::type fraction_type;
+
+    explicit inline mapper(Spheroid const& spheroid)
+    {
+        fraction_type const a = geometry::get_radius<0>(spheroid);
+        fraction_type const b = geometry::get_radius<2>(spheroid);
+        sqr_b_div_a = b / a;
+        sqr_b_div_a *= sqr_b_div_a;
+    }
+
+    template <typename CalculationType>
+    inline CalculationType apply(CalculationType const& lat) const
+    {
+        return atan(static_cast<CalculationType>(sqr_b_div_a) * tan(lat));
+    }
+
+    fraction_type sqr_b_div_a;
+};
+
+}
+#endif // DOXYGEN_NO_DETAIL
+
+
+/*!
+\brief Check at which side of a geographical segment a point lies
+         left of segment (> 0), right of segment (< 0), on segment (0).
+         The check is performed by mapping the geographical coordinates
+         to spherical coordinates and using spherical_side_formula.
+\ingroup strategies
+\tparam Spheroid The reference spheroid model
+\tparam Mapping The type of mapping of geographical to spherical latitude
+\tparam CalculationType \tparam_calculation
+ */
+template <typename Spheroid,
+          mapping_type Mapping = mapping_geodetic,
+          typename CalculationType = void>
+class mapping_spherical_side_formula
+{
+
+public :
+    inline mapping_spherical_side_formula()
+        : m_mapper(Spheroid())
+    {}
+
+    explicit inline mapping_spherical_side_formula(Spheroid const& spheroid)
+        : m_mapper(spheroid)
+    {}
+
+    template <typename P1, typename P2, typename P>
+    inline int apply(P1 const& p1, P2 const& p2, P const& p)
+    {
+        typedef typename promote_floating_point
+            <
+                typename select_calculation_type_alt
+                    <
+                        CalculationType,
+                        P1, P2, P
+                    >::type
+            >::type calculation_type;
+
+        calculation_type lon1 = get_as_radian<0>(p1);
+        calculation_type lat1 = m_mapper.template apply<calculation_type>(get_as_radian<1>(p1));
+        calculation_type lon2 = get_as_radian<0>(p2);
+        calculation_type lat2 = m_mapper.template apply<calculation_type>(get_as_radian<1>(p2));
+        calculation_type lon = get_as_radian<0>(p);
+        calculation_type lat = m_mapper.template apply<calculation_type>(get_as_radian<1>(p));
+
+        return detail::spherical_side_formula(lon1, lat1, lon2, lat2, lon, lat);
+    }
+
+private:
+    side::detail::mapper<Spheroid, Mapping> const m_mapper;
+};
+
+// The specialization for geodetic latitude which can be used directly
+template <typename Spheroid,
+          typename CalculationType>
+class mapping_spherical_side_formula<Spheroid, mapping_geodetic, CalculationType>
+{
+
+public :
+    inline mapping_spherical_side_formula() {}
+    explicit inline mapping_spherical_side_formula(Spheroid const& /*spheroid*/) {}
+
+    template <typename P1, typename P2, typename P>
+    static inline int apply(P1 const& p1, P2 const& p2, P const& p)
+    {
+        return spherical_side_formula<CalculationType>::apply(p1, p2, p);
+    }
+};
+
+}} // namespace strategy::side
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_MAPPING_SSF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,287 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
+// Copyright (c) 2008-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_SPHERICAL_DISTANCE_CROSS_TRACK_POINT_BOX_HPP
+#define BOOST_GEOMETRY_STRATEGIES_SPHERICAL_DISTANCE_CROSS_TRACK_POINT_BOX_HPP
+
+
+#include <boost/geometry/core/access.hpp>
+
+#include <boost/geometry/strategies/distance.hpp>
+
+#include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/calculation_type.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace distance
+{
+
+template
+<
+    typename CalculationType = void,
+    typename Strategy = haversine<double, CalculationType>
+>
+class cross_track_point_box
+{
+public:
+    template <typename Point, typename Box>
+    struct return_type
+        : promote_floating_point
+          <
+              typename select_calculation_type
+                  <
+                      Point,
+                      typename point_type<Box>::type,
+                      CalculationType
+                  >::type
+          >
+    {};
+
+    inline cross_track_point_box()
+    {}
+
+    explicit inline cross_track_point_box(typename Strategy::radius_type const& r)
+        : m_pp_strategy(r)
+    {}
+
+    inline cross_track_point_box(Strategy const& s)
+        : m_pp_strategy(s)
+    {}
+    
+    template <typename Point, typename Box>
+    inline typename return_type<Point, Box>::type
+    apply(Point const& point, Box const& box) const
+    {
+
+#if !defined(BOOST_MSVC)
+        BOOST_CONCEPT_ASSERT
+            (
+                (concept::PointDistanceStrategy
+                    <
+                        Strategy, Point,
+                        typename point_type<Box>::type
+                    >)
+            );
+#endif
+
+        typedef typename return_type<Point, Box>::type return_type;
+        typedef typename point_type<Box>::type box_point_t;
+        
+        // Create (counterclockwise) array of points, the fifth one closes it
+        // If every point is on the LEFT side (=1) or ON the border (=0)
+        // the distance should be equal to 0.
+
+        // TODO: This strategy as well as other cross-track strategies
+        // and therefore e.g. spherical within(Point, Box) may not work
+        // properly for a Box degenerated to a Segment or Point
+
+        boost::array<box_point_t, 5> bp;
+        geometry::detail::assign_box_corners_oriented<true>(box, bp);
+        bp[4] = bp[0];
+
+        for (int i = 1; i < 5; i++)
+        {
+            box_point_t const& p1 = bp[i - 1];
+            box_point_t const& p2 = bp[i];
+
+            return_type const crs_AD = geometry::detail::course<return_type>(p1, point);
+            return_type const crs_AB = geometry::detail::course<return_type>(p1, p2);
+            return_type const d_crs1 = crs_AD - crs_AB;
+            return_type const sin_d_crs1 = sin(d_crs1);
+
+            // this constant sin() is here to be consistent with the side strategy
+            return_type const sigXTD = asin(sin(0.001) * sin_d_crs1);
+
+            // If the point is on the right side of the edge
+            if ( sigXTD > 0 )
+            {
+                return_type const crs_BA = crs_AB - geometry::math::pi<return_type>();
+                return_type const crs_BD = geometry::detail::course<return_type>(p2, point);
+                return_type const d_crs2 = crs_BD - crs_BA;
+
+                return_type const projection1 = cos( d_crs1 );
+                return_type const projection2 = cos( d_crs2 );
+
+                if(projection1 > 0.0 && projection2 > 0.0)
+                {
+                    return_type const d1 = m_pp_strategy.apply(p1, point);
+                    return_type const
+                        XTD = radius()
+                            * geometry::math::abs(
+                                asin( sin( d1 / radius() ) * sin_d_crs1 )
+                              );
+
+                    return return_type(XTD);
+                }
+                else
+                {
+                    // OPTIMIZATION
+                    // Return d1 if projection1 <= 0 and d2 if projection2 <= 0
+                    // if both == 0 then return d1 or d2
+                    // both shouldn't be < 0
+
+                    return_type const d1 = m_pp_strategy.apply(p1, point);
+                    return_type const d2 = m_pp_strategy.apply(p2, point);
+
+                    return return_type((std::min)( d1 , d2 ));
+                }
+            }
+        }
+
+        // Return 0 if the point isn't on the right side of any segment
+        return return_type(0);
+    }
+
+    inline typename Strategy::radius_type radius() const
+    { return m_pp_strategy.radius(); }
+
+private :
+
+    Strategy m_pp_strategy;
+};
+
+
+#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+namespace services
+{
+
+template <typename CalculationType, typename Strategy>
+struct tag<cross_track_point_box<CalculationType, Strategy> >
+{
+    typedef strategy_tag_distance_point_box type;
+};
+
+
+template <typename CalculationType, typename Strategy, typename P, typename Box>
+struct return_type<cross_track_point_box<CalculationType, Strategy>, P, Box>
+    : cross_track_point_box<CalculationType, Strategy>::template return_type<P, Box>
+{};
+
+
+template <typename CalculationType, typename Strategy>
+struct comparable_type<cross_track_point_box<CalculationType, Strategy> >
+{
+    // There is no shortcut, so the strategy itself is its comparable type
+    typedef cross_track_point_box<CalculationType, Strategy>  type;
+};
+
+
+template
+<
+    typename CalculationType,
+    typename Strategy
+>
+struct get_comparable<cross_track_point_box<CalculationType, Strategy> >
+{
+    typedef typename comparable_type
+        <
+            cross_track_point_box<CalculationType, Strategy>
+        >::type comparable_type;
+public :
+    static inline comparable_type apply(
+        cross_track_point_box<CalculationType, Strategy> const& strategy)
+    {
+        return cross_track_point_box<CalculationType, Strategy>(strategy.radius());
+    }
+};
+
+
+template
+<
+    typename CalculationType,
+    typename Strategy,
+    typename P, typename Box
+>
+struct result_from_distance
+    <
+        cross_track_point_box<CalculationType, Strategy>,
+        P,
+        Box
+    >
+{
+private :
+    typedef typename cross_track_point_box
+        <
+            CalculationType, Strategy
+        >::template return_type<P, Box> return_type;
+public :
+    template <typename T>
+    static inline return_type apply(
+        cross_track_point_box<CalculationType, Strategy> const& ,
+        T const& distance)
+    {
+        return distance;
+    }
+};
+
+
+template <typename Point, typename Box, typename Strategy>
+struct default_strategy
+    <
+        point_tag, box_tag, Point, Box,
+        spherical_equatorial_tag, spherical_equatorial_tag,
+        Strategy
+    >
+{
+    typedef cross_track_point_box
+        <
+            void,
+            typename boost::mpl::if_
+                <
+                    boost::is_void<Strategy>,
+                    typename default_strategy
+                        <
+                            point_tag, point_tag,
+                            Point, typename point_type<Box>::type,
+                            spherical_equatorial_tag, spherical_equatorial_tag
+                        >::type,
+                    Strategy
+                >::type
+        > type;
+};
+
+
+template <typename Box, typename Point, typename Strategy>
+struct default_strategy
+    <
+        box_tag, point_tag, Box, Point,
+        spherical_equatorial_tag, spherical_equatorial_tag,
+        Strategy
+    >
+{
+    typedef typename default_strategy
+        <
+            point_tag, box_tag, Point, Box,
+            spherical_equatorial_tag, spherical_equatorial_tag,
+            Strategy
+        >::type type;
+};
+
+
+} // namespace services
+#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
+
+
+}} // namespace strategy::distance
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_STRATEGIES_SPHERICAL_DISTANCE_CROSS_TRACK_POINT_BOX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/combine_if.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,94 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015 Samuel Debionne, Grenoble, France.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_COMBINE_IF_HPP
+#define BOOST_GEOMETRY_UTIL_COMBINE_IF_HPP
+
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/placeholders.hpp>
+
+#include <boost/type_traits.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace util
+{
+
+
+/*!
+    \brief Meta-function to generate all the combination of pairs of types
+        from a given sequence Sequence except those that does not satisfy the
+        predicate Pred
+    \ingroup utility
+    \par Example
+    \code
+        typedef boost::mpl::vector<boost::mpl::int_<0>, boost::mpl::int_<1> > types;
+        typedef combine_if<types, types, always<true_> >::type combinations;
+        typedef boost::mpl::vector<
+            pair<boost::mpl::int_<1>, boost::mpl::int_<1> >,
+            pair<boost::mpl::int_<1>, boost::mpl::int_<0> >,
+            pair<boost::mpl::int_<0>, boost::mpl::int_<1> >,
+            pair<boost::mpl::int_<0>, boost::mpl::int_<0> >        
+        > result_types;
+        
+        BOOST_MPL_ASSERT(( boost::mpl::equal<combinations, result_types> ));
+    \endcode
+*/
+template <typename Sequence1, typename Sequence2, typename Pred>
+struct combine_if
+{
+    struct combine
+    {
+        template <typename Result, typename T>
+        struct apply
+        {
+            typedef typename boost::mpl::fold<Sequence2, Result,
+                boost::mpl::if_
+                <
+                    boost::mpl::bind
+                        <
+                            typename boost::mpl::lambda<Pred>::type,
+                            T,
+                            boost::mpl::_2
+                        >,
+                    boost::mpl::insert
+                        <
+                            boost::mpl::_1, boost::mpl::pair<T, boost::mpl::_2>
+                        >,
+                    boost::mpl::_1
+                >
+            >::type type;
+        };
+    };
+
+    typedef typename boost::mpl::fold
+        <
+            Sequence1, boost::mpl::set0<>, combine
+        >::type type;
+};
+
+
+} // namespace util
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_UTIL_COMBINE_IF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/compress_variant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,106 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP
+#define BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP
+
+
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace detail
+{
+
+template <typename Variant>
+struct unique_types:
+    boost::mpl::fold<
+        typename boost::mpl::reverse_fold<
+            typename Variant::types,
+            boost::mpl::set<>,
+            boost::mpl::insert<
+                boost::mpl::placeholders::_1,
+                boost::mpl::placeholders::_2
+            >
+        >::type,
+        boost::mpl::vector<>,
+        boost::mpl::push_back
+            <
+                boost::mpl::placeholders::_1, boost::mpl::placeholders::_2
+            >
+    >
+{};
+
+template <typename Types>
+struct variant_or_single:
+    boost::mpl::if_<
+        boost::mpl::equal_to<
+            boost::mpl::size<Types>,
+            boost::mpl::int_<1>
+        >,
+        typename boost::mpl::front<Types>::type,
+        typename make_variant_over<Types>::type
+    >
+{};
+
+} // namespace detail
+
+
+/*!
+    \brief Meta-function that takes a boost::variant type and tries to minimize
+        it by doing the following:
+        - if there's any duplicate types, remove them
+        - if the result is a variant of one type, turn it into just that type
+    \ingroup utility
+    \par Example
+    \code
+        typedef variant<int, float, int, long> variant_type;
+        typedef compress_variant<variant_type>::type compressed;
+        typedef boost::mpl::vector<int, float, long> result_types;
+        BOOST_MPL_ASSERT(( boost::mpl::equal<compressed::types, result_types> ));
+
+        typedef variant<int, int, int> one_type_variant_type;
+        typedef compress_variant<one_type_variant_type>::type single_type;
+        BOOST_MPL_ASSERT(( boost::equals<single_type, int> ));
+    \endcode
+*/
+
+template <typename Variant>
+struct compress_variant:
+    detail::variant_or_single<
+        typename detail::unique_types<Variant>::type
+    >
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/condition.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+// Boost.Geometry
+
+// Copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_CONDITION_HPP
+#define BOOST_GEOMETRY_UTIL_CONDITION_HPP
+
+
+#include <boost/config.hpp>
+
+
+// The macro defined in this file allows to suppress the MSVC
+// compiler warning C4127: conditional expression is constant
+
+#ifdef BOOST_MSVC
+
+// NOTE: The code commented out below contains an alternative implementation
+// of a macro using a free function. It was left here in case if in the future
+// version of MSVC for the code currently used in the macro implementation
+// the warning was generated.
+
+//#ifndef DOXYGEN_NO_DETAIL
+//namespace boost { namespace geometry { namespace detail {
+//BOOST_FORCEINLINE bool condition(bool const b) { return b; }
+//}}} // boost::geometry::detail
+//#endif // DOXYGEN_NO_DETAIL
+//#define BOOST_GEOMETRY_CONDITION(CONDITION) boost::geometry::detail::condition(CONDITION)
+
+#define BOOST_GEOMETRY_CONDITION(CONDITION) ((void)0, (CONDITION))
+
+#else
+
+#define BOOST_GEOMETRY_CONDITION(CONDITION) (CONDITION)
+
+#endif
+
+
+#endif // BOOST_GEOMETRY_UTIL_CONDITION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/promote_integral.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,318 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_UTIL_PROMOTE_INTEGRAL_HPP
+#define BOOST_GEOMETRY_UTIL_PROMOTE_INTEGRAL_HPP
+
+// For now deactivate the use of multiprecision integers
+// TODO: activate it later
+#define BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER
+
+#include <climits>
+#include <cstddef>
+
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/deref.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/list.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/size_t.hpp>
+
+#if !defined(BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER)
+#include <boost/multiprecision/cpp_int.hpp>
+#endif
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace promote_integral
+{
+
+// meta-function that returns the bit size of a type
+template
+<
+    typename T,
+    bool IsFundamental = boost::is_fundamental<T>::type::value
+>
+struct bit_size
+{};
+
+
+// for fundamental types, just return CHAR_BIT * sizeof(T)
+template <typename T>
+struct bit_size<T, true>
+    : boost::mpl::size_t<(CHAR_BIT * sizeof(T))>
+{};
+
+
+#if !defined(BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER)
+// partial specialization for cpp_int
+template
+<
+    unsigned MinSize,
+    unsigned MaxSize,
+    boost::multiprecision::cpp_integer_type SignType,
+    boost::multiprecision::cpp_int_check_type Checked,
+    typename Allocator,
+    boost::multiprecision::expression_template_option ExpressionTemplates
+>
+struct bit_size
+    <
+        boost::multiprecision::number
+            <
+                boost::multiprecision::cpp_int_backend
+                    <
+                        MinSize, MaxSize, SignType, Checked, Allocator
+                    >,
+                ExpressionTemplates
+            >,
+        false
+    > : boost::mpl::size_t<MaxSize>
+{};
+#endif // BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER
+
+
+template
+<
+    typename T,
+    typename Iterator,
+    typename EndIterator,
+    std::size_t MinSize
+>
+struct promote_to_larger
+{
+    typedef typename boost::mpl::deref<Iterator>::type current_type;
+
+    typedef typename boost::mpl::if_c
+        <
+            (bit_size<current_type>::type::value >= MinSize),
+            current_type,
+            typename promote_to_larger
+                <
+                    T,
+                    typename boost::mpl::next<Iterator>::type,
+                    EndIterator,
+                    MinSize
+                >::type
+        >::type type;
+};
+
+// The following specialization is required to finish the loop over
+// all list elements
+template <typename T, typename EndIterator, std::size_t MinSize>
+struct promote_to_larger<T, EndIterator, EndIterator, MinSize>
+{
+    // if promotion fails, keep the number T
+    // (and cross fingers that overflow will not occur)
+    typedef T type;
+};
+
+}} // namespace detail::promote_integral
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+/*!
+    \brief Meta-function to define an integral type with size
+    than is (roughly) twice the bit size of T
+    \ingroup utility
+    \details
+    This meta-function tries to promote the fundamental integral type T
+    to a another integral type with size (roughly) twice the bit size of T.
+
+    To do this, two times the bit size of T is tested against the bit sizes of:
+         short, int, long, boost::long_long_type, boost::int128_t
+    and the one that first matches is chosen.
+
+    For unsigned types the bit size of T is tested against the bit
+    sizes of the types above, if T is promoted to a signed type, or
+    the bit sizes of
+         unsigned short, unsigned int, unsigned long, std::size_t,
+         boost::ulong_long_type, boost::uint128_t
+    if T is promoted to an unsigned type.
+
+    By default an unsigned type is promoted to a signed type.
+    This behavior is controlled by the PromoteUnsignedToUnsigned
+    boolean template parameter, whose default value is "false".
+    To promote an unsigned type to an unsigned type set the value of
+    this template parameter to "true".
+
+    If the macro BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER is not
+    defined, boost's multiprecision integer cpp_int<> is used as a
+    last resort.
+
+    If BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER is defined and an
+    appropriate type cannot be detected, the input type is returned as is.
+
+    Finally, if the passed type is either a floating-point type or a
+    user-defined type it is returned as is.
+
+    \note boost::long_long_type and boost::ulong_long_type are
+    considered only if the macro BOOST_HAS_LONG_LONG is defined
+
+    \note boost::int128_type and boost::uint128_type are considered
+    only if the macros BOOST_HAS_INT128 and BOOST_GEOMETRY_ENABLE_INT128
+    are defined
+*/
+template
+<
+    typename T,
+    bool PromoteUnsignedToUnsigned = false,
+    bool UseCheckedInteger = false,
+    bool IsIntegral = boost::is_integral<T>::type::value
+>
+class promote_integral
+{
+private:
+    static bool const is_unsigned = boost::is_unsigned<T>::type::value;
+
+    typedef detail::promote_integral::bit_size<T> bit_size_type;
+
+#if !defined(BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER)
+    // Define the proper check policy for the multiprecision integer
+    typedef typename boost::mpl::if_c
+        <
+            UseCheckedInteger,
+            boost::integral_constant
+                <
+                    boost::multiprecision::cpp_int_check_type,
+                    boost::multiprecision::checked
+                >,
+            boost::integral_constant
+                <
+                    boost::multiprecision::cpp_int_check_type,
+                    boost::multiprecision::unchecked
+                >
+        >::type check_policy_type;
+
+    // Meta-function to get the multiprecision integer type for the
+    // given size and sign type (signed/unsigned)
+    template
+    <
+        unsigned int Size,
+        boost::multiprecision::cpp_integer_type SignType
+    >
+    struct multiprecision_integer_type
+    {
+        typedef boost::multiprecision::number
+            <
+                boost::multiprecision::cpp_int_backend
+                    <
+                        Size,
+                        Size,
+                        SignType,
+                        check_policy_type::value,
+                        void
+                    >
+            > type;
+    };
+#endif
+
+    // Define the minimum size (in bits) needed for the promoted type
+    // If T is the input type and P the promoted type, then the
+    // minimum number of bits for P are (below b stands for the number
+    // of bits of T):
+    // * if T is unsigned and P is unsigned: 2 * b
+    // * if T is signed and P is signed: 2 * b - 1
+    // * if T is unsigned and P is signed: 2 * b + 1
+    typedef typename boost::mpl::if_c
+        <
+            (PromoteUnsignedToUnsigned && is_unsigned),
+            boost::mpl::size_t<(2 * bit_size_type::value)>,
+            typename boost::mpl::if_c
+                <
+                    is_unsigned,
+                    boost::mpl::size_t<(2 * bit_size_type::value + 1)>,
+                    boost::mpl::size_t<(2 * bit_size_type::value - 1)>
+                >::type
+        >::type min_bit_size_type;
+
+    // Define the list of signed integral types we are going to use
+    // for promotion
+    typedef boost::mpl::list
+        <
+            short, int, long
+#if defined(BOOST_HAS_LONG_LONG)
+            , boost::long_long_type
+#endif
+#if defined(BOOST_HAS_INT128) && defined(BOOST_GEOMETRY_ENABLE_INT128)
+            , boost::int128_type
+#endif
+#if !defined(BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER)
+            , typename multiprecision_integer_type
+                <
+                    min_bit_size_type::value,
+                    boost::multiprecision::signed_magnitude
+                >::type
+#endif
+        > signed_integral_types;
+
+    // Define the list of unsigned integral types we are going to use
+    // for promotion
+    typedef boost::mpl::list
+        <
+            unsigned short, unsigned int, unsigned long, std::size_t
+#if defined(BOOST_HAS_LONG_LONG)
+            , boost::ulong_long_type
+#endif
+#if defined(BOOST_HAS_INT128) && defined(BOOST_GEOMETRY_ENABLE_INT128)
+            , boost::uint128_type
+#endif
+#if !defined(BOOST_GEOMETRY_NO_MULTIPRECISION_INTEGER)
+            , typename multiprecision_integer_type
+                <
+                    min_bit_size_type::value,
+                    boost::multiprecision::unsigned_magnitude
+                >::type
+#endif
+        > unsigned_integral_types;
+
+    // Define the list of integral types that will be used for
+    // promotion (depending in whether we was to promote unsigned to
+    // unsigned or not)
+    typedef typename boost::mpl::if_c
+        <
+            (is_unsigned && PromoteUnsignedToUnsigned),
+            unsigned_integral_types,
+            signed_integral_types
+        >::type integral_types;
+
+public:
+    typedef typename detail::promote_integral::promote_to_larger
+        <
+            T,
+            typename boost::mpl::begin<integral_types>::type,
+            typename boost::mpl::end<integral_types>::type,
+            min_bit_size_type::value
+        >::type type;
+};
+
+
+template <typename T, bool PromoteUnsignedToUnsigned, bool UseCheckedInteger>
+class promote_integral
+    <
+        T, PromoteUnsignedToUnsigned, UseCheckedInteger, false
+    >
+{
+public:
+    typedef T type;
+};
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_UTIL_PROMOTE_INTEGRAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/range.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,367 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_RANGE_HPP
+#define BOOST_GEOMETRY_UTIL_RANGE_HPP
+
+#include <algorithm>
+
+#include <boost/assert.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/config.hpp>
+#include <boost/range/concepts.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/empty.hpp>
+#include <boost/range/size.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+#include <boost/geometry/core/mutable_range.hpp>
+
+namespace boost { namespace geometry { namespace range {
+
+namespace detail {
+
+// NOTE: For SinglePassRanges pos could iterate over all elements until the i-th element was met.
+
+template <typename RandomAccessRange>
+struct pos
+{
+    typedef typename boost::range_iterator<RandomAccessRange>::type iterator;
+    typedef typename boost::range_size<RandomAccessRange>::type size_type;
+    typedef typename boost::range_difference<RandomAccessRange>::type difference_type;
+
+    static inline iterator apply(RandomAccessRange & rng, size_type i)
+    {
+        BOOST_RANGE_CONCEPT_ASSERT(( boost::RandomAccessRangeConcept<RandomAccessRange> ));
+        return boost::begin(rng) + static_cast<difference_type>(i);
+    }
+};
+
+} // namespace detail
+
+/*!
+\brief Short utility to conveniently return an iterator of a RandomAccessRange.
+\ingroup utility
+*/
+template <typename RandomAccessRange>
+inline typename boost::range_iterator<RandomAccessRange const>::type
+pos(RandomAccessRange const& rng,
+    typename boost::range_size<RandomAccessRange const>::type i)
+{
+    BOOST_ASSERT(i <= boost::size(rng));
+    return detail::pos<RandomAccessRange const>::apply(rng, i);
+}
+
+/*!
+\brief Short utility to conveniently return an iterator of a RandomAccessRange.
+\ingroup utility
+*/
+template <typename RandomAccessRange>
+inline typename boost::range_iterator<RandomAccessRange>::type
+pos(RandomAccessRange & rng,
+    typename boost::range_size<RandomAccessRange>::type i)
+{
+    BOOST_ASSERT(i <= boost::size(rng));
+    return detail::pos<RandomAccessRange>::apply(rng, i);
+}
+
+/*!
+\brief Short utility to conveniently return an element of a RandomAccessRange.
+\ingroup utility
+*/
+template <typename RandomAccessRange>
+inline typename boost::range_reference<RandomAccessRange const>::type
+at(RandomAccessRange const& rng,
+   typename boost::range_size<RandomAccessRange const>::type i)
+{
+    BOOST_ASSERT(i < boost::size(rng));
+    return * detail::pos<RandomAccessRange const>::apply(rng, i);
+}
+
+/*!
+\brief Short utility to conveniently return an element of a RandomAccessRange.
+\ingroup utility
+*/
+template <typename RandomAccessRange>
+inline typename boost::range_reference<RandomAccessRange>::type
+at(RandomAccessRange & rng,
+   typename boost::range_size<RandomAccessRange>::type i)
+{
+    BOOST_ASSERT(i < boost::size(rng));
+    return * detail::pos<RandomAccessRange>::apply(rng, i);
+}
+
+/*!
+\brief Short utility to conveniently return the front element of a Range.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_reference<Range const>::type
+front(Range const& rng)
+{
+    BOOST_ASSERT(!boost::empty(rng));
+    return *boost::begin(rng);
+}
+
+/*!
+\brief Short utility to conveniently return the front element of a Range.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_reference<Range>::type
+front(Range & rng)
+{
+    BOOST_ASSERT(!boost::empty(rng));
+    return *boost::begin(rng);
+}
+
+// NOTE: For SinglePassRanges back() could iterate over all elements until the last element is met.
+
+/*!
+\brief Short utility to conveniently return the back element of a BidirectionalRange.
+\ingroup utility
+*/
+template <typename BidirectionalRange>
+inline typename boost::range_reference<BidirectionalRange const>::type
+back(BidirectionalRange const& rng)
+{
+    BOOST_RANGE_CONCEPT_ASSERT(( boost::BidirectionalRangeConcept<BidirectionalRange const> ));
+    BOOST_ASSERT(!boost::empty(rng));
+    return *(boost::rbegin(rng));
+}
+
+/*!
+\brief Short utility to conveniently return the back element of a BidirectionalRange.
+\ingroup utility
+*/
+template <typename BidirectionalRange>
+inline typename boost::range_reference<BidirectionalRange>::type
+back(BidirectionalRange & rng)
+{
+    BOOST_RANGE_CONCEPT_ASSERT((boost::BidirectionalRangeConcept<BidirectionalRange>));
+    BOOST_ASSERT(!boost::empty(rng));
+    return *(boost::rbegin(rng));
+}
+
+
+/*!
+\brief Short utility to conveniently clear a mutable range.
+       It uses traits::clear<>.
+\ingroup utility
+*/
+template <typename Range>
+inline void clear(Range & rng)
+{
+    // NOTE: this trait is probably not needed since it could be implemented using resize()
+    geometry::traits::clear<Range>::apply(rng);
+}
+
+/*!
+\brief Short utility to conveniently insert a new element at the end of a mutable range.
+       It uses boost::geometry::traits::push_back<>.
+\ingroup utility
+*/
+template <typename Range>
+inline void push_back(Range & rng,
+                      typename boost::range_value<Range>::type const& value)
+{
+    geometry::traits::push_back<Range>::apply(rng, value);
+}
+
+/*!
+\brief Short utility to conveniently resize a mutable range.
+       It uses boost::geometry::traits::resize<>.
+\ingroup utility
+*/
+template <typename Range>
+inline void resize(Range & rng,
+                   typename boost::range_size<Range>::type new_size)
+{
+    geometry::traits::resize<Range>::apply(rng, new_size);
+}
+
+
+/*!
+\brief Short utility to conveniently remove an element from the back of a mutable range.
+       It uses resize().
+\ingroup utility
+*/
+template <typename Range>
+inline void pop_back(Range & rng)
+{
+    BOOST_ASSERT(!boost::empty(rng));
+    range::resize(rng, boost::size(rng) - 1);
+}
+
+namespace detail {
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template <typename It,
+          typename OutIt,
+          bool UseMove = boost::is_convertible
+                            <
+                                typename std::iterator_traits<It>::value_type &&,
+                                typename std::iterator_traits<OutIt>::value_type
+                            >::value>
+struct copy_or_move_impl
+{
+    static inline OutIt apply(It first, It last, OutIt out)
+    {
+        return std::move(first, last, out);
+    }
+};
+
+template <typename It, typename OutIt>
+struct copy_or_move_impl<It, OutIt, false>
+{
+    static inline OutIt apply(It first, It last, OutIt out)
+    {
+        return std::copy(first, last, out);
+    }
+};
+
+template <typename It, typename OutIt>
+inline OutIt copy_or_move(It first, It last, OutIt out)
+{
+    return copy_or_move_impl<It, OutIt>::apply(first, last, out);
+}
+
+#else
+
+template <typename It, typename OutIt>
+inline OutIt copy_or_move(It first, It last, OutIt out)
+{
+    return std::copy(first, last, out);
+}
+
+#endif
+
+} // namespace detail
+
+/*!
+\brief Short utility to conveniently remove an element from a mutable range.
+       It uses std::copy() and resize(). Version taking mutable iterators.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_iterator<Range>::type
+erase(Range & rng,
+      typename boost::range_iterator<Range>::type it)
+{
+    BOOST_ASSERT(!boost::empty(rng));
+    BOOST_ASSERT(it != boost::end(rng));
+
+    typename boost::range_difference<Range>::type const
+        d = std::distance(boost::begin(rng), it);
+
+    typename boost::range_iterator<Range>::type
+        next = it;
+    ++next;
+
+    detail::copy_or_move(next, boost::end(rng), it);
+    range::resize(rng, boost::size(rng) - 1);
+
+    // NOTE: In general this should be sufficient:
+    //    return it;
+    // But in MSVC using the returned iterator causes
+    // assertion failures when iterator debugging is enabled
+    // Furthermore the code below should work in the case if resize()
+    // invalidates iterators when the container is resized down.
+    return boost::begin(rng) + d;
+}
+
+/*!
+\brief Short utility to conveniently remove an element from a mutable range.
+       It uses std::copy() and resize(). Version taking non-mutable iterators.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_iterator<Range>::type
+erase(Range & rng,
+      typename boost::range_iterator<Range const>::type cit)
+{
+    BOOST_RANGE_CONCEPT_ASSERT(( boost::RandomAccessRangeConcept<Range> ));
+
+    typename boost::range_iterator<Range>::type
+        it = boost::begin(rng)
+                + std::distance(boost::const_begin(rng), cit);
+
+    return erase(rng, it);
+}
+
+/*!
+\brief Short utility to conveniently remove a range of elements from a mutable range.
+       It uses std::copy() and resize(). Version taking mutable iterators.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_iterator<Range>::type
+erase(Range & rng,
+      typename boost::range_iterator<Range>::type first,
+      typename boost::range_iterator<Range>::type last)
+{
+    typename boost::range_difference<Range>::type const
+        diff = std::distance(first, last);
+    BOOST_ASSERT(diff >= 0);
+
+    std::size_t const count = static_cast<std::size_t>(diff);
+    BOOST_ASSERT(count <= boost::size(rng));
+    
+    if ( count > 0 )
+    {
+        typename boost::range_difference<Range>::type const
+            d = std::distance(boost::begin(rng), first);
+
+        detail::copy_or_move(last, boost::end(rng), first);
+        range::resize(rng, boost::size(rng) - count);
+
+        // NOTE: In general this should be sufficient:
+        //    return first;
+        // But in MSVC using the returned iterator causes
+        // assertion failures when iterator debugging is enabled
+        // Furthermore the code below should work in the case if resize()
+        // invalidates iterators when the container is resized down.
+        return boost::begin(rng) + d;
+    }
+
+    return first;
+}
+
+/*!
+\brief Short utility to conveniently remove a range of elements from a mutable range.
+       It uses std::copy() and resize(). Version taking non-mutable iterators.
+\ingroup utility
+*/
+template <typename Range>
+inline typename boost::range_iterator<Range>::type
+erase(Range & rng,
+      typename boost::range_iterator<Range const>::type cfirst,
+      typename boost::range_iterator<Range const>::type clast)
+{
+    BOOST_RANGE_CONCEPT_ASSERT(( boost::RandomAccessRangeConcept<Range> ));
+
+    typename boost::range_iterator<Range>::type
+        first = boost::begin(rng)
+                    + std::distance(boost::const_begin(rng), cfirst);
+    typename boost::range_iterator<Range>::type
+        last = boost::begin(rng)
+                    + std::distance(boost::const_begin(rng), clast);
+
+    return erase(rng, first, last);
+}
+
+}}} // namespace boost::geometry::range
+
+#endif // BOOST_GEOMETRY_UTIL_RANGE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/util/transform_variant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,84 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP
+#define BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP
+
+
+#include <boost/mpl/transform.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+/*!
+    \brief Meta-function that takes a Sequence type, an MPL lambda
+        expression and an optional Inserter and returns a variant type over
+        the same types as the initial variant type, each transformed using
+        the lambda expression.
+    \ingroup utility
+    \par Example
+    \code
+        typedef boost::mpl::vector<int, float, long> types;
+        typedef transform_variant<types, add_pointer<_> > transformed;
+        typedef variant<int*, float*, long*> result;
+        BOOST_MPL_ASSERT(( equal<result, transformed> ));
+    \endcode
+*/
+template <typename Sequence, typename Op, typename In = boost::mpl::na>
+struct transform_variant:
+    make_variant_over<
+        typename boost::mpl::transform<
+            Sequence,
+            Op,
+            In
+        >::type
+    >
+{};
+
+
+/*!
+    \brief Meta-function that takes a boost::variant type and an MPL lambda
+        expression and returns a variant type over the same types as the
+        initial variant type, each transformed using the lambda expression.
+    \ingroup utility
+    \par Example
+    \code
+        typedef variant<int, float, long> variant_type;
+        typedef transform_variant<variant_type, add_pointer<_> > transformed;
+        typedef variant<int*, float*, long*> result;
+        BOOST_MPL_ASSERT(( equal<result, transformed> ));
+    \endcode
+*/
+template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Op>
+struct transform_variant<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Op, boost::mpl::na> :
+    make_variant_over<
+        typename boost::mpl::transform<
+            typename variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+            Op
+        >::type
+    >
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/views/detail/indexed_point_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,112 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP
+#define BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP
+
+#include <cstddef>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/coordinate_system.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/util/math.hpp>
+
+namespace boost { namespace geometry
+{
+
+namespace detail
+{
+
+template <typename Geometry, std::size_t Index>
+class indexed_point_view
+{
+    indexed_point_view & operator=(indexed_point_view const&);
+
+public:
+    typedef typename geometry::point_type<Geometry>::type point_type;
+    typedef typename geometry::coordinate_type<Geometry>::type coordinate_type;
+
+    indexed_point_view(Geometry & geometry)
+        : m_geometry(geometry)
+    {}
+
+    template <std::size_t Dimension>
+    inline coordinate_type get() const
+    {
+        return geometry::get<Index, Dimension>(m_geometry);
+    }
+
+    template <std::size_t Dimension>
+    inline void set(coordinate_type const& value)
+    {
+        geometry::set<Index, Dimension>(m_geometry, value);
+    }
+
+private:
+    Geometry & m_geometry;
+};
+
+}
+
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+template <typename Geometry, std::size_t Index>
+struct tag< detail::indexed_point_view<Geometry, Index> >
+{
+    typedef point_tag type;
+};
+
+template <typename Geometry, std::size_t Index>
+struct coordinate_type< detail::indexed_point_view<Geometry, Index> >
+{
+    typedef typename geometry::coordinate_type<Geometry>::type type;
+};
+
+template <typename Geometry, std::size_t Index>
+struct coordinate_system< detail::indexed_point_view<Geometry, Index> >
+{
+    typedef typename geometry::coordinate_system<Geometry>::type type;
+};
+
+template <typename Geometry, std::size_t Index>
+struct dimension< detail::indexed_point_view<Geometry, Index> >
+    : geometry::dimension<Geometry>
+{};
+
+template<typename Geometry, std::size_t Index, std::size_t Dimension>
+struct access< detail::indexed_point_view<Geometry, Index>, Dimension >
+{
+    typedef typename geometry::coordinate_type<Geometry>::type coordinate_type;
+
+    static inline coordinate_type get(
+        detail::indexed_point_view<Geometry, Index> const& p)
+    {
+        return p.template get<Dimension>();
+    }
+
+    static inline void set(
+        detail::indexed_point_view<Geometry, Index> & p,
+        coordinate_type const& value)
+    {
+        p.template set<Dimension>(value);
+    }
+};
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_VIEWS_DETAIL_INDEXED_POINT_VIEW_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/geometry/views/detail/normalized_view.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,117 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_VIEWS_DETAIL_NORMALIZED_VIEW_HPP
+#define BOOST_GEOMETRY_VIEWS_DETAIL_NORMALIZED_VIEW_HPP
+
+
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/iterator.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/geometry/views/detail/range_type.hpp>
+#include <boost/geometry/views/reversible_view.hpp>
+#include <boost/geometry/views/closeable_view.hpp>
+#include <boost/geometry/util/order_as_direction.hpp>
+
+namespace boost { namespace geometry {
+
+
+#ifndef DOXYGEN_NO_DETAIL
+
+namespace detail {
+
+template <typename Geometry>
+struct normalized_view
+{
+    static const bool is_const = boost::is_const<Geometry>::value;
+
+    //typedef typename ring_type<Geometry>::type ring_type;
+
+    typedef typename detail::range_type<Geometry>::type range_type;
+
+    typedef typename
+        boost::mpl::if_c
+            <
+                is_const,
+                range_type const,
+                range_type
+            >::type range;
+
+    typedef typename
+        reversible_view
+            <
+                range,
+                order_as_direction
+                    <
+                        geometry::point_order<Geometry>::value
+                    >::value
+            >::type reversible_type;
+
+    typedef typename
+        boost::mpl::if_c
+            <
+                is_const,
+                reversible_type const,
+                reversible_type
+            >::type reversible;
+
+    typedef typename
+        closeable_view
+            <
+                reversible,
+                geometry::closure<Geometry>::value
+            >::type closeable_type;
+
+    typedef typename
+        boost::mpl::if_c
+            <
+                is_const,
+                closeable_type const,
+                closeable_type
+            >::type closeable;
+    
+    explicit inline normalized_view(range & r)
+        : m_reversible(r)
+        , m_closeable(m_reversible)
+    {}
+
+    typedef typename boost::range_iterator<closeable>::type iterator;
+    typedef typename boost::range_const_iterator<closeable>::type const_iterator;
+
+    inline const_iterator begin() const { return boost::begin(m_closeable); }
+    inline const_iterator end() const { return boost::end(m_closeable); }
+
+    inline iterator begin() { return boost::begin(m_closeable); }
+    inline iterator end() { return boost::end(m_closeable); }
+
+private:
+    reversible_type m_reversible;
+    closeable_type m_closeable;
+};
+
+} // namespace detail
+
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_VIEWS_DETAIL_NORMALIZED_VIEW_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/integer/common_factor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+//  Boost common_factor.hpp header file  -------------------------------------//
+
+//  (C) Copyright Daryle Walker 2001-2002.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_INTEGER_COMMON_FACTOR_HPP
+#define BOOST_INTEGER_COMMON_FACTOR_HPP
+
+#include <boost/integer/common_factor_ct.hpp>
+#include <boost/integer/common_factor_rt.hpp>
+
+#endif  // BOOST_INTEGER_COMMON_FACTOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/integer/common_factor_ct.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,102 @@
+//  Boost common_factor_ct.hpp header file  ----------------------------------//
+
+//  (C) Copyright Daryle Walker and Stephen Cleary 2001-2002.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_INTEGER_COMMON_FACTOR_CT_HPP
+#define BOOST_INTEGER_COMMON_FACTOR_CT_HPP
+
+#include <boost/integer_fwd.hpp>  // self include
+#include <boost/config.hpp>  // for BOOST_STATIC_CONSTANT, etc.
+
+namespace boost
+{
+namespace integer
+{
+
+//  Implementation details  --------------------------------------------------//
+
+namespace detail
+{
+    // Build GCD with Euclid's recursive algorithm
+    template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_gcd_helper_t
+    {
+    private:
+        BOOST_STATIC_CONSTANT( static_gcd_type, new_value1 = Value2 );
+        BOOST_STATIC_CONSTANT( static_gcd_type, new_value2 = Value1 % Value2 );
+
+        #ifndef __BORLANDC__
+        #define BOOST_DETAIL_GCD_HELPER_VAL(Value) static_cast<static_gcd_type>(Value)
+        #else
+        typedef static_gcd_helper_t  self_type;
+        #define BOOST_DETAIL_GCD_HELPER_VAL(Value)  (self_type:: Value )
+        #endif
+
+        typedef static_gcd_helper_t< BOOST_DETAIL_GCD_HELPER_VAL(new_value1),
+         BOOST_DETAIL_GCD_HELPER_VAL(new_value2) >  next_step_type;
+
+        #undef BOOST_DETAIL_GCD_HELPER_VAL
+
+    public:
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = next_step_type::value );
+    };
+
+    // Non-recursive case
+    template < static_gcd_type Value1 >
+    struct static_gcd_helper_t< Value1, 0UL >
+    {
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 );
+    };
+
+    // Build the LCM from the GCD
+    template < static_gcd_type Value1, static_gcd_type Value2 >
+    struct static_lcm_helper_t
+    {
+        typedef static_gcd_helper_t<Value1, Value2>  gcd_type;
+
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 / gcd_type::value
+         * Value2 );
+    };
+
+    // Special case for zero-GCD values
+    template < >
+    struct static_lcm_helper_t< 0UL, 0UL >
+    {
+        BOOST_STATIC_CONSTANT( static_gcd_type, value = 0UL );
+    };
+
+}  // namespace detail
+
+
+//  Compile-time greatest common divisor evaluator class declaration  --------//
+
+template < static_gcd_type Value1, static_gcd_type Value2 > struct static_gcd
+{
+    BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_gcd_helper_t<Value1, Value2>::value) );
+};  // boost::integer::static_gcd
+
+#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+template< static_gcd_type Value1, static_gcd_type Value2 > static_gcd_type const static_gcd< Value1, Value2 >::value;
+#endif
+
+//  Compile-time least common multiple evaluator class declaration  ----------//
+
+template < static_gcd_type Value1, static_gcd_type Value2 > struct static_lcm
+{
+    BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_lcm_helper_t<Value1, Value2>::value) );
+};  // boost::integer::static_lcm
+
+#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+template< static_gcd_type Value1, static_gcd_type Value2 > static_gcd_type const static_lcm< Value1, Value2 >::value;
+#endif
+
+}  // namespace integer
+}  // namespace boost
+
+
+#endif  // BOOST_INTEGER_COMMON_FACTOR_CT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/integer/common_factor_rt.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,460 @@
+//  Boost common_factor_rt.hpp header file  ----------------------------------//
+
+//  (C) Copyright Daryle Walker and Paul Moore 2001-2002.  Permission to copy,
+//  use, modify, sell and distribute this software is granted provided this
+//  copyright notice appears in all copies.  This software is provided "as is"
+//  without express or implied warranty, and with no claim as to its suitability
+//  for any purpose. 
+
+// boostinspect:nolicense (don't complain about the lack of a Boost license)
+// (Paul Moore hasn't been in contact for years, so there's no way to change the
+// license.)
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_INTEGER_COMMON_FACTOR_RT_HPP
+#define BOOST_INTEGER_COMMON_FACTOR_RT_HPP
+
+#include <boost/integer_fwd.hpp>  // self include
+
+#include <boost/config.hpp>  // for BOOST_NESTED_TEMPLATE, etc.
+#include <boost/limits.hpp>  // for std::numeric_limits
+#include <climits>           // for CHAR_MIN
+#include <boost/detail/workaround.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127 4244)  // Conditional expression is constant
+#endif
+
+namespace boost
+{
+namespace integer
+{
+
+
+//  Forward declarations for function templates  -----------------------------//
+
+template < typename IntegerType >
+    IntegerType  gcd( IntegerType const &a, IntegerType const &b );
+
+template < typename IntegerType >
+    IntegerType  lcm( IntegerType const &a, IntegerType const &b );
+
+
+//  Greatest common divisor evaluator class declaration  ---------------------//
+
+template < typename IntegerType >
+class gcd_evaluator
+{
+public:
+    // Types
+    typedef IntegerType  result_type, first_argument_type, second_argument_type;
+
+    // Function object interface
+    result_type  operator ()( first_argument_type const &a,
+     second_argument_type const &b ) const;
+
+};  // boost::integer::gcd_evaluator
+
+
+//  Least common multiple evaluator class declaration  -----------------------//
+
+template < typename IntegerType >
+class lcm_evaluator
+{
+public:
+    // Types
+    typedef IntegerType  result_type, first_argument_type, second_argument_type;
+
+    // Function object interface
+    result_type  operator ()( first_argument_type const &a,
+     second_argument_type const &b ) const;
+
+};  // boost::integer::lcm_evaluator
+
+
+//  Implementation details  --------------------------------------------------//
+
+namespace detail
+{
+    // Greatest common divisor for rings (including unsigned integers)
+    template < typename RingType >
+    RingType
+    gcd_euclidean
+    (
+        RingType a,
+        RingType b
+    )
+    {
+        // Avoid repeated construction
+        #ifndef __BORLANDC__
+        RingType const  zero = static_cast<RingType>( 0 );
+        #else
+        RingType  zero = static_cast<RingType>( 0 );
+        #endif
+
+        // Reduce by GCD-remainder property [GCD(a,b) == GCD(b,a MOD b)]
+        while ( true )
+        {
+            if ( a == zero )
+                return b;
+            b %= a;
+
+            if ( b == zero )
+                return a;
+            a %= b;
+        }
+    }
+
+    // Greatest common divisor for (signed) integers
+    template < typename IntegerType >
+    inline
+    IntegerType
+    gcd_integer
+    (
+        IntegerType const &  a,
+        IntegerType const &  b
+    )
+    {
+        // Avoid repeated construction
+        IntegerType const  zero = static_cast<IntegerType>( 0 );
+        IntegerType const  result = gcd_euclidean( a, b );
+
+        return ( result < zero ) ? static_cast<IntegerType>(-result) : result;
+    }
+
+    // Greatest common divisor for unsigned binary integers
+    template < typename BuiltInUnsigned >
+    BuiltInUnsigned
+    gcd_binary
+    (
+        BuiltInUnsigned  u,
+        BuiltInUnsigned  v
+    )
+    {
+        if ( u && v )
+        {
+            // Shift out common factors of 2
+            unsigned  shifts = 0;
+
+            while ( !(u & 1u) && !(v & 1u) )
+            {
+                ++shifts;
+                u >>= 1;
+                v >>= 1;
+            }
+
+            // Start with the still-even one, if any
+            BuiltInUnsigned  r[] = { u, v };
+            unsigned         which = static_cast<bool>( u & 1u );
+
+            // Whittle down the values via their differences
+            do
+            {
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+                while ( !(r[ which ] & 1u) )
+                {
+                    r[ which ] = (r[which] >> 1);
+                }
+#else
+                // Remove factors of two from the even one
+                while ( !(r[ which ] & 1u) )
+                {
+                    r[ which ] >>= 1;
+                }
+#endif
+
+                // Replace the larger of the two with their difference
+                if ( r[!which] > r[which] )
+                {
+                    which ^= 1u;
+                }
+
+                r[ which ] -= r[ !which ];
+            }
+            while ( r[which] );
+
+            // Shift-in the common factor of 2 to the residues' GCD
+            return r[ !which ] << shifts;
+        }
+        else
+        {
+            // At least one input is zero, return the other
+            // (adding since zero is the additive identity)
+            // or zero if both are zero.
+            return u + v;
+        }
+    }
+
+    // Least common multiple for rings (including unsigned integers)
+    template < typename RingType >
+    inline
+    RingType
+    lcm_euclidean
+    (
+        RingType const &  a,
+        RingType const &  b
+    )
+    {
+        RingType const  zero = static_cast<RingType>( 0 );
+        RingType const  temp = gcd_euclidean( a, b );
+
+        return ( temp != zero ) ? ( a / temp * b ) : zero;
+    }
+
+    // Least common multiple for (signed) integers
+    template < typename IntegerType >
+    inline
+    IntegerType
+    lcm_integer
+    (
+        IntegerType const &  a,
+        IntegerType const &  b
+    )
+    {
+        // Avoid repeated construction
+        IntegerType const  zero = static_cast<IntegerType>( 0 );
+        IntegerType const  result = lcm_euclidean( a, b );
+
+        return ( result < zero ) ? static_cast<IntegerType>(-result) : result;
+    }
+
+    // Function objects to find the best way of computing GCD or LCM
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T, bool IsSpecialized, bool IsSigned >
+    struct gcd_optimal_evaluator_helper_t
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_euclidean( a, b );
+        }
+    };
+
+    template < typename T >
+    struct gcd_optimal_evaluator_helper_t< T, true, true >
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_integer( a, b );
+        }
+    };
+
+    template < typename T >
+    struct gcd_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            typedef ::std::numeric_limits<T>  limits_type;
+
+            typedef gcd_optimal_evaluator_helper_t<T,
+             limits_type::is_specialized, limits_type::is_signed>  helper_type;
+
+            helper_type  solver;
+
+            return solver( a, b );
+        }
+    };
+#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T >
+    struct gcd_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return gcd_integer( a, b );
+        }
+    };
+#endif
+
+    // Specialize for the built-in integers
+#define BOOST_PRIVATE_GCD_UF( Ut )                  \
+    template < >  struct gcd_optimal_evaluator<Ut>  \
+    {  Ut  operator ()( Ut a, Ut b ) const  { return gcd_binary( a, b ); }  }
+
+    BOOST_PRIVATE_GCD_UF( unsigned char );
+    BOOST_PRIVATE_GCD_UF( unsigned short );
+    BOOST_PRIVATE_GCD_UF( unsigned );
+    BOOST_PRIVATE_GCD_UF( unsigned long );
+
+#ifdef BOOST_HAS_LONG_LONG
+    BOOST_PRIVATE_GCD_UF( boost::ulong_long_type );
+#elif defined(BOOST_HAS_MS_INT64)
+    BOOST_PRIVATE_GCD_UF( unsigned __int64 );
+#endif
+
+#if CHAR_MIN == 0
+    BOOST_PRIVATE_GCD_UF( char ); // char is unsigned
+#endif
+
+#undef BOOST_PRIVATE_GCD_UF
+
+#define BOOST_PRIVATE_GCD_SF( St, Ut )                            \
+    template < >  struct gcd_optimal_evaluator<St>                \
+    {  St  operator ()( St a, St b ) const  { Ut const  a_abs =   \
+    static_cast<Ut>( a < 0 ? -a : +a ), b_abs = static_cast<Ut>(  \
+    b < 0 ? -b : +b ); return static_cast<St>(                    \
+    gcd_optimal_evaluator<Ut>()(a_abs, b_abs) ); }  }
+
+    BOOST_PRIVATE_GCD_SF( signed char, unsigned char );
+    BOOST_PRIVATE_GCD_SF( short, unsigned short );
+    BOOST_PRIVATE_GCD_SF( int, unsigned );
+    BOOST_PRIVATE_GCD_SF( long, unsigned long );
+
+#if CHAR_MIN < 0
+    BOOST_PRIVATE_GCD_SF( char, unsigned char ); // char is signed
+#endif
+
+#ifdef BOOST_HAS_LONG_LONG
+    BOOST_PRIVATE_GCD_SF( boost::long_long_type, boost::ulong_long_type );
+#elif defined(BOOST_HAS_MS_INT64)
+    BOOST_PRIVATE_GCD_SF( __int64, unsigned __int64 );
+#endif
+
+#undef BOOST_PRIVATE_GCD_SF
+
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T, bool IsSpecialized, bool IsSigned >
+    struct lcm_optimal_evaluator_helper_t
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_euclidean( a, b );
+        }
+    };
+
+    template < typename T >
+    struct lcm_optimal_evaluator_helper_t< T, true, true >
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_integer( a, b );
+        }
+    };
+
+    template < typename T >
+    struct lcm_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            typedef ::std::numeric_limits<T>  limits_type;
+
+            typedef lcm_optimal_evaluator_helper_t<T,
+             limits_type::is_specialized, limits_type::is_signed>  helper_type;
+
+            helper_type  solver;
+
+            return solver( a, b );
+        }
+    };
+#else // BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    template < typename T >
+    struct lcm_optimal_evaluator
+    {
+        T  operator ()( T const &a, T const &b )
+        {
+            return lcm_integer( a, b );
+        }
+    };
+#endif
+
+    // Functions to find the GCD or LCM in the best way
+    template < typename T >
+    inline
+    T
+    gcd_optimal
+    (
+        T const &  a,
+        T const &  b
+    )
+    {
+        gcd_optimal_evaluator<T>  solver;
+
+        return solver( a, b );
+    }
+
+    template < typename T >
+    inline
+    T
+    lcm_optimal
+    (
+        T const &  a,
+        T const &  b
+    )
+    {
+        lcm_optimal_evaluator<T>  solver;
+
+        return solver( a, b );
+    }
+
+}  // namespace detail
+
+
+//  Greatest common divisor evaluator member function definition  ------------//
+
+template < typename IntegerType >
+inline
+typename gcd_evaluator<IntegerType>::result_type
+gcd_evaluator<IntegerType>::operator ()
+(
+    first_argument_type const &   a,
+    second_argument_type const &  b
+) const
+{
+    return detail::gcd_optimal( a, b );
+}
+
+
+//  Least common multiple evaluator member function definition  --------------//
+
+template < typename IntegerType >
+inline
+typename lcm_evaluator<IntegerType>::result_type
+lcm_evaluator<IntegerType>::operator ()
+(
+    first_argument_type const &   a,
+    second_argument_type const &  b
+) const
+{
+    return detail::lcm_optimal( a, b );
+}
+
+
+//  Greatest common divisor and least common multiple function definitions  --//
+
+template < typename IntegerType >
+inline
+IntegerType
+gcd
+(
+    IntegerType const &  a,
+    IntegerType const &  b
+)
+{
+    gcd_evaluator<IntegerType>  solver;
+
+    return solver( a, b );
+}
+
+template < typename IntegerType >
+inline
+IntegerType
+lcm
+(
+    IntegerType const &  a,
+    IntegerType const &  b
+)
+{
+    lcm_evaluator<IntegerType>  solver;
+
+    return solver( a, b );
+}
+
+
+}  // namespace integer
+}  // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif  // BOOST_INTEGER_COMMON_FACTOR_RT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/integer/integer_log2.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,112 @@
+// -----------------------------------------------------------
+// integer_log2.hpp
+//
+//   Gives the integer part of the logarithm, in base 2, of a
+// given number. Behavior is undefined if the argument is <= 0.
+//
+//         Copyright (c) 2003-2004, 2008 Gennaro Prota
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// -----------------------------------------------------------
+
+#ifndef BOOST_INTEGER_INTEGER_LOG2_HPP
+#define BOOST_INTEGER_INTEGER_LOG2_HPP
+
+#include <assert.h>
+#ifdef __BORLANDC__
+#include <climits>
+#endif
+#include <boost/limits.hpp>
+#include <boost/config.hpp>
+
+
+namespace boost {
+ namespace detail {
+
+  template <typename T>
+  int integer_log2_impl(T x, int n) {
+
+      int result = 0;
+
+      while (x != 1) {
+
+          const T t = static_cast<T>(x >> n);
+          if (t) {
+              result += n;
+              x = t;
+          }
+          n /= 2;
+
+      }
+
+      return result;
+  }
+
+
+
+  // helper to find the maximum power of two
+  // less than p (more involved than necessary,
+  // to avoid PTS)
+  //
+  template <int p, int n>
+  struct max_pow2_less {
+
+      enum { c = 2*n < p };
+
+      BOOST_STATIC_CONSTANT(int, value =
+          c ? (max_pow2_less< c*p, 2*c*n>::value) : n);
+
+  };
+
+  template <>
+  struct max_pow2_less<0, 0> {
+
+      BOOST_STATIC_CONSTANT(int, value = 0);
+  };
+
+  // this template is here just for Borland :(
+  // we could simply rely on numeric_limits but sometimes
+  // Borland tries to use numeric_limits<const T>, because
+  // of its usual const-related problems in argument deduction
+  // - gps
+  template <typename T>
+  struct width {
+
+#ifdef __BORLANDC__
+      BOOST_STATIC_CONSTANT(int, value = sizeof(T) * CHAR_BIT);
+#else
+      BOOST_STATIC_CONSTANT(int, value = (std::numeric_limits<T>::digits));
+#endif
+
+  };
+
+ } // detail
+
+
+ // ---------
+ // integer_log2
+ // ---------------
+ //
+ template <typename T>
+ int integer_log2(T x) {
+
+     assert(x > 0);
+
+     const int n = detail::max_pow2_less<
+                     detail::width<T> :: value, 4
+                   > :: value;
+
+     return detail::integer_log2_impl(x, n);
+
+ }
+
+
+
+}
+
+
+
+#endif // include guard
--- a/DEPENDENCIES/generic/include/boost/interprocess/detail/multi_segment_services.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/interprocess for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTERPROCESS_MULTI_SEGMENT_SERVICES_HPP
-#define BOOST_INTERPROCESS_MULTI_SEGMENT_SERVICES_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-
-
-/*!\file
-   Describes a named shared memory allocation user class.
-*/
-
-namespace boost {
-
-namespace interprocess {
-
-class multi_segment_services
-{
-   public:
-   virtual std::pair<void *, std::size_t> create_new_segment(std::size_t mem) = 0;
-   virtual bool                           update_segments   () = 0;
-   virtual ~multi_segment_services() = 0;
-};
-
-inline multi_segment_services::~multi_segment_services()
-{}
-
-
-}} //namespace boost {  namespace interprocess {
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif //#ifdef BOOST_INTERPROCESS_MULTI_SEGMENT_SERVICES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/detail/nothrow.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP
+#define BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace std {   //no namespace versioning in clang+libc++
+
+struct nothrow_t;
+
+}  //namespace std {
+
+namespace boost{ namespace interprocess {
+
+template <int Dummy = 0>
+struct nothrow
+{
+   static const std::nothrow_t &get()   {  return *pnothrow;  }
+   static std::nothrow_t *pnothrow;
+};
+
+template <int Dummy>
+std::nothrow_t *nothrow<Dummy>::pnothrow;
+
+}}  //namespace boost{ namespace interprocess {
+
+#endif //#ifndef BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP
--- a/DEPENDENCIES/generic/include/boost/interprocess/detail/preprocessor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/interprocess for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP
-#define BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/interprocess/detail/config_begin.hpp>
-
-#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING
-#error "This file is not needed when perfect forwarding is available"
-#endif
-
-#include <boost/preprocessor/iteration/local.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/repeat.hpp>
-
-#define BOOST_INTERPROCESS_MAX_CONSTRUCTOR_PARAMETERS 10
-
-//Note:
-//We define template parameters as const references to
-//be able to bind temporaries. After that we will un-const them.
-//This cast is ugly but it is necessary until "perfect forwarding"
-//is achieved in C++0x. Meanwhile, if we want to be able to
-//bind rvalues with non-const references, we have to be ugly
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-   #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \
-   BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \
-   //!
-#else
-   #define BOOST_INTERPROCESS_PP_PARAM_LIST(z, n, data) \
-   const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \
-   //!
-#endif
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-   #define BOOST_INTERPROCESS_PP_PARAM(U, u) \
-   U && u \
-   //!
-#else
-   #define BOOST_INTERPROCESS_PP_PARAM(U, u) \
-   const U & u \
-   //!
-#endif
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #define BOOST_INTERPROCESS_PP_PARAM_INIT(z, n, data) \
-     BOOST_PP_CAT(m_p, n) (::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ))  \
-   //!
-
-#else //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #define BOOST_INTERPROCESS_PP_PARAM_INIT(z, n, data) \
-     BOOST_PP_CAT(m_p, n) (const_cast<BOOST_PP_CAT(P, n) &>(BOOST_PP_CAT(p, n))) \
-   //!
-#endif
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-   #if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-      namespace boost {
-      namespace interprocess {
-      namespace ipcdetail {
-         template<class T>
-         struct ref_holder;
-
-         template<class T>
-         struct ref_holder<T &>
-         {
-            ref_holder(T &t)
-               : t_(t)
-            {}
-            T &t_;
-            T & get() {  return t_;   }
-            T & get_lvalue() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder<const T>
-         {
-            ref_holder(const T &t)
-               : t_(t)
-            {}
-            const T &t_;
-            const T & get() {  return t_;   }
-            const T & get_lvalue() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder<const T &&>
-         {
-            ref_holder(const T &t)
-               : t_(t)
-            {}
-            const T &t_;
-            const T & get() {  return t_;   }
-            const T & get_lvalue() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder
-         {
-            ref_holder(T &&t)
-               : t_(t)
-            {}
-            T &t_;
-            T && get() {  return ::boost::move(t_);   }
-            T & get_lvalue() {  return t_;   }
-         };
-
-         template<class T>
-         struct ref_holder<T &&>
-         {
-            ref_holder(T &&t)
-               : t(t)
-            {}
-            T &t;
-            T && get()  { return ::boost::move(t_); }
-            T & get_lvalue() {  return t_;   }
-         };
-
-      }  //namespace ipcdetail {
-      }  //namespace interprocess {
-      }  //namespace boost {
-
-      #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data)  \
-         ::boost::interprocess::ipcdetail::ref_holder<BOOST_PP_CAT(P, n)> BOOST_PP_CAT(m_p, n);  \
-      //!
-
-      #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data)   \
-         BOOST_PP_CAT(++m_p, n).get_lvalue()                \
-      //!
-
-   #else //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
-
-      #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data)\
-      BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n);           \
-      //!
-
-      #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data)   \
-         BOOST_PP_CAT(++m_p, n)                             \
-      //!
-
-   #endif //defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-#else
-   #define BOOST_INTERPROCESS_PP_PARAM_DEFINE(z, n, data)   \
-   BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n);               \
-   //!
-
-   #define BOOST_INTERPROCESS_PP_PARAM_INC(z, n, data)      \
-      BOOST_PP_CAT(++m_p, n)                                \
-   //!
-
-#endif
-
-#define BOOST_INTERPROCESS_PP_PARAM_FORWARD(z, n, data) \
-::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \
-//!
-
-#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-   #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data) BOOST_PP_CAT(this->m_p, n).get() \
-   //!
-
-   #define BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD(z, n, data) \
-   BOOST_PP_CAT(*m_p, n).get_lvalue()                          \
-   //!
-
-#else
-
-   #define BOOST_INTERPROCESS_PP_MEMBER_FORWARD(z, n, data)       \
-   ::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(m_p, n) ) \
-   //!
-
-   #define BOOST_INTERPROCESS_PP_MEMBER_IT_FORWARD(z, n, data)    \
-   BOOST_PP_CAT(*m_p, n)                                          \
-   //!
-
-
-#endif   //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#else
-#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING
-#error "This file is not needed when perfect forwarding is available"
-#endif
-#endif //#ifndef BOOST_INTERPROCESS_DETAIL_PREPROCESSOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/detail/shared_dir_helpers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,199 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTERPROCESS_DETAIL_SHARED_DIR_HELPERS_HPP
+#define BOOST_INTERPROCESS_DETAIL_SHARED_DIR_HELPERS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+#include <boost/interprocess/detail/os_file_functions.hpp>
+#include <boost/interprocess/errors.hpp>
+#include <boost/interprocess/exceptions.hpp>
+#include <string>
+
+#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) && defined(BOOST_INTERPROCESS_WINDOWS)
+   #include <boost/interprocess/detail/windows_intermodule_singleton.hpp>
+#endif
+
+namespace boost {
+namespace interprocess {
+namespace ipcdetail {
+
+#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
+   #if defined(BOOST_INTERPROCESS_WINDOWS)
+      //This type will initialize the stamp
+      struct windows_bootstamp
+      {
+         windows_bootstamp()
+         {
+            //Throw if bootstamp not available
+            if(!winapi::get_last_bootup_time(stamp)){
+               error_info err = system_error_code();
+               throw interprocess_exception(err);
+            }
+         }
+         //Use std::string. Even if this will be constructed in shared memory, all
+         //modules/dlls are from this process so internal raw pointers to heap are always valid
+         std::string stamp;
+      };
+
+      inline void get_bootstamp(std::string &s, bool add = false)
+      {
+         const windows_bootstamp &bootstamp = windows_intermodule_singleton<windows_bootstamp>::get();
+         if(add){
+            s += bootstamp.stamp;
+         }
+         else{
+            s = bootstamp.stamp;
+         }
+      }
+   #elif defined(BOOST_INTERPROCESS_HAS_BSD_KERNEL_BOOTTIME)
+      inline void get_bootstamp(std::string &s, bool add = false)
+      {
+         // FreeBSD specific: sysctl "kern.boottime"
+         int request[2] = { CTL_KERN, KERN_BOOTTIME };
+         struct ::timeval result;
+         std::size_t result_len = sizeof result;
+
+         if (::sysctl (request, 2, &result, &result_len, 0, 0) < 0)
+            return;
+
+         char bootstamp_str[256];
+
+         const char Characters [] =
+            { '0', '1', '2', '3', '4', '5', '6', '7'
+            , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+         std::size_t char_counter = 0;
+         //32 bit values to allow 32 and 64 bit process IPC
+         boost::uint32_t fields[2] = { boost::uint32_t(result.tv_sec), boost::uint32_t(result.tv_usec) };
+         for(std::size_t field = 0; field != 2; ++field){
+            for(std::size_t i = 0; i != sizeof(fields[0]); ++i){
+               const char *ptr = (const char *)&fields[field];
+               bootstamp_str[char_counter++] = Characters[(ptr[i]&0xF0)>>4];
+               bootstamp_str[char_counter++] = Characters[(ptr[i]&0x0F)];
+            }
+         }
+         bootstamp_str[char_counter] = 0;
+         if(add){
+            s += bootstamp_str;
+         }
+         else{
+            s = bootstamp_str;
+         }
+      }
+   #else
+      #error "BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME defined with no known implementation"
+   #endif
+#endif   //#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
+
+inline void get_shared_dir_root(std::string &dir_path)
+{
+   #if defined (BOOST_INTERPROCESS_WINDOWS)
+      winapi::get_shared_documents_folder(dir_path);
+   #else
+      dir_path = "/tmp";
+   #endif
+   //We always need this path, so throw on error
+   if(dir_path.empty()){
+      error_info err = system_error_code();
+      throw interprocess_exception(err);
+   }
+   //Remove final null.
+   dir_path += "/boost_interprocess";
+}
+
+inline void get_shared_dir(std::string &shared_dir)
+{
+   #if defined(BOOST_INTERPROCESS_SHARED_DIR_PATH)
+      shared_dir = BOOST_INTERPROCESS_SHARED_DIR_PATH;
+   #else
+      get_shared_dir_root(shared_dir);
+      #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
+         shared_dir += "/";
+         get_bootstamp(shared_dir, true);
+      #endif
+   #endif
+}
+
+inline void shared_filepath(const char *filename, std::string &filepath)
+{
+   get_shared_dir(filepath);
+   filepath += "/";
+   filepath += filename;
+}
+
+inline void create_shared_dir_and_clean_old(std::string &shared_dir)
+{
+   #if defined(BOOST_INTERPROCESS_SHARED_DIR_PATH)
+      shared_dir = BOOST_INTERPROCESS_SHARED_DIR_PATH;
+   #else
+      //First get the temp directory
+      std::string root_shared_dir;
+      get_shared_dir_root(root_shared_dir);
+
+      //If fails, check that it's because already exists
+      if(!create_directory(root_shared_dir.c_str())){
+         error_info info(system_error_code());
+         if(info.get_error_code() != already_exists_error){
+            throw interprocess_exception(info);
+         }
+      }
+
+      #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
+         get_shared_dir(shared_dir);
+
+         //If fails, check that it's because already exists
+         if(!create_directory(shared_dir.c_str())){
+            error_info info(system_error_code());
+            if(info.get_error_code() != already_exists_error){
+               throw interprocess_exception(info);
+            }
+         }
+         //Now erase all old directories created in the previous boot sessions
+         std::string subdir = shared_dir;
+         subdir.erase(0, root_shared_dir.size()+1);
+         delete_subdirectories(root_shared_dir, subdir.c_str());
+      #else
+         shared_dir = root_shared_dir;
+      #endif
+   #endif
+}
+
+inline void create_shared_dir_cleaning_old_and_get_filepath(const char *filename, std::string &shared_dir)
+{
+   create_shared_dir_and_clean_old(shared_dir);
+   shared_dir += "/";
+   shared_dir += filename;
+}
+
+inline void add_leading_slash(const char *name, std::string &new_name)
+{
+   if(name[0] != '/'){
+      new_name = '/';
+   }
+   new_name += name;
+}
+
+}  //namespace boost{
+}  //namespace interprocess {
+}  //namespace ipcdetail {
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif   //ifndef BOOST_INTERPROCESS_DETAIL_SHARED_DIR_HELPERS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/detail/simple_swap.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+#ifndef BOOST_INTERPROCESS_DETAIL_SWAP_HPP
+#define BOOST_INTERPROCESS_DETAIL_SWAP_HPP
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost { namespace interprocess {
+
+template<class T>
+void simple_swap(T&x, T&y)
+{  T tmp(x); x = y; y = tmp;  }
+
+}}  //namespace boost{ namespace interprocess {
+
+#endif //#ifndef BOOST_INTERPROCESS_DETAIL_SWAP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/detail/std_fwd.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
+#define BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//                        Standard predeclarations
+//////////////////////////////////////////////////////////////////////////////
+
+#if defined(__clang__) && defined(_LIBCPP_VERSION)
+   #define BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic push
+   #pragma GCC diagnostic ignored "-Wc++11-extensions"
+   #define BOOST_INTERPROCESS_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+   #define BOOST_INTERPROCESS_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION)  //GCC >= 4.6
+   #define BOOST_INTERPROCESS_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
+   #define BOOST_INTERPROCESS_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION  } // namespace
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE)  //GCC >= 4.2
+   #define BOOST_INTERPROCESS_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
+   #define BOOST_INTERPROCESS_STD_NS_END _GLIBCXX_END_NAMESPACE
+#else
+   #define BOOST_INTERPROCESS_STD_NS_BEG namespace std{
+   #define BOOST_INTERPROCESS_STD_NS_END }
+#endif
+
+BOOST_INTERPROCESS_STD_NS_BEG
+
+struct input_iterator_tag;
+struct forward_iterator_tag;
+struct bidirectional_iterator_tag;
+struct random_access_iterator_tag;
+
+template<class T>
+struct char_traits;
+
+template<class CharT, class Traits>
+class basic_ostream;
+
+template<class CharT, class Traits>
+class basic_istream;
+
+BOOST_INTERPROCESS_STD_NS_END
+
+#ifdef BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic pop
+   #undef BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
+#endif   //BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
+
+#endif //#ifndef BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
--- a/DEPENDENCIES/generic/include/boost/interprocess/detail/tmp_dir_helpers.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2007-2012. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/interprocess for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTERPROCESS_DETAIL_TMP_DIR_HELPERS_HPP
-#define BOOST_INTERPROCESS_DETAIL_TMP_DIR_HELPERS_HPP
-
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-#include <boost/interprocess/detail/os_file_functions.hpp>
-#include <boost/interprocess/errors.hpp>
-#include <boost/interprocess/exceptions.hpp>
-#include <string>
-
-#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) && defined(BOOST_INTERPROCESS_WINDOWS)
-   #include <boost/interprocess/detail/windows_intermodule_singleton.hpp>
-#endif
-
-namespace boost {
-namespace interprocess {
-namespace ipcdetail {
-
-#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
-   #if defined(BOOST_INTERPROCESS_WINDOWS)
-      //This type will initialize the stamp
-      struct windows_bootstamp
-      {
-         windows_bootstamp()
-         {
-            winapi::get_last_bootup_time(stamp);
-         }
-         //Use std::string. Even if this will be constructed in shared memory, all
-         //modules/dlls are from this process so internal raw pointers to heap are always valid
-         std::string stamp;
-      };
-
-      inline void get_bootstamp(std::string &s, bool add = false)
-      {
-         const windows_bootstamp &bootstamp = windows_intermodule_singleton<windows_bootstamp>::get();
-         if(add){
-            s += bootstamp.stamp;
-         }
-         else{
-            s = bootstamp.stamp;
-         }
-      }
-   #elif defined(BOOST_INTERPROCESS_HAS_BSD_KERNEL_BOOTTIME)
-      inline void get_bootstamp(std::string &s, bool add = false)
-      {
-         // FreeBSD specific: sysctl "kern.boottime"
-         int request[2] = { CTL_KERN, KERN_BOOTTIME };
-         struct ::timeval result;
-         std::size_t result_len = sizeof result;
-
-         if (::sysctl (request, 2, &result, &result_len, 0, 0) < 0)
-            return;
-
-         char bootstamp_str[256];
-
-         const char Characters [] =
-            { '0', '1', '2', '3', '4', '5', '6', '7'
-            , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
-         std::size_t char_counter = 0;
-         //32 bit values to allow 32 and 64 bit process IPC
-         boost::uint32_t fields[2] = { boost::uint32_t(result.tv_sec), boost::uint32_t(result.tv_usec) };
-         for(std::size_t field = 0; field != 2; ++field){
-            for(std::size_t i = 0; i != sizeof(fields[0]); ++i){
-               const char *ptr = (const char *)&fields[field];
-               bootstamp_str[char_counter++] = Characters[(ptr[i]&0xF0)>>4];
-               bootstamp_str[char_counter++] = Characters[(ptr[i]&0x0F)];
-            }
-         }
-         bootstamp_str[char_counter] = 0;
-         if(add){
-            s += bootstamp_str;
-         }
-         else{
-            s = bootstamp_str;
-         }
-      }
-   #else
-      #error "BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME defined with no known implementation"
-   #endif
-#endif   //#if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
-
-inline void get_tmp_base_dir(std::string &tmp_name)
-{
-   #if defined (BOOST_INTERPROCESS_WINDOWS)
-      winapi::get_shared_documents_folder(tmp_name);
-      if(tmp_name.empty() || !winapi::is_directory(tmp_name.c_str())){
-         tmp_name = get_temporary_path();
-      }
-   #else
-      tmp_name = get_temporary_path();
-   #endif
-   if(tmp_name.empty()){
-      error_info err = system_error_code();
-      throw interprocess_exception(err);
-   }
-   //Remove final null.
-   tmp_name += "/boost_interprocess";
-}
-
-inline void tmp_folder(std::string &tmp_name)
-{
-   get_tmp_base_dir(tmp_name);
-   #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
-      tmp_name += "/";
-      get_bootstamp(tmp_name, true);
-   #endif
-}
-
-inline void tmp_filename(const char *filename, std::string &tmp_name)
-{
-   tmp_folder(tmp_name);
-   tmp_name += "/";
-   tmp_name += filename;
-}
-
-inline void create_tmp_and_clean_old(std::string &tmp_name)
-{
-   //First get the temp directory
-   std::string root_tmp_name;
-   get_tmp_base_dir(root_tmp_name);
-
-   //If fails, check that it's because already exists
-   if(!create_directory(root_tmp_name.c_str())){
-      error_info info(system_error_code());
-      if(info.get_error_code() != already_exists_error){
-         throw interprocess_exception(info);
-      }
-   }
-
-   #if defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME)
-      tmp_folder(tmp_name);
-
-      //If fails, check that it's because already exists
-      if(!create_directory(tmp_name.c_str())){
-         error_info info(system_error_code());
-         if(info.get_error_code() != already_exists_error){
-            throw interprocess_exception(info);
-         }
-      }
-      //Now erase all old directories created in the previous boot sessions
-      std::string subdir = tmp_name;
-      subdir.erase(0, root_tmp_name.size()+1);
-      delete_subdirectories(root_tmp_name, subdir.c_str());
-   #else
-      tmp_name = root_tmp_name;
-   #endif
-}
-
-inline void create_tmp_and_clean_old_and_get_filename(const char *filename, std::string &tmp_name)
-{
-   create_tmp_and_clean_old(tmp_name);
-   tmp_name += "/";
-   tmp_name += filename;
-}
-
-inline void add_leading_slash(const char *name, std::string &new_name)
-{
-   if(name[0] != '/'){
-      new_name = '/';
-   }
-   new_name += name;
-}
-
-}  //namespace boost{
-}  //namespace interprocess {
-}  //namespace ipcdetail {
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif   //ifndef BOOST_INTERPROCESS_DETAIL_TMP_DIR_HELPERS_HPP
--- a/DEPENDENCIES/generic/include/boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2011. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/interprocess for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTERPROCESS_MULTI_SIMPLE_SEQ_FIT_HPP
-#define BOOST_INTERPROCESS_MULTI_SIMPLE_SEQ_FIT_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-
-#include <boost/interprocess/interprocess_fwd.hpp>
-#include <boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>
-#include <boost/interprocess/intersegment_ptr.hpp>
-
-/*!\file
-   Describes sequential fit algorithm used to allocate objects in shared memory.
-*/
-
-namespace boost {
-
-namespace interprocess {
-
-/*!This class implements the simple sequential fit algorithm with a simply
-   linked list of free buffers.*/
-template<class MutexFamily, class VoidPtr>
-class multi_simple_seq_fit 
-   : public ipcdetail::simple_seq_fit_impl<MutexFamily, VoidPtr>
-{
-   typedef ipcdetail::simple_seq_fit_impl<MutexFamily, VoidPtr> base_t;
- public:
-   /*!Constructor. "size" is the total size of the managed memory segment, 
-      "extra_hdr_bytes" indicates the extra bytes beginning in the sizeof(multi_simple_seq_fit)
-      offset that the allocator should not use at all.*/
-   multi_simple_seq_fit           (size_type size, size_type extra_hdr_bytes)
-      : base_t(size, extra_hdr_bytes){}
-
-   /*!Allocates bytes from existing segments. If there is no memory, it uses
-      the growing functor associated with the group to allocate a new segment.
-      If this fails, returns 0.*/
-   void* allocate             (size_type nbytes)
-      {  return base_t::multi_allocate(nbytes);   }
-};
-
-}  //namespace interprocess {
-
-}  //namespace boost {
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif   //#ifndef BOOST_INTERPROCESS_MULTI_SIMPLE_SEQ_FIT_HPP
-
--- a/DEPENDENCIES/generic/include/boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,983 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2011. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/interprocess for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTERPROCESS_MEM_ALGO_DETAIL_SIMPLE_SEQ_FIT_IMPL_HPP
-#define BOOST_INTERPROCESS_MEM_ALGO_DETAIL_SIMPLE_SEQ_FIT_IMPL_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/interprocess/detail/config_begin.hpp>
-#include <boost/interprocess/detail/workaround.hpp>
-
-#include <boost/intrusive/pointer_traits.hpp>
-
-#include <boost/interprocess/interprocess_fwd.hpp>
-#include <boost/interprocess/containers/allocation_type.hpp>
-#include <boost/interprocess/offset_ptr.hpp>
-#include <boost/interprocess/sync/interprocess_mutex.hpp>
-#include <boost/interprocess/exceptions.hpp>
-#include <boost/interprocess/detail/utilities.hpp>
-#include <boost/interprocess/detail/multi_segment_services.hpp>
-#include <boost/type_traits/alignment_of.hpp>
-#include <boost/type_traits/type_with_alignment.hpp>
-#include <boost/interprocess/detail/min_max.hpp>
-#include <boost/interprocess/sync/scoped_lock.hpp>
-#include <boost/intrusive/pointer_traits.hpp>
-#include <algorithm>
-#include <utility>
-#include <cstring>
-
-#include <boost/assert.hpp>
-#include <new>
-
-/*!\file
-   Describes sequential fit algorithm used to allocate objects in shared memory.
-   This class is intended as a base class for single segment and multi-segment
-   implementations.
-*/
-
-namespace boost {
-
-namespace interprocess {
-
-namespace ipcdetail {
-
-/*!This class implements the simple sequential fit algorithm with a simply
-   linked list of free buffers.
-   This class is intended as a base class for single segment and multi-segment
-   implementations.*/
-template<class MutexFamily, class VoidPointer>
-class simple_seq_fit_impl
-{
-   //Non-copyable
-   simple_seq_fit_impl();
-   simple_seq_fit_impl(const simple_seq_fit_impl &);
-   simple_seq_fit_impl &operator=(const simple_seq_fit_impl &);
-
-   public:
-   /*!Shared interprocess_mutex family used for the rest of the Interprocess framework*/
-   typedef MutexFamily        mutex_family;
-   /*!Pointer type to be used with the rest of the Interprocess framework*/
-   typedef VoidPointer        void_pointer;
-
-   typedef typename boost::intrusive::pointer_traits<char_ptr>::difference_type difference_type;
-   typedef typename boost::make_unsigned<difference_type>::type size_type;
-
-
-   private:
-   struct block_ctrl;
-   typedef typename boost::intrusive::
-      pointer_traits<void_pointer>::template
-         rebind_pointer<block_ctrl>::type                         block_ctrl_ptr;
-
-   /*!Block control structure*/
-   struct block_ctrl
-   {
-      /*!Offset pointer to the next block.*/
-      block_ctrl_ptr m_next;
-      /*!This block's memory size (including block_ctrl 
-         header) in BasicSize units*/
-      size_type    m_size;
-   
-      size_type get_user_bytes() const
-      {  return this->m_size*Alignment - BlockCtrlBytes; }
-
-      size_type get_total_bytes() const
-      {  return this->m_size*Alignment; }
-
-      static block_ctrl *get_block_from_addr(void *addr)
-      {
-         return reinterpret_cast<block_ctrl*>
-            (reinterpret_cast<char*>(addr) - BlockCtrlBytes);
-      }
-
-      void *get_addr() const
-      {
-         return reinterpret_cast<block_ctrl*>
-            (reinterpret_cast<const char*>(this) + BlockCtrlBytes);
-      }
-
-   };
-
-   /*!Shared interprocess_mutex to protect memory allocate/deallocate*/
-   typedef typename MutexFamily::mutex_type        interprocess_mutex;
-
-   /*!This struct includes needed data and derives from
-      interprocess_mutex to allow EBO when using null interprocess_mutex*/
-   struct header_t : public interprocess_mutex
-   {
-      /*!Pointer to the first free block*/
-      block_ctrl        m_root;
-      /*!Allocated bytes for internal checking*/
-      size_type       m_allocated;
-      /*!The size of the memory segment*/
-      size_type       m_size;
-   }  m_header;
-
-   public:
-   /*!Constructor. "size" is the total size of the managed memory segment, 
-      "extra_hdr_bytes" indicates the extra bytes beginning in the sizeof(simple_seq_fit_impl)
-      offset that the allocator should not use at all.*/
-   simple_seq_fit_impl           (size_type size, size_type extra_hdr_bytes);
-   /*!Destructor.*/
-   ~simple_seq_fit_impl();
-   /*!Obtains the minimum size needed by the algorithm*/
-   static size_type get_min_size (size_type extra_hdr_bytes);
-
-   //Functions for single segment management
-
-   /*!Allocates bytes, returns 0 if there is not more memory*/
-   void* allocate             (size_type nbytes);
-
-   /*!Deallocates previously allocated bytes*/
-   void   deallocate          (void *addr);
-
-   /*!Returns the size of the memory segment*/
-   size_type get_size()  const;
-
-   /*!Increases managed memory in extra_size bytes more*/
-   void grow(size_type extra_size);
-
-   /*!Returns true if all allocated memory has been deallocated*/
-   bool all_memory_deallocated();
-
-   /*!Makes an internal sanity check and returns true if success*/
-   bool check_sanity();
-
-   //!Initializes to zero all the memory that's not in use.
-   //!This function is normally used for security reasons.
-   void clear_free_memory();
-
-   std::pair<void *, bool>
-      allocation_command  (boost::interprocess::allocation_type command,   size_type limit_size,
-                           size_type preferred_size,size_type &received_size, 
-                           void *reuse_ptr = 0, size_type backwards_multiple = 1);
-
-   /*!Returns the size of the buffer previously allocated pointed by ptr*/
-   size_type size(void *ptr) const;
-
-   /*!Allocates aligned bytes, returns 0 if there is not more memory.
-      Alignment must be power of 2*/
-   void* allocate_aligned     (size_type nbytes, size_type alignment);
-
-   /*!Allocates bytes, if there is no more memory, it executes functor
-      f(size_type) to allocate a new segment to manage. The functor returns 
-      std::pair<void*, size_type> indicating the base address and size of 
-      the new segment. If the new segment can't be allocated, allocate
-      it will return 0.*/
-   void* multi_allocate(size_type nbytes);
-
-   private:
-   /*!Real allocation algorithm with min allocation option*/
-   std::pair<void *, bool> priv_allocate(boost::interprocess::allocation_type command
-                                        ,size_type min_size
-                                        ,size_type preferred_size
-                                        ,size_type &received_size
-                                        ,void *reuse_ptr = 0);
-   /*!Returns next block if it's free.
-      Returns 0 if next block is not free.*/
-   block_ctrl *priv_next_block_if_free(block_ctrl *ptr);
-
-   /*!Returns previous block's if it's free.
-      Returns 0 if previous block is not free.*/
-   std::pair<block_ctrl*, block_ctrl*>priv_prev_block_if_free(block_ctrl *ptr);
-
-   /*!Real expand function implementation*/
-   bool priv_expand(void *ptr
-                   ,size_type min_size, size_type preferred_size
-                   ,size_type &received_size);
-
-   /*!Real expand to both sides implementation*/
-   void* priv_expand_both_sides(boost::interprocess::allocation_type command
-                               ,size_type min_size
-                               ,size_type preferred_size
-                               ,size_type &received_size
-                               ,void *reuse_ptr
-                               ,bool only_preferred_backwards);
-
-   /*!Real shrink function implementation*/
-   bool priv_shrink(void *ptr
-                   ,size_type max_size, size_type preferred_size
-                   ,size_type &received_size);
-
-   //!Real private aligned allocation function
-   void* priv_allocate_aligned     (size_type nbytes, size_type alignment);
-
-   /*!Checks if block has enough memory and splits/unlinks the block
-      returning the address to the users*/
-   void* priv_check_and_allocate(size_type units
-                                ,block_ctrl* prev
-                                ,block_ctrl* block
-                                ,size_type &received_size);
-   /*!Real deallocation algorithm*/
-   void priv_deallocate(void *addr);
-
-   /*!Makes a new memory portion available for allocation*/
-   void priv_add_segment(void *addr, size_type size);
-
-   static const std::size_t Alignment = ::boost::alignment_of<boost::ipcdetail::max_align>::value;
-   static const std::size_t BlockCtrlBytes = ipcdetail::ct_rounded_size<sizeof(block_ctrl), Alignment>::value;
-   static const std::size_t BlockCtrlSize  = BlockCtrlBytes/Alignment;
-   static const std::size_t MinBlockSize   = BlockCtrlSize + Alignment;
-
-   public:
-   static const std::size_t PayloadPerAllocation = BlockCtrlBytes;
-};
-
-template<class MutexFamily, class VoidPointer>
-inline simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   simple_seq_fit_impl(size_type size, size_type extra_hdr_bytes)
-{
-   //Initialize sizes and counters
-   m_header.m_allocated = 0;
-   m_header.m_size      = size;
-
-   //Initialize pointers
-   size_type block1_off  = ipcdetail::get_rounded_size(sizeof(*this)+extra_hdr_bytes, Alignment);
-   m_header.m_root.m_next  = reinterpret_cast<block_ctrl*>
-                              (reinterpret_cast<char*>(this) + block1_off);
-   m_header.m_root.m_next->m_size  = (size - block1_off)/Alignment;
-   m_header.m_root.m_next->m_next  = &m_header.m_root;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline simple_seq_fit_impl<MutexFamily, VoidPointer>::~simple_seq_fit_impl()
-{
-   //There is a memory leak!
-//   BOOST_ASSERT(m_header.m_allocated == 0);
-//   BOOST_ASSERT(m_header.m_root.m_next->m_next == block_ctrl_ptr(&m_header.m_root));
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void simple_seq_fit_impl<MutexFamily, VoidPointer>::grow(size_type extra_size)
-{  
-   //Old highest address block's end offset
-   size_type old_end = m_header.m_size/Alignment*Alignment;
-
-   //Update managed buffer's size
-   m_header.m_size += extra_size;
-
-   //We need at least MinBlockSize blocks to create a new block
-   if((m_header.m_size - old_end) < MinBlockSize){
-      return;
-   }
-
-   //We'll create a new free block with extra_size bytes
-   block_ctrl *new_block = reinterpret_cast<block_ctrl*>
-                              (reinterpret_cast<char*>(this) + old_end);
-
-   new_block->m_next = 0;
-   new_block->m_size = (m_header.m_size - old_end)/Alignment;
-   m_header.m_allocated += new_block->m_size*Alignment;
-   this->priv_deallocate(reinterpret_cast<char*>(new_block) + BlockCtrlBytes);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void simple_seq_fit_impl<MutexFamily, VoidPointer>::priv_add_segment(void *addr, size_type size)
-{  
-   //Check size
-   BOOST_ASSERT(!(size < MinBlockSize));
-   if(size < MinBlockSize)
-      return;
-   //Construct big block using the new segment
-   block_ctrl *new_block   = static_cast<block_ctrl *>(addr);
-   new_block->m_size       = size/Alignment;
-   new_block->m_next       = 0;
-   //Simulate this block was previously allocated
-   m_header.m_allocated   += new_block->m_size*Alignment; 
-   //Return block and insert it in the free block list
-   this->priv_deallocate(reinterpret_cast<char*>(new_block) + BlockCtrlBytes);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline typename simple_seq_fit_impl<MutexFamily, VoidPointer>::size_type
-simple_seq_fit_impl<MutexFamily, VoidPointer>::get_size()  const
-   {  return m_header.m_size;  }
-
-template<class MutexFamily, class VoidPointer>
-inline typename simple_seq_fit_impl<MutexFamily, VoidPointer>::size_type
-simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   get_min_size (size_type extra_hdr_bytes)
-{
-   return ipcdetail::get_rounded_size(sizeof(simple_seq_fit_impl)+extra_hdr_bytes
-                                  ,Alignment)
-          + MinBlockSize;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline bool simple_seq_fit_impl<MutexFamily, VoidPointer>::
-    all_memory_deallocated()
-{
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   return m_header.m_allocated == 0 &&
-          ipcdetail::to_raw_pointer(m_header.m_root.m_next->m_next) == &m_header.m_root;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void simple_seq_fit_impl<MutexFamily, VoidPointer>::clear_free_memory()
-{
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   block_ctrl *block = ipcdetail::to_raw_pointer(m_header.m_root.m_next);
-
-   //Iterate through all free portions
-   do{
-      //Just clear user the memory part reserved for the user      
-      std::memset( reinterpret_cast<char*>(block) + BlockCtrlBytes
-                 , 0
-                 , block->m_size*Alignment - BlockCtrlBytes);
-      block = ipcdetail::to_raw_pointer(block->m_next);
-   }
-   while(block != &m_header.m_root);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline bool simple_seq_fit_impl<MutexFamily, VoidPointer>::
-    check_sanity()
-{
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   block_ctrl *block = ipcdetail::to_raw_pointer(m_header.m_root.m_next);
-
-   size_type free_memory = 0;
-
-   //Iterate through all blocks obtaining their size
-   do{
-      //Free blocks's next must be always valid
-      block_ctrl *next = ipcdetail::to_raw_pointer(block->m_next);
-      if(!next){
-         return false;
-      }
-      free_memory += block->m_size*Alignment;
-      block = next;
-   }
-   while(block != &m_header.m_root);
-
-   //Check allocated bytes are less than size
-   if(m_header.m_allocated > m_header.m_size){
-      return false;
-   }
-
-   //Check free bytes are less than size
-   if(free_memory > m_header.m_size){
-      return false;
-   }
-   return true;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void* simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   allocate(size_type nbytes)
-{  
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   size_type ignore;
-   return priv_allocate(boost::interprocess::allocate_new, nbytes, nbytes, ignore).first;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void* simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   allocate_aligned(size_type nbytes, size_type alignment)
-{  
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   return priv_allocate_aligned(nbytes, alignment);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline std::pair<void *, bool> simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   allocation_command  (boost::interprocess::allocation_type command,   size_type min_size,
-                        size_type preferred_size,size_type &received_size, 
-                        void *reuse_ptr, size_type backwards_multiple)
-{
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   (void)backwards_multiple;
-   command &= ~boost::interprocess::expand_bwd;
-   if(!command)
-      return std::pair<void *, bool>(0, false);
-   return priv_allocate(command, min_size, preferred_size, received_size, reuse_ptr);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline typename simple_seq_fit_impl<MutexFamily, VoidPointer>::size_type
-simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   size(void *ptr) const
-{
-   //We need no synchronization since this block is not going
-   //to be modified
-   //Obtain the real size of the block
-   block_ctrl *block = reinterpret_cast<block_ctrl*>
-                        (reinterpret_cast<char*>(ptr) - BlockCtrlBytes);
-   return block->m_size*Alignment - BlockCtrlBytes;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void* simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   multi_allocate(size_type nbytes)
-{
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   //Multisegment pointer. Let's try first the normal allocation
-   //since it's faster.
-   size_type ignore;
-   void *addr = this->priv_allocate(boost::interprocess::allocate_new, nbytes, nbytes, ignore).first;
-   if(!addr){
-      //If this fails we will try the allocation through the segment
-      //creator.
-      size_type group, id;
-      //Obtain the segment group of this segment
-      void_pointer::get_group_and_id(this, group, id);
-      if(group == 0){
-         //Ooops, group 0 is not valid.
-         return 0;
-      }
-      //Now obtain the polymorphic functor that creates
-      //new segments and try to allocate again.
-      boost::interprocess::multi_segment_services *p_services = 
-         static_cast<boost::interprocess::multi_segment_services*>
-                     (void_pointer::find_group_data(group));
-      BOOST_ASSERT(p_services);
-     std::pair<void *, std::size_t> ret = 
-         p_services->create_new_segment(MinBlockSize > nbytes ? MinBlockSize : nbytes);
-      if(ret.first){
-         priv_add_segment(ret.first, ret.second);
-         addr = this->priv_allocate(boost::interprocess::allocate_new, nbytes, nbytes, ignore).first;
-      }
-   }
-   return addr;
-}
-
-template<class MutexFamily, class VoidPointer>
-void* simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   priv_expand_both_sides(boost::interprocess::allocation_type command
-                         ,size_type min_size
-                         ,size_type preferred_size
-                         ,size_type &received_size
-                         ,void *reuse_ptr
-                         ,bool only_preferred_backwards)
-{
-   typedef std::pair<block_ctrl *, block_ctrl *> prev_block_t;
-   block_ctrl *reuse = block_ctrl::get_block_from_addr(reuse_ptr);
-   received_size = 0;
-
-   if(this->size(reuse_ptr) > min_size){
-      received_size = this->size(reuse_ptr);
-      return reuse_ptr;
-   }
-
-   if(command & boost::interprocess::expand_fwd){
-      if(priv_expand(reuse_ptr, min_size, preferred_size, received_size))
-         return reuse_ptr;
-   }
-   else{
-      received_size = this->size(reuse_ptr);
-   }
-   if(command & boost::interprocess::expand_bwd){
-      size_type extra_forward = !received_size ? 0 : received_size + BlockCtrlBytes;
-      prev_block_t prev_pair = priv_prev_block_if_free(reuse);
-      block_ctrl *prev = prev_pair.second;
-      if(!prev){
-         return 0;
-      }
-
-      size_type needs_backwards = 
-         ipcdetail::get_rounded_size(preferred_size - extra_forward, Alignment);
-   
-      if(!only_preferred_backwards){
-         needs_backwards = 
-            max_value(ipcdetail::get_rounded_size(min_size - extra_forward, Alignment)
-                     ,min_value(prev->get_user_bytes(), needs_backwards));
-      }
-
-      //Check if previous block has enough size
-      if((prev->get_user_bytes()) >=  needs_backwards){
-         //Now take all next space. This will succeed
-         if(!priv_expand(reuse_ptr, received_size, received_size, received_size)){
-            BOOST_ASSERT(0);
-         }
-         
-         //We need a minimum size to split the previous one
-         if((prev->get_user_bytes() - needs_backwards) > 2*BlockCtrlBytes){
-            block_ctrl *new_block = reinterpret_cast<block_ctrl *>
-               (reinterpret_cast<char*>(reuse) - needs_backwards - BlockCtrlBytes);
-            new_block->m_next = 0;
-            new_block->m_size = 
-               BlockCtrlSize + (needs_backwards + extra_forward)/Alignment;
-            prev->m_size = 
-               (prev->get_total_bytes() - needs_backwards)/Alignment - BlockCtrlSize;
-            received_size = needs_backwards + extra_forward;
-            m_header.m_allocated += needs_backwards + BlockCtrlBytes;
-            return new_block->get_addr();
-         }
-         else{
-            //Just merge the whole previous block
-            block_ctrl *prev_2_block = prev_pair.first;
-            //Update received size and allocation
-            received_size = extra_forward + prev->get_user_bytes();
-            m_header.m_allocated += prev->get_total_bytes();
-            //Now unlink it from previous block
-            prev_2_block->m_next = prev->m_next;
-            prev->m_size = reuse->m_size + prev->m_size;
-            prev->m_next = 0;
-            return prev->get_addr();
-         }
-      }
-   }
-   return 0;
-}
-
-template<class MutexFamily, class VoidPointer>
-std::pair<void *, bool> simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   priv_allocate(boost::interprocess::allocation_type command
-                ,size_type limit_size
-                ,size_type preferred_size
-                ,size_type &received_size
-                ,void *reuse_ptr)
-{
-   if(command & boost::interprocess::shrink_in_place){
-      bool success = 
-         this->priv_shrink(reuse_ptr, limit_size, preferred_size, received_size);
-      return std::pair<void *, bool> ((success ? reuse_ptr : 0), true);
-   }
-   typedef std::pair<void *, bool> return_type;
-   received_size = 0;
-
-   if(limit_size > preferred_size)
-      return return_type(0, false);
-
-   //Number of units to request (including block_ctrl header)
-   size_type nunits = ipcdetail::get_rounded_size(preferred_size, Alignment)/Alignment + BlockCtrlSize;
-
-   //Get the root and the first memory block
-   block_ctrl *prev                 = &m_header.m_root;
-   block_ctrl *block                = ipcdetail::to_raw_pointer(prev->m_next);
-   block_ctrl *root                 = &m_header.m_root;
-   block_ctrl *biggest_block        = 0;
-   block_ctrl *prev_biggest_block   = 0;
-   size_type biggest_size         = limit_size;
-
-   //Expand in place
-   //reuse_ptr, limit_size, preferred_size, received_size
-   //
-   if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){
-      void *ret = priv_expand_both_sides
-         (command, limit_size, preferred_size, received_size, reuse_ptr, true);
-      if(ret)
-         return return_type(ret, true);
-   }
-
-   if(command & boost::interprocess::allocate_new){
-      received_size = 0;
-      while(block != root){
-         //Update biggest block pointers
-         if(block->m_size > biggest_size){
-            prev_biggest_block = prev;
-            biggest_size  = block->m_size;
-            biggest_block = block;
-         }
-         void *addr = this->priv_check_and_allocate(nunits, prev, block, received_size);
-         if(addr) return return_type(addr, false);
-         //Bad luck, let's check next block
-         prev  = block;
-         block = ipcdetail::to_raw_pointer(block->m_next);
-      }
-
-      //Bad luck finding preferred_size, now if we have any biggest_block
-      //try with this block
-      if(biggest_block){
-         received_size = biggest_block->m_size*Alignment - BlockCtrlSize;
-         nunits = ipcdetail::get_rounded_size(limit_size, Alignment)/Alignment + BlockCtrlSize;
-         void *ret = this->priv_check_and_allocate
-                        (nunits, prev_biggest_block, biggest_block, received_size);
-         if(ret)
-            return return_type(ret, false);
-      }
-   }
-   //Now try to expand both sides with min size
-   if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){
-      return return_type(priv_expand_both_sides
-         (command, limit_size, preferred_size, received_size, reuse_ptr, false), true);
-   }
-   return return_type(0, false);
-}
-
-template<class MutexFamily, class VoidPointer>
-inline typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl *
-   simple_seq_fit_impl<MutexFamily, VoidPointer>::
-      priv_next_block_if_free
-         (typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl *ptr)
-{
-   //Take the address where the next block should go
-   block_ctrl *next_block = reinterpret_cast<block_ctrl*>
-      (reinterpret_cast<char*>(ptr) + ptr->m_size*Alignment);
-
-   //Check if the adjacent block is in the managed segment
-   size_type distance = (reinterpret_cast<char*>(next_block) - reinterpret_cast<char*>(this))/Alignment;
-   if(distance >= (m_header.m_size/Alignment)){
-      //"next_block" does not exist so we can't expand "block"
-      return 0;
-   }
-
-   if(!next_block->m_next)
-      return 0;
-
-   return next_block;
-}
-
-template<class MutexFamily, class VoidPointer>
-inline 
-   std::pair<typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl *
-            ,typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl *>
-   simple_seq_fit_impl<MutexFamily, VoidPointer>::
-      priv_prev_block_if_free
-         (typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl *ptr)
-{
-   typedef std::pair<block_ctrl *, block_ctrl *> prev_pair_t;
-   //Take the address where the previous block should go
-   block_ctrl *root           = &m_header.m_root;
-   block_ctrl *prev_2_block   = root;
-   block_ctrl *prev_block = ipcdetail::to_raw_pointer(root->m_next);
-   while((reinterpret_cast<char*>(prev_block) + prev_block->m_size*Alignment)
-            != (reinterpret_cast<char*>(ptr))
-         && prev_block != root){
-      prev_2_block = prev_block;
-      prev_block = ipcdetail::to_raw_pointer(prev_block->m_next);
-   }
-
-   if(prev_block == root || !prev_block->m_next)
-      return prev_pair_t(0, 0);
-
-   //Check if the previous block is in the managed segment
-   size_type distance = (reinterpret_cast<char*>(prev_block) - reinterpret_cast<char*>(this))/Alignment;
-   if(distance >= (m_header.m_size/Alignment)){
-      //"previous_block" does not exist so we can't expand "block"
-      return prev_pair_t(0, 0);
-   }
-   return prev_pair_t(prev_2_block, prev_block);
-}
-
-
-template<class MutexFamily, class VoidPointer>
-inline bool simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   priv_expand (void *ptr
-               ,size_type min_size
-               ,size_type preferred_size
-               ,size_type &received_size)
-{
-   //Obtain the real size of the block
-   block_ctrl *block = reinterpret_cast<block_ctrl*>
-                        (reinterpret_cast<char*>(ptr) - BlockCtrlBytes);
-   size_type old_block_size = block->m_size;
-
-   //All used blocks' next is marked with 0 so check it
-   BOOST_ASSERT(block->m_next == 0);
-
-   //Put this to a safe value
-   received_size = old_block_size*Alignment - BlockCtrlBytes;
-
-   //Now translate it to Alignment units
-   min_size       = ipcdetail::get_rounded_size(min_size, Alignment)/Alignment;
-   preferred_size = ipcdetail::get_rounded_size(preferred_size, Alignment)/Alignment;
-
-   //Some parameter checks
-   if(min_size > preferred_size)
-      return false;
-
-   size_type data_size = old_block_size - BlockCtrlSize;
-
-   if(data_size >= min_size)
-      return true;
-
-   block_ctrl *next_block = priv_next_block_if_free(block);
-   if(!next_block){
-      return false;
-   }
-
-   //Is "block" + "next_block" big enough?
-   size_type merged_size = old_block_size + next_block->m_size;
-
-   //Now we can expand this block further than before
-   received_size = merged_size*Alignment - BlockCtrlBytes;
-
-   if(merged_size < (min_size + BlockCtrlSize)){
-      return false;
-   }
-
-   //We can fill expand. Merge both blocks,
-   block->m_next = next_block->m_next;
-   block->m_size = merged_size;
-   
-   //Find the previous free block of next_block
-   block_ctrl *prev = &m_header.m_root;
-   while(ipcdetail::to_raw_pointer(prev->m_next) != next_block){
-      prev = ipcdetail::to_raw_pointer(prev->m_next);
-   }
-
-   //Now insert merged block in the free list
-   //This allows reusing allocation logic in this function
-   m_header.m_allocated -= old_block_size*Alignment;   
-   prev->m_next = block;
-
-   //Now use check and allocate to do the allocation logic
-   preferred_size += BlockCtrlSize;
-   size_type nunits = preferred_size < merged_size ? preferred_size : merged_size;
-
-   //This must success since nunits is less than merged_size!
-   if(!this->priv_check_and_allocate (nunits, prev, block, received_size)){
-      //Something very ugly is happening here. This is a bug
-      //or there is memory corruption
-      BOOST_ASSERT(0);
-      return false;
-   }
-   return true;   
-}
-
-template<class MutexFamily, class VoidPointer>
-inline bool simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   priv_shrink (void *ptr
-               ,size_type max_size
-               ,size_type preferred_size
-               ,size_type &received_size)
-{
-   //Obtain the real size of the block
-   block_ctrl *block = reinterpret_cast<block_ctrl*>
-                        (reinterpret_cast<char*>(ptr) - BlockCtrlBytes);
-   size_type block_size = block->m_size;
-
-   //All used blocks' next is marked with 0 so check it
-   BOOST_ASSERT(block->m_next == 0);
-
-   //Put this to a safe value
-   received_size = block_size*Alignment - BlockCtrlBytes;
-
-   //Now translate it to Alignment units
-   max_size       = max_size/Alignment;
-   preferred_size = ipcdetail::get_rounded_size(preferred_size, Alignment)/Alignment;
-
-   //Some parameter checks
-   if(max_size < preferred_size)
-      return false;
-
-   size_type data_size = block_size - BlockCtrlSize;
-
-   if(data_size < preferred_size)
-      return false;
-
-   if(data_size == preferred_size)
-      return true;
-
-   //We must be able to create at least a new empty block
-   if((data_size - preferred_size) < BlockCtrlSize){
-      return false;
-   }
-
-   //Now we can just rewrite the size of the old buffer
-   block->m_size = preferred_size + BlockCtrlSize;
-
-   //Update new size
-   received_size = preferred_size*Alignment;
-
-   //We create the new block
-   block = reinterpret_cast<block_ctrl*>
-               (reinterpret_cast<char*>(block) + block->m_size*Alignment);
-
-   //Write control data to simulate this new block was previously allocated
-   block->m_next = 0;
-   block->m_size = data_size - preferred_size;
-
-   //Now deallocate the new block to insert it in the free list
-   this->priv_deallocate(reinterpret_cast<char*>(block)+BlockCtrlBytes);
-   return true;   
-}
-
-template<class MutexFamily, class VoidPointer>
-inline void* simple_seq_fit_impl<MutexFamily, VoidPointer>::
-   priv_allocate_aligned(size_type nbytes, size_type alignment)
-{  
-   //Ensure power of 2
-   if ((alignment & (alignment - size_type(1u))) != 0){
-      //Alignment is not power of two
-      BOOST_ASSERT((alignment & (alignment - size_type(1u))) != 0);
-      return 0;
-   }
-
-   size_type ignore;
-   if(alignment <= Alignment){
-      return priv_allocate(boost::interprocess::allocate_new, nbytes, nbytes, ignore).first;
-   }
-   
-   size_type request = 
-      nbytes + alignment + MinBlockSize*Alignment - BlockCtrlBytes;
-   void *buffer = priv_allocate(boost::interprocess::allocate_new, request, request, ignore).first;
-   if(!buffer)
-      return 0;
-   else if ((((std::size_t)(buffer)) % alignment) == 0)
-      return buffer;
-
-   char *aligned_portion = reinterpret_cast<char*>
-      (reinterpret_cast<size_type>(static_cast<char*>(buffer) + alignment - 1) & -alignment);
-
-   char *pos = ((aligned_portion - reinterpret_cast<char*>(buffer)) >= (MinBlockSize*Alignment)) ? 
-      aligned_portion : (aligned_portion + alignment);
-
-   block_ctrl *first = reinterpret_cast<block_ctrl*>
-                           (reinterpret_cast<char*>(buffer) - BlockCtrlBytes);
-
-   block_ctrl *second = reinterpret_cast<block_ctrl*>(pos - BlockCtrlBytes);
-
-   size_type old_size = first->m_size;
-
-   first->m_size  = (reinterpret_cast<char*>(second) - reinterpret_cast<char*>(first))/Alignment;
-   second->m_size = old_size - first->m_size;
-
-   //Write control data to simulate this new block was previously allocated
-   second->m_next = 0;
-
-   //Now deallocate the new block to insert it in the free list
-   this->priv_deallocate(reinterpret_cast<char*>(first) + BlockCtrlBytes);
-   return reinterpret_cast<char*>(second) + BlockCtrlBytes;
-}
-
-template<class MutexFamily, class VoidPointer> inline
-void* simple_seq_fit_impl<MutexFamily, VoidPointer>::priv_check_and_allocate
-   (size_type nunits
-   ,typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl* prev
-   ,typename simple_seq_fit_impl<MutexFamily, VoidPointer>::block_ctrl* block
-   ,size_type &received_size)
-{
-   size_type upper_nunits = nunits + BlockCtrlSize;
-   bool found = false;
-
-   if (block->m_size > upper_nunits){
-      //This block is bigger than needed, split it in 
-      //two blocks, the first's size will be (block->m_size-units)
-      //the second's size (units)
-      size_type total_size = block->m_size;
-      block->m_size  = nunits;
-      block_ctrl *new_block = reinterpret_cast<block_ctrl*>
-                     (reinterpret_cast<char*>(block) + Alignment*nunits);
-      new_block->m_size  = total_size - nunits;
-      new_block->m_next  = block->m_next;
-      prev->m_next = new_block;
-      found = true;
-   }
-   else if (block->m_size >= nunits){
-      //This block has exactly the right size with an extra
-      //unusable extra bytes.
-      prev->m_next = block->m_next;
-      found = true;
-   }
-
-   if(found){
-      //We need block_ctrl for deallocation stuff, so
-      //return memory user can overwrite
-      m_header.m_allocated += block->m_size*Alignment;
-      received_size =  block->m_size*Alignment - BlockCtrlBytes;
-      //Mark the block as allocated
-      block->m_next = 0;
-      //Check alignment
-      BOOST_ASSERT(((reinterpret_cast<char*>(block) - reinterpret_cast<char*>(this))
-               % Alignment) == 0 );
-      return reinterpret_cast<char*>(block) + BlockCtrlBytes;
-   }
-   return 0;
-}
-
-template<class MutexFamily, class VoidPointer>
-void simple_seq_fit_impl<MutexFamily, VoidPointer>::deallocate(void* addr)
-{
-   if(!addr)   return;
-   //-----------------------
-   boost::interprocess::scoped_lock<interprocess_mutex> guard(m_header);
-   //-----------------------
-   return this->priv_deallocate(addr);
-}
-
-template<class MutexFamily, class VoidPointer>
-void simple_seq_fit_impl<MutexFamily, VoidPointer>::priv_deallocate(void* addr)
-{
-   if(!addr)   return;
-
-   //Let's get free block list. List is always sorted
-   //by memory address to allow block merging.
-   //Pointer next always points to the first 
-   //(lower address) block
-   block_ctrl_ptr prev  = &m_header.m_root;
-   block_ctrl_ptr pos   = m_header.m_root.m_next;
-   block_ctrl_ptr block = reinterpret_cast<block_ctrl*>
-                           (reinterpret_cast<char*>(addr) - BlockCtrlBytes);
-
-   //All used blocks' next is marked with 0 so check it
-   BOOST_ASSERT(block->m_next == 0);
-
-   //Check if alignment and block size are right
-   BOOST_ASSERT((reinterpret_cast<char*>(addr) - reinterpret_cast<char*>(this))
-            % Alignment == 0 );
-
-   size_type total_size = Alignment*block->m_size;
-   BOOST_ASSERT(m_header.m_allocated >= total_size);
-  
-   //Update used memory count
-   m_header.m_allocated -= total_size;   
-
-   //Let's find the previous and the next block of the block to deallocate
-   //This ordering comparison must be done with original pointers
-   //types since their mapping to raw pointers can be different
-   //in each process
-   while((ipcdetail::to_raw_pointer(pos) != &m_header.m_root) && (block > pos)){
-      prev = pos;
-      pos = pos->m_next;
-   }
-
-   //Try to combine with upper block
-   if ((reinterpret_cast<char*>(ipcdetail::to_raw_pointer(block))
-            + Alignment*block->m_size) == 
-        reinterpret_cast<char*>(ipcdetail::to_raw_pointer(pos))){
-
-      block->m_size += pos->m_size;
-      block->m_next  = pos->m_next;
-   }
-   else{
-      block->m_next = pos;
-   }
-
-   //Try to combine with lower block
-   if ((reinterpret_cast<char*>(ipcdetail::to_raw_pointer(prev))
-            + Alignment*prev->m_size) == 
-        reinterpret_cast<char*>(ipcdetail::to_raw_pointer(block))){
-      prev->m_size += block->m_size;
-      prev->m_next  = block->m_next;
-   }
-   else{
-      prev->m_next = block;
-   }
-}
-
-}  //namespace ipcdetail {
-
-}  //namespace interprocess {
-
-}  //namespace boost {
-
-#include <boost/interprocess/detail/config_end.hpp>
-
-#endif   //#ifndef BOOST_INTERPROCESS_MEM_ALGO_DETAIL_SIMPLE_SEQ_FIT_IMPL_HPP
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/sync/detail/common_algorithms.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,81 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP
+#define BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+
+#include <boost/interprocess/sync/spin/wait.hpp>
+
+namespace boost {
+namespace interprocess {
+namespace ipcdetail {
+
+template<class MutexType>
+bool try_based_timed_lock(MutexType &m, const boost::posix_time::ptime &abs_time)
+{
+   //Same as lock()
+   if(abs_time == boost::posix_time::pos_infin){
+      m.lock();
+      return true;
+   }
+   //Always try to lock to achieve POSIX guarantees:
+   // "Under no circumstance shall the function fail with a timeout if the mutex
+   //  can be locked immediately. The validity of the abs_timeout parameter need not
+   //  be checked if the mutex can be locked immediately."
+   else if(m.try_lock()){
+      return true;
+   }
+   else{
+      spin_wait swait;
+      while(microsec_clock::universal_time() < abs_time){
+         if(m.try_lock()){
+            return true;
+         }
+         swait.yield();
+      }
+      return false;
+   }
+}
+
+template<class MutexType>
+void try_based_lock(MutexType &m)
+{
+   if(!m.try_lock()){
+      spin_wait swait;
+      do{
+         if(m.try_lock()){
+            break;
+         }
+         else{
+            swait.yield();
+         }
+      }
+      while(1);
+   }
+}
+
+}  //namespace ipcdetail
+}  //namespace interprocess
+}  //namespace boost
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif   //BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/interprocess/sync/windows/winapi_wrapper_common.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,97 @@
+ //////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
+#define BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+#include <boost/interprocess/detail/win32_api.hpp>
+#include <boost/interprocess/detail/posix_time_types_wrk.hpp>
+#include <boost/interprocess/errors.hpp>
+#include <boost/interprocess/exceptions.hpp>
+#include <limits>
+
+namespace boost {
+namespace interprocess {
+namespace ipcdetail {
+
+inline void winapi_wrapper_wait_for_single_object(void *handle)
+{
+   unsigned long ret = winapi::wait_for_single_object(handle, winapi::infinite_time);
+   if(ret != winapi::wait_object_0){
+      if(ret != winapi::wait_abandoned){
+         error_info err = system_error_code();
+         throw interprocess_exception(err);
+      }
+      else{ //Special case for orphaned mutexes
+         winapi::release_mutex(handle);
+         throw interprocess_exception(owner_dead_error);
+      }
+   }
+}
+
+inline bool winapi_wrapper_try_wait_for_single_object(void *handle)
+{
+   unsigned long ret = winapi::wait_for_single_object(handle, 0);
+   if(ret == winapi::wait_object_0){
+      return true;
+   }
+   else if(ret == winapi::wait_timeout){
+      return false;
+   }
+   else{
+      error_info err = system_error_code();
+      throw interprocess_exception(err);
+   }
+}
+
+inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time)
+{
+   //Windows does not support infinity abs_time so check it
+   if(abs_time == boost::posix_time::pos_infin){
+      winapi_wrapper_wait_for_single_object(handle);
+      return true;
+   }
+   const boost::posix_time::ptime cur_time = microsec_clock::universal_time();
+   //Windows uses relative wait times so check for negative waits
+   //and implement as 0 wait to allow try-semantics as POSIX mandates.
+   unsigned long ret = winapi::wait_for_single_object
+      ( handle
+      , (abs_time <= cur_time) ? 0u
+                                 : (abs_time - cur_time).total_milliseconds()
+      );
+   if(ret == winapi::wait_object_0){
+      return true;
+   }
+   else if(ret == winapi::wait_timeout){
+      return false;
+   }
+   else{
+      error_info err = system_error_code();
+      throw interprocess_exception(err);
+   }
+}
+
+}  //namespace ipcdetail {
+}  //namespace interprocess {
+}  //namespace boost {
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif   //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/algo_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_ALGO_TYPE_HPP
+#define BOOST_INTRUSIVE_DETAIL_ALGO_TYPE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+
+enum algo_types
+{
+   CircularListAlgorithms,
+   CircularSListAlgorithms,
+   LinearSListAlgorithms,
+   CommonSListAlgorithms,
+   BsTreeAlgorithms,
+   RbTreeAlgorithms,
+   AvlTreeAlgorithms,
+   SgTreeAlgorithms,
+   SplayTreeAlgorithms,
+   TreapAlgorithms
+};
+
+template<algo_types AlgoType, class NodeTraits>
+struct get_algo;
+
+template<algo_types AlgoType, class ValueTraits, class NodePtrCompare, class ExtraChecker>
+struct get_node_checker;
+
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_ALGO_TYPE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/algorithm.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP
+#define BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+
+struct algo_pred_equal
+{
+   template<class T>
+   bool operator()(const T &x, const T &y) const
+   {  return x == y;  }
+};
+
+struct algo_pred_less
+{
+   template<class T>
+   bool operator()(const T &x, const T &y) const
+   {  return x < y;  }
+};
+
+template<class InputIt1, class InputIt2, class BinaryPredicate>
+bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p)
+{
+    for (; first1 != last1; ++first1, ++first2) {
+        if (!p(*first1, *first2)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+template<class InputIt1, class InputIt2>
+bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
+{  return (algo_equal)(first1, last1, first2, algo_pred_equal());  }
+
+template<class InputIt1, class InputIt2, class BinaryPredicate>
+bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate pred)
+{
+    for (; first1 != last1 && first2 != last2; ++first1, ++first2)
+        if (!pred(*first1, *first2))
+            return false;
+    return first1 == last1 && first2 == last2;
+}
+
+template<class InputIt1, class InputIt2>
+bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
+{  return (algo_equal)(first1, last1, first2, last2, algo_pred_equal());  }
+
+template <class InputIterator1, class InputIterator2, class BinaryPredicate>
+  bool algo_lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
+                                     InputIterator2 first2, InputIterator2 last2,
+                                     BinaryPredicate pred)
+{
+   while (first1 != last1){
+      if (first2 == last2 || *first2 < *first1) return false;
+      else if (pred(*first1, *first2)) return true;
+      ++first1; ++first2;
+   }
+   return (first2 != last2);
+}
+
+template <class InputIterator1, class InputIterator2>
+  bool algo_lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
+                                     InputIterator2 first2, InputIterator2 last2)
+{  return (algo_lexicographical_compare)(first1, last1, first2, last2, algo_pred_less());  }
+
+}  //namespace intrusive {
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/array_initializer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,95 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
+#define BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/core/no_exceptions_support.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+//This is not standard, but should work with all compilers
+union max_align
+{
+   char        char_;
+   short       short_;
+   int         int_;
+   long        long_;
+   #ifdef BOOST_HAS_LONG_LONG
+   ::boost::long_long_type  long_long_;
+   #endif
+   float       float_;
+   double      double_;
+   long double long_double_;
+   void *      void_ptr_;
+};
+
+template<class T, std::size_t N>
+class array_initializer
+{
+   public:
+   template<class CommonInitializer>
+   array_initializer(const CommonInitializer &init)
+   {
+      char *init_buf = (char*)rawbuf;
+      std::size_t i = 0;
+      BOOST_TRY{
+         for(; i != N; ++i){
+            new(init_buf)T(init);
+            init_buf += sizeof(T);
+         }
+      }
+      BOOST_CATCH(...){
+         while(i--){
+            init_buf -= sizeof(T);
+            ((T*)init_buf)->~T();
+         }
+         BOOST_RETHROW;
+      }
+      BOOST_CATCH_END
+   }
+
+   operator T* ()
+   {  return (T*)(rawbuf);  }
+
+   operator const T*() const
+   {  return (const T*)(rawbuf);  }
+
+   ~array_initializer()
+   {
+      char *init_buf = (char*)rawbuf + N*sizeof(T);
+      for(std::size_t i = 0; i != N; ++i){
+         init_buf -= sizeof(T);
+         ((T*)init_buf)->~T();
+      }
+   }
+
+   private:
+   detail::max_align rawbuf[(N*sizeof(T)-1)/sizeof(detail::max_align)+1];
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/bstree_algorithms_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,184 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_BSTREE_ALGORITHMS_BASE_HPP
+#define BOOST_INTRUSIVE_BSTREE_ALGORITHMS_BASE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/uncast.hpp>
+
+namespace boost {
+namespace intrusive {
+
+template<class NodeTraits>
+class bstree_algorithms_base
+{
+   public:
+   typedef typename NodeTraits::node            node;
+   typedef NodeTraits                           node_traits;
+   typedef typename NodeTraits::node_ptr        node_ptr;
+   typedef typename NodeTraits::const_node_ptr  const_node_ptr;
+
+   //! <b>Requires</b>: 'node' is a node from the tree except the header.
+   //!
+   //! <b>Effects</b>: Returns the next node of the tree.
+   //!
+   //! <b>Complexity</b>: Average constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static node_ptr next_node(const node_ptr & node)
+   {
+      node_ptr const n_right(NodeTraits::get_right(node));
+      if(n_right){
+         return minimum(n_right);
+      }
+      else {
+         node_ptr n(node);
+         node_ptr p(NodeTraits::get_parent(n));
+         while(n == NodeTraits::get_right(p)){
+            n = p;
+            p = NodeTraits::get_parent(p);
+         }
+         return NodeTraits::get_right(n) != p ? p : n;
+      }
+   }
+
+   //! <b>Requires</b>: 'node' is a node from the tree except the leftmost node.
+   //!
+   //! <b>Effects</b>: Returns the previous node of the tree.
+   //!
+   //! <b>Complexity</b>: Average constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static node_ptr prev_node(const node_ptr & node)
+   {
+      if(is_header(node)){
+         return NodeTraits::get_right(node);
+         //return maximum(NodeTraits::get_parent(node));
+      }
+      else if(NodeTraits::get_left(node)){
+         return maximum(NodeTraits::get_left(node));
+      }
+      else {
+         node_ptr p(node);
+         node_ptr x = NodeTraits::get_parent(p);
+         while(p == NodeTraits::get_left(x)){
+            p = x;
+            x = NodeTraits::get_parent(x);
+         }
+         return x;
+      }
+   }
+
+   //! <b>Requires</b>: 'node' is a node of a tree but not the header.
+   //!
+   //! <b>Effects</b>: Returns the minimum node of the subtree starting at p.
+   //!
+   //! <b>Complexity</b>: Logarithmic to the size of the subtree.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static node_ptr minimum(node_ptr node)
+   {
+      for(node_ptr p_left = NodeTraits::get_left(node)
+         ;p_left
+         ;p_left = NodeTraits::get_left(node)){
+         node = p_left;
+      }
+      return node;
+   }
+
+   //! <b>Requires</b>: 'node' is a node of a tree but not the header.
+   //!
+   //! <b>Effects</b>: Returns the maximum node of the subtree starting at p.
+   //!
+   //! <b>Complexity</b>: Logarithmic to the size of the subtree.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static node_ptr maximum(node_ptr node)
+   {
+      for(node_ptr p_right = NodeTraits::get_right(node)
+         ;p_right
+         ;p_right = NodeTraits::get_right(node)){
+         node = p_right;
+      }
+      return node;
+   }
+
+   //! <b>Requires</b>: p is a node of a tree.
+   //!
+   //! <b>Effects</b>: Returns true if p is the header of the tree.
+   //!
+   //! <b>Complexity</b>: Constant.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static bool is_header(const const_node_ptr & p)
+   {
+      node_ptr p_left (NodeTraits::get_left(p));
+      node_ptr p_right(NodeTraits::get_right(p));
+      if(!NodeTraits::get_parent(p) || //Header condition when empty tree
+         (p_left && p_right &&         //Header always has leftmost and rightmost
+            (p_left == p_right ||      //Header condition when only node
+               (NodeTraits::get_parent(p_left)  != p ||
+                NodeTraits::get_parent(p_right) != p ))
+               //When tree size > 1 headers can't be leftmost's
+               //and rightmost's parent
+          )){
+         return true;
+      }
+      return false;
+   }
+
+   //! <b>Requires</b>: 'node' is a node of the tree or a header node.
+   //!
+   //! <b>Effects</b>: Returns the header of the tree.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //!
+   //! <b>Throws</b>: Nothing.
+   static node_ptr get_header(const const_node_ptr & node)
+   {
+      node_ptr n(detail::uncast(node));
+      node_ptr p(NodeTraits::get_parent(node));
+      //If p is null, then n is the header of an empty tree
+      if(p){
+         //Non-empty tree, check if n is neither root nor header
+         node_ptr pp(NodeTraits::get_parent(p));
+         //If granparent is not equal to n, then n is neither root nor header,
+         //the try the fast path
+         if(n != pp){
+            do{
+               n = p;
+               p = pp;
+               pp = NodeTraits::get_parent(pp);
+            }while(n != pp);
+            n = p;
+         }
+         //Check if n is root or header when size() > 0
+         else if(!bstree_algorithms_base::is_header(n)){
+            n = p;
+         }
+      }
+      return n;
+   }
+};
+
+}  //namespace intrusive
+}  //namespace boost
+
+#endif //BOOST_INTRUSIVE_BSTREE_ALGORITHMS_BASE_HPP
--- a/DEPENDENCIES/generic/include/boost/intrusive/detail/clear_on_destructor_base.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-//////}  // ///////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2008-2013. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
-#define BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
-
-#include <boost/intrusive/detail/config_begin.hpp>
-
-namespace boost {
-namespace intrusive {
-namespace detail {
-
-template<class Derived, bool DoClear = true>
-class clear_on_destructor_base
-{
-   protected:
-   ~clear_on_destructor_base()
-   {
-      static_cast<Derived*>(this)->clear();
-   }
-};
-
-template<class Derived>
-class clear_on_destructor_base<Derived, false>
-{};
-
-}  // namespace detail {
-}  // namespace intrusive {
-}  // namespace boost {
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif   //#ifndef BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/default_header_holder.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,69 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_DEFAULT_HEADER_HOLDER_HPP
+#define BOOST_INTRUSIVE_DETAIL_DEFAULT_HEADER_HOLDER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/detail/to_raw_pointer.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+// trivial header node holder
+template < typename NodeTraits >
+struct default_header_holder : public NodeTraits::node
+{
+   typedef NodeTraits node_traits;
+   typedef typename node_traits::node node;
+   typedef typename node_traits::node_ptr node_ptr;
+   typedef typename node_traits::const_node_ptr const_node_ptr;
+
+   default_header_holder() : node() {}
+
+   const_node_ptr get_node() const
+   { return pointer_traits< const_node_ptr >::pointer_to(*static_cast< const node* >(this)); }
+
+   node_ptr get_node()
+   { return pointer_traits< node_ptr >::pointer_to(*static_cast< node* >(this)); }
+
+   // (unsafe) downcast used to implement container-from-iterator
+   static default_header_holder* get_holder(const node_ptr &p)
+   { return static_cast< default_header_holder* >(boost::intrusive::detail::to_raw_pointer(p)); }
+};
+
+// type function producing the header node holder
+template < typename Value_Traits, typename HeaderHolder >
+struct get_header_holder_type
+{
+   typedef HeaderHolder type;
+};
+template < typename Value_Traits >
+struct get_header_holder_type< Value_Traits, void >
+{
+   typedef default_header_holder< typename Value_Traits::node_traits > type;
+};
+
+} //namespace detail
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_DEFAULT_HEADER_HOLDER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/empty_node_checker.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_EMPTY_NODE_CHECKER_HPP
+#define BOOST_INTRUSIVE_DETAIL_EMPTY_NODE_CHECKER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class ValueTraits>
+struct empty_node_checker
+{
+   typedef ValueTraits                             value_traits;
+   typedef typename value_traits::node_traits      node_traits;
+   typedef typename node_traits::const_node_ptr    const_node_ptr;
+
+   struct return_type {};
+
+   void operator () (const const_node_ptr&, const return_type&, const return_type&, return_type&) {}
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_EMPTY_NODE_CHECKER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/equal_to_value.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_EQUAL_TO_VALUE_HPP
+#define BOOST_INTRUSIVE_DETAIL_EQUAL_TO_VALUE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+//This functor compares a stored value
+//and the one passed as an argument
+template<class ConstReference>
+class equal_to_value
+{
+   ConstReference t_;
+
+   public:
+   equal_to_value(ConstReference t)
+      :  t_(t)
+   {}
+
+   bool operator()(ConstReference t)const
+   {  return t_ == t;   }
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_EQUAL_TO_VALUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/exception_disposer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,88 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_EXCEPTION_DISPOSER_HPP
+#define BOOST_INTRUSIVE_DETAIL_EXCEPTION_DISPOSER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class Container, class Disposer>
+class exception_disposer
+{
+   Container *cont_;
+   Disposer  &disp_;
+
+   exception_disposer(const exception_disposer&);
+   exception_disposer &operator=(const exception_disposer&);
+
+   public:
+   exception_disposer(Container &cont, Disposer &disp)
+      :  cont_(&cont), disp_(disp)
+   {}
+
+   void release()
+   {  cont_ = 0;  }
+
+   ~exception_disposer()
+   {
+      if(cont_){
+         cont_->clear_and_dispose(disp_);
+      }
+   }
+};
+
+template<class Container, class Disposer, class SizeType>
+class exception_array_disposer
+{
+   Container *cont_;
+   Disposer  &disp_;
+   SizeType  &constructed_;
+
+   exception_array_disposer(const exception_array_disposer&);
+   exception_array_disposer &operator=(const exception_array_disposer&);
+
+   public:
+
+   exception_array_disposer
+      (Container &cont, Disposer &disp, SizeType &constructed)
+      :  cont_(&cont), disp_(disp), constructed_(constructed)
+   {}
+
+   void release()
+   {  cont_ = 0;  }
+
+   ~exception_array_disposer()
+   {
+      SizeType n = constructed_;
+      if(cont_){
+         while(n--){
+            cont_[n].clear_and_dispose(disp_);
+         }
+      }
+   }
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_EXCEPTION_DISPOSER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/get_value_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,222 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_GET_VALUE_TRAITS_HPP
+#define BOOST_INTRUSIVE_DETAIL_GET_VALUE_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/hook_traits.hpp>
+
+namespace boost {
+namespace intrusive {
+
+#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+template<class SupposedValueTraits>
+struct is_default_hook_tag
+{  static const bool value = false;  };
+
+namespace detail{
+
+template <class T, class BaseHook>
+struct concrete_hook_base_value_traits
+{
+   typedef typename BaseHook::hooktags tags;
+   typedef bhtraits
+      < T
+      , typename tags::node_traits
+      , tags::link_mode
+      , typename tags::tag
+      , tags::type> type;
+};
+
+template <class BaseHook>
+struct concrete_hook_base_value_traits<void, BaseHook>
+{
+   typedef typename BaseHook::hooktags type;
+};
+
+template <class T, class AnyToSomeHook_ProtoValueTraits>
+struct any_hook_base_value_traits
+{
+   //AnyToSomeHook value_traits derive from a generic_hook
+   //The generic_hook is configured with any_node_traits
+   //and AnyToSomeHook::value_traits with the correct
+   //node traits for the container, so use node_traits
+   //from AnyToSomeHook_ProtoValueTraits and the rest of
+   //elements from the hooktags member of the generic_hook
+
+   typedef typename AnyToSomeHook_ProtoValueTraits::basic_hook_t     basic_hook_t;
+   typedef typename pointer_rebind
+      < typename basic_hook_t::hooktags::node_traits::node_ptr
+      , void>::type                                                  void_pointer;
+   typedef typename AnyToSomeHook_ProtoValueTraits::template
+      node_traits_from_voidptr<void_pointer>::type                   node_traits;
+
+   typedef bhtraits
+      < T
+      , node_traits
+      , basic_hook_t::hooktags::link_mode
+      , typename basic_hook_t::hooktags::tag
+      , basic_hook_t::hooktags::type
+      > type;
+};
+
+template <class AnyToSomeHook_ProtoValueTraits>
+struct any_hook_base_value_traits<void, AnyToSomeHook_ProtoValueTraits>
+{
+   typedef typename AnyToSomeHook_ProtoValueTraits::basic_hook_t     basic_hook_t;
+   typedef typename pointer_rebind
+      < typename basic_hook_t::hooktags::node_traits::node_ptr
+      , void>::type                                                  void_pointer;
+
+   struct type
+   {
+      typedef typename AnyToSomeHook_ProtoValueTraits::template
+         node_traits_from_voidptr<void_pointer>::type                node_traits;
+   };
+};
+
+template<class MemberHook>
+struct get_member_value_traits
+{
+   typedef typename MemberHook::member_value_traits type;
+};
+
+BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_any_hook, is_any_hook)
+BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_base_hook, hooktags::is_base_hook)
+
+template <class T>
+struct internal_member_value_traits
+{
+   template <class U> static one test(...);
+   template <class U> static two test(typename U::member_value_traits* = 0);
+   static const bool value = sizeof(test<T>(0)) == sizeof(two);
+};
+
+template<class SupposedValueTraits, class T, bool = is_default_hook_tag<SupposedValueTraits>::value>
+struct supposed_value_traits;
+
+template<class T, class BaseHook, bool = internal_any_hook_bool_is_true<BaseHook>::value>
+struct get_base_value_traits;
+
+template<class SupposedValueTraits, class T, bool = internal_base_hook_bool_is_true<SupposedValueTraits>::value>
+struct supposed_base_value_traits;
+
+template<class SupposedValueTraits, bool = internal_member_value_traits<SupposedValueTraits>::value>
+struct supposed_member_value_traits;
+
+template<class SupposedValueTraits, bool = internal_any_hook_bool_is_true<SupposedValueTraits>::value>
+struct any_or_concrete_value_traits;
+
+//Base any hook
+template<class T, class BaseHook>
+struct get_base_value_traits<T, BaseHook, true>
+   : any_hook_base_value_traits<T, BaseHook>
+{};
+
+//Non-any base hook
+template<class T, class BaseHook>
+struct get_base_value_traits<T, BaseHook, false>
+   : concrete_hook_base_value_traits<T, BaseHook>
+{};
+
+//...It's a default hook
+template<class SupposedValueTraits, class T>
+struct supposed_value_traits<SupposedValueTraits, T, true>
+{  typedef typename SupposedValueTraits::template apply<T>::type type;  };
+
+//...Not  a default hook
+template<class SupposedValueTraits, class T>
+struct supposed_value_traits<SupposedValueTraits, T, false>
+{  typedef SupposedValueTraits type;   };
+
+//...It's a base hook
+template<class BaseHook, class T>
+struct supposed_base_value_traits<BaseHook, T, true>
+   : get_base_value_traits<T, BaseHook>
+{};
+
+//...Not a base hook, try if it's a member or value_traits
+template<class SupposedValueTraits, class T>
+struct supposed_base_value_traits<SupposedValueTraits, T, false>
+   : supposed_member_value_traits<SupposedValueTraits>
+{};
+
+//...It's a member hook
+template<class MemberHook>
+struct supposed_member_value_traits<MemberHook, true>
+   : get_member_value_traits<MemberHook>
+{};
+
+//...Not a member hook
+template<class SupposedValueTraits>
+struct supposed_member_value_traits<SupposedValueTraits, false>
+   : any_or_concrete_value_traits<SupposedValueTraits>
+{};
+
+template<class AnyToSomeHook_ProtoValueTraits>
+struct any_or_concrete_value_traits<AnyToSomeHook_ProtoValueTraits, true>
+{
+   //A hook node (non-base, e.g.: member or other value traits
+   typedef typename AnyToSomeHook_ProtoValueTraits::basic_hook_t        basic_hook_t;
+   typedef typename pointer_rebind
+      <typename basic_hook_t::node_ptr, void>::type                     void_pointer;
+   typedef typename AnyToSomeHook_ProtoValueTraits::template
+      node_traits_from_voidptr<void_pointer>::type                      any_node_traits;
+
+   struct type : basic_hook_t
+   {
+      typedef any_node_traits node_traits;
+   };
+};
+
+template<class SupposedValueTraits>
+struct any_or_concrete_value_traits<SupposedValueTraits, false>
+{
+   typedef SupposedValueTraits type;
+};
+
+////////////////////////////////////////
+//  get_value_traits / get_node_traits
+////////////////////////////////////////
+
+template<class T, class SupposedValueTraits>
+struct get_value_traits
+   : supposed_base_value_traits<typename supposed_value_traits<SupposedValueTraits, T>::type, T>
+{};
+
+template<class SupposedValueTraits>
+struct get_node_traits
+{
+   typedef typename get_value_traits<void, SupposedValueTraits>::type::node_traits type;
+};
+
+}  //namespace detail{
+
+#endif   //BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+}  //namespace intrusive {
+}  //namespace boost {
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_INTRUSIVE_DETAIL_GET_VALUE_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/hook_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,186 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2006-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_HOOK_TRAITS_HPP
+#define BOOST_INTRUSIVE_DETAIL_HOOK_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/detail/parent_from_member.hpp>
+#include <boost/intrusive/link_mode.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/to_raw_pointer.hpp>
+#include <boost/intrusive/detail/node_holder.hpp>
+
+namespace boost {
+namespace intrusive {
+
+template<class T, class NodePtr, class Tag, unsigned int Type>
+struct bhtraits_base
+{
+   public:
+   typedef NodePtr                                                   node_ptr;
+   typedef typename pointer_traits<node_ptr>::element_type           node;
+   typedef node_holder<node, Tag, Type>                              node_holder_type;
+   typedef T                                                         value_type;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<const node>::type                      const_node_ptr;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<T>::type                               pointer;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<const T>::type                         const_pointer;
+   //typedef typename pointer_traits<pointer>::reference               reference;
+   //typedef typename pointer_traits<const_pointer>::reference         const_reference;
+   typedef T &                                                       reference;
+   typedef const T &                                                 const_reference;
+   typedef node_holder_type &                                        node_holder_reference;
+   typedef const node_holder_type &                                  const_node_holder_reference;
+   typedef node&                                                     node_reference;
+   typedef const node &                                              const_node_reference;
+
+   static pointer to_value_ptr(const node_ptr & n)
+   {
+      return pointer_traits<pointer>::pointer_to
+         (static_cast<reference>(static_cast<node_holder_reference>(*n)));
+   }
+
+   static const_pointer to_value_ptr(const const_node_ptr & n)
+   {
+      return pointer_traits<const_pointer>::pointer_to
+         (static_cast<const_reference>(static_cast<const_node_holder_reference>(*n)));
+   }
+
+   static node_ptr to_node_ptr(reference value)
+   {
+      return pointer_traits<node_ptr>::pointer_to
+         (static_cast<node_reference>(static_cast<node_holder_reference>(value)));
+   }
+
+   static const_node_ptr to_node_ptr(const_reference value)
+   {
+      return pointer_traits<const_node_ptr>::pointer_to
+         (static_cast<const_node_reference>(static_cast<const_node_holder_reference>(value)));
+   }
+};
+
+template<class T, class NodeTraits, link_mode_type LinkMode, class Tag, unsigned int Type>
+struct bhtraits
+   : public bhtraits_base<T, typename NodeTraits::node_ptr, Tag, Type>
+{
+   static const link_mode_type link_mode = LinkMode;
+   typedef NodeTraits node_traits;
+};
+
+
+template<class T, class Hook, Hook T::* P>
+struct mhtraits
+{
+   public:
+   typedef Hook                                                      hook_type;
+   typedef typename hook_type::hooktags::node_traits                 node_traits;
+   typedef typename node_traits::node                                node;
+   typedef T                                                         value_type;
+   typedef typename node_traits::node_ptr                            node_ptr;
+   typedef typename node_traits::const_node_ptr                      const_node_ptr;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<T>::type                               pointer;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<const T>::type                         const_pointer;
+   typedef T &                                                       reference;
+   typedef const T &                                                 const_reference;
+   typedef node&                                                     node_reference;
+   typedef const node &                                              const_node_reference;
+   typedef hook_type&                                                hook_reference;
+   typedef const hook_type &                                         const_hook_reference;
+
+   static const link_mode_type link_mode = Hook::hooktags::link_mode;
+
+   static node_ptr to_node_ptr(reference value)
+   {
+      return pointer_traits<node_ptr>::pointer_to
+         (static_cast<node_reference>(static_cast<hook_reference>(value.*P)));
+   }
+
+   static const_node_ptr to_node_ptr(const_reference value)
+   {
+      return pointer_traits<const_node_ptr>::pointer_to
+         (static_cast<const_node_reference>(static_cast<const_hook_reference>(value.*P)));
+   }
+
+   static pointer to_value_ptr(const node_ptr & n)
+   {
+      return pointer_traits<pointer>::pointer_to
+         (*detail::parent_from_member<T, Hook>
+            (static_cast<Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
+   }
+
+   static const_pointer to_value_ptr(const const_node_ptr & n)
+   {
+      return pointer_traits<const_pointer>::pointer_to
+         (*detail::parent_from_member<T, Hook>
+            (static_cast<const Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
+   }
+};
+
+
+template<class Functor>
+struct fhtraits
+{
+   public:
+   typedef typename Functor::hook_type                               hook_type;
+   typedef typename Functor::hook_ptr                                hook_ptr;
+   typedef typename Functor::const_hook_ptr                          const_hook_ptr;
+   typedef typename hook_type::hooktags::node_traits                 node_traits;
+   typedef typename node_traits::node                                node;
+   typedef typename Functor::value_type                              value_type;
+   typedef typename node_traits::node_ptr                            node_ptr;
+   typedef typename node_traits::const_node_ptr                      const_node_ptr;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<value_type>::type                      pointer;
+   typedef typename pointer_traits<node_ptr>::
+      template rebind_pointer<const value_type>::type                const_pointer;
+   typedef value_type &                                              reference;
+   typedef const value_type &                                        const_reference;
+   static const link_mode_type link_mode = hook_type::hooktags::link_mode;
+
+   static node_ptr to_node_ptr(reference value)
+   {  return static_cast<node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
+
+   static const_node_ptr to_node_ptr(const_reference value)
+   {  return static_cast<const node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
+
+   static pointer to_value_ptr(const node_ptr & n)
+   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
+
+   static const_pointer to_value_ptr(const const_node_ptr & n)
+   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
+
+   private:
+   static hook_ptr to_hook_ptr(const node_ptr & n)
+   {  return hook_ptr(&*static_cast<hook_type*>(&*n));  }
+
+   static const_hook_ptr to_hook_ptr(const const_node_ptr & n)
+   {  return const_hook_ptr(&*static_cast<const hook_type*>(&*n));  }
+};
+
+
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_HOOK_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/iiterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,121 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2006-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
+#define BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/iterator.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/is_stateful_value_traits.hpp>
+
+namespace boost {
+namespace intrusive {
+
+template<class ValueTraits>
+struct value_traits_pointers
+{
+   typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
+      (boost::intrusive::detail::
+      , ValueTraits, value_traits_ptr
+      , typename boost::intrusive::pointer_traits<typename ValueTraits::node_traits::node_ptr>::template
+         rebind_pointer<ValueTraits>::type)   value_traits_ptr;
+
+   typedef typename boost::intrusive::pointer_traits<value_traits_ptr>::template
+      rebind_pointer<ValueTraits const>::type const_value_traits_ptr;
+};
+
+template<class ValueTraits, bool IsConst, class Category>
+struct iiterator
+{
+   typedef ValueTraits                                         value_traits;
+   typedef typename value_traits::node_traits                  node_traits;
+   typedef typename node_traits::node                          node;
+   typedef typename node_traits::node_ptr                      node_ptr;
+   typedef ::boost::intrusive::pointer_traits<node_ptr>        nodepointer_traits_t;
+   typedef typename nodepointer_traits_t::template
+      rebind_pointer<void>::type                               void_pointer;
+   typedef typename ValueTraits::value_type                    value_type;
+   typedef typename ValueTraits::pointer                       nonconst_pointer;
+   typedef typename ValueTraits::const_pointer                 yesconst_pointer;
+   typedef typename ::boost::intrusive::pointer_traits
+      <nonconst_pointer>::reference                            nonconst_reference;
+   typedef typename ::boost::intrusive::pointer_traits
+      <yesconst_pointer>::reference                            yesconst_reference;
+   typedef typename nodepointer_traits_t::difference_type      difference_type;
+   typedef typename detail::if_c
+      <IsConst, yesconst_pointer, nonconst_pointer>::type      pointer;
+   typedef typename detail::if_c
+      <IsConst, yesconst_reference, nonconst_reference>::type  reference;
+   typedef iterator
+         < Category
+         , value_type
+         , difference_type
+         , pointer
+         , reference
+         > iterator_traits;
+   typedef typename value_traits_pointers
+      <ValueTraits>::value_traits_ptr                          value_traits_ptr;
+   typedef typename value_traits_pointers
+      <ValueTraits>::const_value_traits_ptr                    const_value_traits_ptr;
+   static const bool stateful_value_traits =
+      detail::is_stateful_value_traits<value_traits>::value;
+};
+
+template<class NodePtr, class StoredPointer, bool StatefulValueTraits = true>
+struct iiterator_members
+{
+
+   iiterator_members()
+      : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
+   {}
+
+   iiterator_members(const NodePtr &n_ptr, const StoredPointer &data)
+      :  nodeptr_(n_ptr), ptr_(data)
+   {}
+
+   StoredPointer get_ptr() const
+   {  return ptr_;  }
+
+   NodePtr nodeptr_;
+   StoredPointer ptr_;
+};
+
+template<class NodePtr, class StoredPointer>
+struct iiterator_members<NodePtr, StoredPointer, false>
+{
+   iiterator_members()
+      : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
+   {}
+
+   iiterator_members(const NodePtr &n_ptr, const StoredPointer &)
+      : nodeptr_(n_ptr)
+   {}
+
+   StoredPointer get_ptr() const
+   {  return StoredPointer();  }
+
+   NodePtr nodeptr_;
+};
+
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,147 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP
+#define BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>
+#include <boost/intrusive/detail/std_fwd.hpp>
+#include <boost/move/detail/iterator_traits.hpp>
+#include <boost/move/detail/meta_utils_core.hpp>
+
+namespace boost {
+namespace intrusive {
+
+using boost::movelib::iterator_traits;
+
+////////////////////
+//    iterator
+////////////////////
+template<class Category, class T, class Distance, class Pointer = T*, class Reference = T&>
+struct iterator
+{
+   typedef Category  iterator_category;
+   typedef T         value_type;
+   typedef Distance  difference_type;
+   typedef Pointer   pointer;
+   typedef Reference reference;
+};
+
+////////////////////////////////////////
+//    iterator_[dis|en]able_if_tag
+////////////////////////////////////////
+template<class I, class Tag, class R = void>
+struct iterator_enable_if_tag
+   : ::boost::move_detail::enable_if_c
+      < ::boost::move_detail::is_same
+         < typename boost::intrusive::iterator_traits<I>::iterator_category 
+         , Tag
+         >::value
+         , R>
+{};
+
+template<class I, class Tag, class R = void>
+struct iterator_disable_if_tag
+   : ::boost::move_detail::enable_if_c
+      < !::boost::move_detail::is_same
+         < typename boost::intrusive::iterator_traits<I>::iterator_category 
+         , Tag
+         >::value
+         , R>
+{};
+
+////////////////////////////////////////
+//    iterator_[dis|en]able_if_tag_difference_type
+////////////////////////////////////////
+template<class I, class Tag>
+struct iterator_enable_if_tag_difference_type
+   : iterator_enable_if_tag<I, Tag, typename boost::intrusive::iterator_traits<I>::difference_type>
+{};
+
+template<class I, class Tag>
+struct iterator_disable_if_tag_difference_type
+   : iterator_disable_if_tag<I, Tag, typename boost::intrusive::iterator_traits<I>::difference_type>
+{};
+
+////////////////////
+//    advance
+////////////////////
+template<class InputIt, class Distance> inline
+typename iterator_enable_if_tag<InputIt, std::input_iterator_tag>::type
+   iterator_advance(InputIt& it, Distance n)
+{
+   while(n--)
+	   ++it;
+}
+
+template<class InputIt, class Distance> inline
+typename iterator_enable_if_tag<InputIt, std::forward_iterator_tag>::type
+   iterator_advance(InputIt& it, Distance n)
+{
+   while(n--)
+	   ++it;
+}
+
+template<class InputIt, class Distance> inline
+typename iterator_enable_if_tag<InputIt, std::bidirectional_iterator_tag>::type
+   iterator_advance(InputIt& it, Distance n)
+{
+   for (; 0 < n; --n)
+	   ++it;
+   for (; n < 0; ++n)
+	   --it;
+}
+
+template<class InputIt, class Distance> inline
+typename iterator_enable_if_tag<InputIt, std::random_access_iterator_tag>::type
+   iterator_advance(InputIt& it, Distance n)
+{
+   it += n;
+}
+
+////////////////////
+//    distance
+////////////////////
+template<class InputIt> inline
+typename iterator_disable_if_tag_difference_type
+   <InputIt, std::random_access_iterator_tag>::type
+      iterator_distance(InputIt first, InputIt last)
+{
+   typename iterator_traits<InputIt>::difference_type off = 0;
+   while(first != last){
+	   ++off;
+      ++first;
+   }
+   return off;
+}
+
+template<class InputIt> inline
+typename iterator_enable_if_tag_difference_type
+   <InputIt, std::random_access_iterator_tag>::type
+      iterator_distance(InputIt first, InputIt last)
+{
+   typename iterator_traits<InputIt>::difference_type off = last - first;
+   return off;
+}
+
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/key_nodeptr_comp.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_KEY_NODEPTR_COMP_HPP
+#define BOOST_INTRUSIVE_DETAIL_KEY_NODEPTR_COMP_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/ebo_functor_holder.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class KeyValueCompare, class ValueTraits>
+struct key_nodeptr_comp
+   //Use public inheritance to avoid MSVC bugs with closures
+   :  public ebo_functor_holder<KeyValueCompare>
+{
+   typedef ValueTraits                             value_traits;
+   typedef typename value_traits::value_type       value_type;
+   typedef typename value_traits::node_ptr         node_ptr;
+   typedef typename value_traits::const_node_ptr   const_node_ptr;
+   typedef ebo_functor_holder<KeyValueCompare>     base_t;
+
+   key_nodeptr_comp(KeyValueCompare kcomp, const ValueTraits *traits)
+      :  base_t(kcomp), traits_(traits)
+   {}
+
+   template<class T>
+   struct is_node_ptr
+   {
+      static const bool value = is_same<T, const_node_ptr>::value || is_same<T, node_ptr>::value;
+   };
+
+   //key_forward
+   template<class T>
+   const value_type & key_forward
+      (const T &node, typename enable_if_c<is_node_ptr<T>::value>::type * = 0) const
+   {  return *traits_->to_value_ptr(node);  }
+
+   template<class T>
+   const T & key_forward(const T &key, typename enable_if_c<!is_node_ptr<T>::value>::type* = 0) const
+   {  return key;  }
+
+   //operator() 1 arg
+   template<class KeyType>
+   bool operator()(const KeyType &key1) const
+   {  return base_t::get()(this->key_forward(key1));  }
+
+   template<class KeyType>
+   bool operator()(const KeyType &key1)
+   {  return base_t::get()(this->key_forward(key1));  }
+
+   //operator() 2 arg
+   template<class KeyType, class KeyType2>
+   bool operator()(const KeyType &key1, const KeyType2 &key2) const
+   {  return base_t::get()(this->key_forward(key1), this->key_forward(key2));  }
+
+   template<class KeyType, class KeyType2>
+   bool operator()(const KeyType &key1, const KeyType2 &key2)
+   {  return base_t::get()(this->key_forward(key1), this->key_forward(key2));  }
+
+   const ValueTraits *const traits_;
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_KEY_NODEPTR_COMP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/list_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,133 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Olaf Krzikalla 2004-2006.
+// (C) Copyright Ion Gaztanaga  2006-2013
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_LIST_ITERATOR_HPP
+#define BOOST_INTRUSIVE_LIST_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/std_fwd.hpp>
+#include <boost/intrusive/detail/iiterator.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+
+namespace boost {
+namespace intrusive {
+
+// list_iterator provides some basic functions for a
+// node oriented bidirectional iterator:
+template<class ValueTraits, bool IsConst>
+class list_iterator
+{
+   protected:
+   typedef iiterator
+      <ValueTraits, IsConst, std::bidirectional_iterator_tag> types_t;
+
+   static const bool stateful_value_traits =                types_t::stateful_value_traits;
+
+   typedef ValueTraits                                      value_traits;
+   typedef typename types_t::node_traits                    node_traits;
+
+   typedef typename types_t::node                           node;
+   typedef typename types_t::node_ptr                       node_ptr;
+   typedef typename types_t::const_value_traits_ptr         const_value_traits_ptr;
+
+   public:
+   typedef typename types_t::iterator_traits::difference_type    difference_type;
+   typedef typename types_t::iterator_traits::value_type         value_type;
+   typedef typename types_t::iterator_traits::pointer            pointer;
+   typedef typename types_t::iterator_traits::reference          reference;
+   typedef typename types_t::iterator_traits::iterator_category  iterator_category;
+
+   list_iterator()
+   {}
+
+   explicit list_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
+      : members_(nodeptr, traits_ptr)
+   {}
+
+   list_iterator(list_iterator<ValueTraits, false> const& other)
+      :  members_(other.pointed_node(), other.get_value_traits())
+   {}
+
+   const node_ptr &pointed_node() const
+   { return members_.nodeptr_; }
+
+   list_iterator &operator=(const node_ptr &node)
+   {  members_.nodeptr_ = node;  return static_cast<list_iterator&>(*this);  }
+
+   const_value_traits_ptr get_value_traits() const
+   {  return members_.get_ptr(); }
+
+   public:
+   list_iterator& operator++()
+   {
+      node_ptr p = node_traits::get_next(members_.nodeptr_);
+      members_.nodeptr_ = p;
+      return static_cast<list_iterator&> (*this);
+   }
+
+   list_iterator operator++(int)
+   {
+      list_iterator result (*this);
+      members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
+      return result;
+   }
+
+   list_iterator& operator--()
+   {
+      members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_);
+      return static_cast<list_iterator&> (*this);
+   }
+
+   list_iterator operator--(int)
+   {
+      list_iterator result (*this);
+      members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_);
+      return result;
+   }
+
+   friend bool operator== (const list_iterator& l, const list_iterator& r)
+   {  return l.pointed_node() == r.pointed_node();   }
+
+   friend bool operator!= (const list_iterator& l, const list_iterator& r)
+   {  return !(l == r); }
+
+   reference operator*() const
+   {  return *operator->();   }
+
+   pointer operator->() const
+   { return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
+
+   list_iterator<ValueTraits, false> unconst() const
+   {  return list_iterator<ValueTraits, false>(this->pointed_node(), this->get_value_traits());   }
+
+   private:
+   pointer operator_arrow(detail::false_) const
+   { return ValueTraits::to_value_ptr(members_.nodeptr_); }
+
+   pointer operator_arrow(detail::true_) const
+   { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
+
+   iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
+};
+
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_LIST_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/math.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,275 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_MATH_HPP
+#define BOOST_INTRUSIVE_DETAIL_MATH_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>
+#include <climits>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+///////////////////////////
+// floor_log2  Dispatcher
+////////////////////////////
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1300)
+
+   }}} //namespace boost::intrusive::detail
+
+   //Use _BitScanReverseXX intrinsics
+
+   #if defined(_M_X64) || defined(_M_AMD64) || defined(_M_IA64)   //64 bit target
+      #define BOOST_INTRUSIVE_BSR_INTRINSIC_64_BIT
+   #endif
+
+   #ifndef __INTRIN_H_   // Avoid including any windows system header
+      #ifdef __cplusplus
+      extern "C" {
+      #endif // __cplusplus
+
+      #if defined(BOOST_INTRUSIVE_BSR_INTRINSIC_64_BIT)   //64 bit target
+         unsigned char _BitScanReverse64(unsigned long *index, unsigned __int64 mask);
+         #pragma intrinsic(_BitScanReverse64)
+      #else //32 bit target
+         unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
+         #pragma intrinsic(_BitScanReverse)
+      #endif
+
+      #ifdef __cplusplus
+      }
+      #endif // __cplusplus
+   #endif // __INTRIN_H_
+
+   #ifdef BOOST_INTRUSIVE_BSR_INTRINSIC_64_BIT
+      #define BOOST_INTRUSIVE_BSR_INTRINSIC _BitScanReverse64
+      #undef BOOST_INTRUSIVE_BSR_INTRINSIC_64_BIT
+   #else
+      #define BOOST_INTRUSIVE_BSR_INTRINSIC _BitScanReverse
+   #endif
+
+   namespace boost {
+   namespace intrusive {
+   namespace detail {
+
+   inline std::size_t floor_log2 (std::size_t x)
+   {
+      unsigned long log2;
+      BOOST_INTRUSIVE_BSR_INTRINSIC( &log2, (unsigned long)x );
+      return log2;
+   }
+
+   #undef BOOST_INTRUSIVE_BSR_INTRINSIC
+
+#elif defined(__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) //GCC >=3.4
+
+   //Compile-time error in case of missing specialization
+   template<class Uint>
+   struct builtin_clz_dispatch;
+
+   #if defined(BOOST_HAS_LONG_LONG)
+   template<>
+   struct builtin_clz_dispatch< ::boost::ulong_long_type >
+   {
+      static ::boost::ulong_long_type call(::boost::ulong_long_type n)
+      {  return __builtin_clzll(n); }
+   };
+   #endif
+
+   template<>
+   struct builtin_clz_dispatch<unsigned long>
+   {
+      static unsigned long call(unsigned long n)
+      {  return __builtin_clzl(n); }
+   };
+
+   template<>
+   struct builtin_clz_dispatch<unsigned int>
+   {
+      static unsigned int call(unsigned int n)
+      {  return __builtin_clz(n); }
+   };
+
+   inline std::size_t floor_log2(std::size_t n)
+   {
+      return sizeof(std::size_t)*CHAR_BIT - std::size_t(1) - builtin_clz_dispatch<std::size_t>::call(n);
+   }
+
+#else //Portable methods
+
+////////////////////////////
+// Generic method
+////////////////////////////
+
+   inline std::size_t floor_log2_get_shift(std::size_t n, true_ )//power of two size_t
+   {  return n >> 1;  }
+
+   inline std::size_t floor_log2_get_shift(std::size_t n, false_ )//non-power of two size_t
+   {  return (n >> 1) + ((n & 1u) & (n != 1)); }
+
+   template<std::size_t N>
+   inline std::size_t floor_log2 (std::size_t x, integer<std::size_t, N>)
+   {
+      const std::size_t Bits = N;
+      const bool Size_t_Bits_Power_2= !(Bits & (Bits-1));
+
+      std::size_t n = x;
+      std::size_t log2 = 0;
+
+      std::size_t remaining_bits = Bits;
+      std::size_t shift = floor_log2_get_shift(remaining_bits, bool_<Size_t_Bits_Power_2>());
+      while(shift){
+         std::size_t tmp = n >> shift;
+         if (tmp){
+            log2 += shift, n = tmp;
+         }
+         shift = floor_log2_get_shift(shift, bool_<Size_t_Bits_Power_2>());
+      }
+
+      return log2;
+   }
+
+   ////////////////////////////
+   // DeBruijn method
+   ////////////////////////////
+
+   //Taken from:
+   //http://stackoverflow.com/questions/11376288/fast-computing-of-log2-for-64-bit-integers
+   //Thanks to Desmond Hume
+
+   inline std::size_t floor_log2 (std::size_t v, integer<std::size_t, 32>)
+   {
+      static const int MultiplyDeBruijnBitPosition[32] =
+      {
+         0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
+         8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
+      };
+
+      v |= v >> 1;
+      v |= v >> 2;
+      v |= v >> 4;
+      v |= v >> 8;
+      v |= v >> 16;
+
+      return MultiplyDeBruijnBitPosition[(std::size_t)(v * 0x07C4ACDDU) >> 27];
+   }
+
+   inline std::size_t floor_log2 (std::size_t v, integer<std::size_t, 64>)
+   {
+      static const std::size_t MultiplyDeBruijnBitPosition[64] = {
+      63,  0, 58,  1, 59, 47, 53,  2,
+      60, 39, 48, 27, 54, 33, 42,  3,
+      61, 51, 37, 40, 49, 18, 28, 20,
+      55, 30, 34, 11, 43, 14, 22,  4,
+      62, 57, 46, 52, 38, 26, 32, 41,
+      50, 36, 17, 19, 29, 10, 13, 21,
+      56, 45, 25, 31, 35, 16,  9, 12,
+      44, 24, 15,  8, 23,  7,  6,  5};
+
+      v |= v >> 1;
+      v |= v >> 2;
+      v |= v >> 4;
+      v |= v >> 8;
+      v |= v >> 16;
+      v |= v >> 32;
+      return MultiplyDeBruijnBitPosition[((std::size_t)((v - (v >> 1))*0x07EDD5E59A4E28C2ULL)) >> 58];
+   }
+
+
+   inline std::size_t floor_log2 (std::size_t x)
+   {
+      const std::size_t Bits = sizeof(std::size_t)*CHAR_BIT;
+      return floor_log2(x, integer<std::size_t, Bits>());
+   }
+
+#endif
+
+//Thanks to Laurent de Soras in
+//http://www.flipcode.com/archives/Fast_log_Function.shtml
+inline float fast_log2 (float val)
+{
+   union caster_t
+   {
+      unsigned x;
+      float val;
+   } caster;
+
+   caster.val = val;
+   unsigned x = caster.x;
+   const int log_2 = int((x >> 23) & 255) - 128;
+   x &= ~(unsigned(255u) << 23u);
+   x += unsigned(127) << 23u;
+   caster.x = x;
+   val = caster.val;
+   //1+log2(m), m ranging from 1 to 2
+   //3rd degree polynomial keeping first derivate continuity.
+   //For less precision the line can be commented out
+   val = ((-1.f/3.f) * val + 2.f) * val - (2.f/3.f);
+   return val + static_cast<float>(log_2);
+}
+
+inline std::size_t ceil_log2 (std::size_t x)
+{
+   return static_cast<std::size_t>((x & (x-1)) != 0) + floor_log2(x);
+}
+
+template<class SizeType, std::size_t N>
+struct numbits_eq
+{
+   static const bool value = sizeof(SizeType)*CHAR_BIT == N;
+};
+
+template<class SizeType, class Enabler = void >
+struct sqrt2_pow_max;
+
+template <class SizeType>
+struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 32> >::type>
+{
+   static const SizeType value = 0xb504f334;
+   static const std::size_t pow   = 31;
+};
+
+#ifndef BOOST_NO_INT64_T
+
+template <class SizeType>
+struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 64> >::type>
+{
+   static const SizeType value = 0xb504f333f9de6484ull;
+   static const std::size_t pow   = 63;
+};
+
+#endif   //BOOST_NO_INT64_T
+
+// Returns floor(pow(sqrt(2), x * 2 + 1)).
+// Defined for X from 0 up to the number of bits in size_t minus 1.
+inline std::size_t sqrt2_pow_2xplus1 (std::size_t x)
+{
+   const std::size_t value = (std::size_t)sqrt2_pow_max<std::size_t>::value;
+   const std::size_t pow   = (std::size_t)sqrt2_pow_max<std::size_t>::pow;
+   return (value >> (pow - x)) + 1;
+}
+
+} //namespace detail
+} //namespace intrusive
+} //namespace boost
+
+#endif //BOOST_INTRUSIVE_DETAIL_MATH_HPP
--- a/DEPENDENCIES/generic/include/boost/intrusive/detail/memory_util.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Pablo Halpern 2009. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2011-2013. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTRUSIVE_ALLOCATOR_MEMORY_UTIL_HPP
-#define BOOST_INTRUSIVE_ALLOCATOR_MEMORY_UTIL_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/intrusive/detail/workaround.hpp>
-#include <boost/intrusive/detail/mpl.hpp>
-#include <boost/intrusive/detail/preprocessor.hpp>
-
-namespace boost {
-namespace intrusive {
-namespace detail {
-
-template <typename T>
-inline T* addressof(T& obj)
-{
-   return static_cast<T*>
-      (static_cast<void*>
-         (const_cast<char*>
-            (&reinterpret_cast<const char&>(obj))
-         )
-      );
-}
-
-template <typename T> struct unvoid { typedef T type; };
-template <> struct unvoid<void> { struct type { }; };
-template <> struct unvoid<const void> { struct type { }; };
-
-template <typename T> struct unvoid_ref { typedef T &type; };
-template <> struct unvoid_ref<void> { struct type_impl { }; typedef type_impl & type; };
-template <> struct unvoid_ref<const void> { struct type_impl { }; typedef type_impl & type; };
-
-template <typename T>
-struct LowPriorityConversion
-{
-    // Convertible from T with user-defined-conversion rank.
-    LowPriorityConversion(const T&) { }
-};
-
-// Infrastructure for providing a default type for T::TNAME if absent.
-#define BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(TNAME)              \
-   template <typename T, typename DefaultType>                             \
-   struct boost_intrusive_default_type_ ## TNAME                           \
-   {                                                                       \
-      template <typename X>                                                \
-      static char test(int, typename X::TNAME*);                           \
-                                                                           \
-      template <typename X>                                                \
-      static int test(boost::intrusive::detail::                           \
-         LowPriorityConversion<int>, void*);                               \
-                                                                           \
-      struct DefaultWrap { typedef DefaultType TNAME; };                   \
-                                                                           \
-      static const bool value = (1 == sizeof(test<T>(0, 0)));              \
-                                                                           \
-      typedef typename                                                     \
-         ::boost::intrusive::detail::if_c                                  \
-            <value, T, DefaultWrap>::type::TNAME type;                     \
-   };                                                                      \
-                                                                           \
-   template <typename T, typename DefaultType>                             \
-   struct boost_intrusive_eval_default_type_ ## TNAME                      \
-   {                                                                       \
-      template <typename X>                                                \
-      static char test(int, typename X::TNAME*);                           \
-                                                                           \
-      template <typename X>                                                \
-      static int test(boost::intrusive::detail::                           \
-         LowPriorityConversion<int>, void*);                               \
-                                                                           \
-      struct DefaultWrap                                                   \
-      { typedef typename DefaultType::type TNAME; };                       \
-                                                                           \
-      static const bool value = (1 == sizeof(test<T>(0, 0)));              \
-                                                                           \
-      typedef typename                                                     \
-         ::boost::intrusive::detail::eval_if_c                             \
-            < value                                                        \
-            , ::boost::intrusive::detail::identity<T>                      \
-            , ::boost::intrusive::detail::identity<DefaultWrap>            \
-            >::type::TNAME type;                                           \
-   };                                                                      \
-//
-
-#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL)   \
-      typename INSTANTIATION_NS_PREFIX                                                       \
-         boost_intrusive_default_type_ ## TNAME< T, TIMPL >::type                            \
-//
-
-#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL) \
-      typename INSTANTIATION_NS_PREFIX                                                          \
-         boost_intrusive_eval_default_type_ ## TNAME< T, TIMPL >::type                          \
-//
-
-}}}   //namespace boost::intrusive::detail
-
-#include <boost/intrusive/detail/has_member_function_callable_with.hpp>
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME pointer_to
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME static_cast_from
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME const_cast_from
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME dynamic_cast_from
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail {
-#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END   }}}
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
-#include BOOST_PP_ITERATE()
-
-namespace boost {
-namespace intrusive {
-namespace detail {
-
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(element_type)
-BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type)
-
-//////////////////////
-//struct first_param
-//////////////////////
-
-template <typename T> struct first_param
-{  typedef void type;   };
-
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-   template <template <typename, typename...> class TemplateClass, typename T, typename... Args>
-   struct first_param< TemplateClass<T, Args...> >
-   {
-      typedef T type;
-   };
-
-#else //C++03 compilers
-
-   #define BOOST_PP_LOCAL_MACRO(n)                                                  \
-   template < template <typename                                                    \
-               BOOST_PP_ENUM_TRAILING(n, BOOST_INTRUSIVE_PP_IDENTITY, typename) >   \
-            class TemplateClass                                                     \
-            , typename T BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>                 \
-   struct first_param                                                               \
-      < TemplateClass<T BOOST_PP_ENUM_TRAILING_PARAMS(n, P)> >                      \
-   {                                                                                \
-      typedef T type;                                                               \
-   };                                                                               \
-   //
-   #define BOOST_PP_LOCAL_LIMITS (0, BOOST_INTRUSIVE_MAX_CONSTRUCTOR_PARAMETERS)
-   #include BOOST_PP_LOCAL_ITERATE()
-
-#endif   //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-///////////////////////////
-//struct type_rebind_mode
-///////////////////////////
-template <typename Ptr, typename T>
-struct type_has_rebind
-{
-   template <typename X>
-   #if !defined (__SUNPRO_CC)
-   static char test(int, typename X::template rebind<T>*);
-   #else
-   static char test(int, typename X::rebind<T>*);
-   #endif
-
-   template <typename X>
-   static int test(boost::intrusive::detail::LowPriorityConversion<int>, void*);
-
-   static const bool value = (1 == sizeof(test<Ptr>(0, 0)));
-};
-
-template <typename Ptr, typename T>
-struct type_has_rebind_other
-{
-   template <typename X>
-   #if !defined (__SUNPRO_CC)
-   static char test(int, typename X::template rebind<T>::other*);
-   #else
-   static char test(int, typename X::rebind<T>::other*);
-   #endif
-
-   template <typename X>
-   static int test(boost::intrusive::detail::LowPriorityConversion<int>, void*);
-
-   static const bool value = (1 == sizeof(test<Ptr>(0, 0)));
-};
-
-template <typename Ptr, typename T>
-struct type_rebind_mode
-{
-   static const unsigned int rebind =       (unsigned int)type_has_rebind<Ptr, T>::value;
-   static const unsigned int rebind_other = (unsigned int)type_has_rebind_other<Ptr, T>::value;
-   static const unsigned int mode =         rebind + rebind*rebind_other;
-};
-
-////////////////////////
-//struct type_rebinder
-////////////////////////
-template <typename Ptr, typename U, unsigned int RebindMode = type_rebind_mode<Ptr, U>::mode>
-struct type_rebinder;
-
-// Implementation of pointer_traits<Ptr>::rebind if Ptr has
-// its own rebind::other type (C++03)
-template <typename Ptr, typename U>
-struct type_rebinder< Ptr, U, 2u >
-{
-   typedef typename Ptr::template rebind<U>::other type;
-};
-
-// Implementation of pointer_traits<Ptr>::rebind if Ptr has
-// its own rebind template.
-template <typename Ptr, typename U>
-struct type_rebinder< Ptr, U, 1u >
-{
-   typedef typename Ptr::template rebind<U> type;
-};
-
-// Specialization of pointer_traits<Ptr>::rebind if Ptr does not
-// have its own rebind template but has a the form Ptr<class T,
-// OtherArgs>, where OtherArgs comprises zero or more type parameters.
-// Many pointers fit this form, hence many pointers will get a
-// reasonable default for rebind.
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-template <template <class, class...> class Ptr, typename T, class... Tn, class U>
-struct type_rebinder<Ptr<T, Tn...>, U, 0u >
-{
-   typedef Ptr<U, Tn...> type;
-};
-
-//Needed for non-conforming compilers like GCC 4.3
-template <template <class> class Ptr, typename T, class U>
-struct type_rebinder<Ptr<T>, U, 0u >
-{
-   typedef Ptr<U> type;
-};
-
-#else //C++03 compilers
-
-#define BOOST_PP_LOCAL_MACRO(n)                                                  \
-template < template <typename                                                    \
-            BOOST_PP_ENUM_TRAILING(n, BOOST_INTRUSIVE_PP_IDENTITY, typename) >   \
-           class Ptr                                                             \
-         , typename T BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)                  \
-         , class U>                                                              \
-struct type_rebinder                                                             \
-   < Ptr<T BOOST_PP_ENUM_TRAILING_PARAMS(n, P)>, U, 0u >                         \
-{                                                                                \
-   typedef Ptr<U BOOST_PP_ENUM_TRAILING_PARAMS(n, P)> type;                      \
-};                                                                               \
-//
-#define BOOST_PP_LOCAL_LIMITS (0, BOOST_INTRUSIVE_MAX_CONSTRUCTOR_PARAMETERS)
-#include BOOST_PP_LOCAL_ITERATE()
-
-#endif   //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-}  //namespace detail {
-}  //namespace intrusive {
-}  //namespace boost {
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif // ! defined(BOOST_INTRUSIVE_ALLOCATOR_MEMORY_UTIL_HPP)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/minimal_less_equal_header.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2015
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTRUSIVE_DETAIL_MINIMAL_LESS_EQUAL_HEADER_HPP
+#define BOOST_INTRUSIVE_DETAIL_MINIMAL_LESS_EQUAL_HEADER_HPP
+#
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+#
+#//Try to avoid including <functional>, as it's quite big in C++11
+#if defined(BOOST_GNU_STDLIB)
+#  include <bits/stl_function.h>
+#else
+#  include <functional>    //Fallback
+#endif
+#
+#endif //BOOST_INTRUSIVE_DETAIL_MINIMAL_LESS_EQUAL_HEADER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/minimal_pair_header.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2015
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTRUSIVE_DETAIL_MINIMAL_PAIR_HEADER_HPP
+#define BOOST_INTRUSIVE_DETAIL_MINIMAL_PAIR_HEADER_HPP
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+#
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#//Try to avoid including <utility>, as it's quite big in C++11
+#if defined(BOOST_GNU_STDLIB)
+#  include <bits/stl_pair.h>
+#else
+#  include <utility>    //Fallback
+#endif
+#
+#endif //BOOST_INTRUSIVE_DETAIL_MINIMAL_PAIR_HEADER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/node_cloner_disposer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,118 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_NODE_CLONER_DISPOSER_HPP
+#define BOOST_INTRUSIVE_DETAIL_NODE_CLONER_DISPOSER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/link_mode.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/algo_type.hpp>
+#include <boost/intrusive/detail/assert.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class F, class ValueTraits, algo_types AlgoType, bool IsConst = true>
+struct node_cloner
+   //Use public inheritance to avoid MSVC bugs with closures
+   :  public ebo_functor_holder<F>
+{
+   typedef ValueTraits                             value_traits;
+   typedef typename value_traits::node_traits      node_traits;
+   typedef typename node_traits::node_ptr          node_ptr;
+   typedef ebo_functor_holder<F>                   base_t;
+   typedef typename get_algo< AlgoType
+                            , node_traits>::type   node_algorithms;
+   static const bool safemode_or_autounlink =
+      is_safe_autounlink<value_traits::link_mode>::value;
+   typedef typename value_traits::value_type       value_type;
+   typedef typename value_traits::pointer          pointer;
+   typedef typename node_traits::node              node;
+   typedef typename value_traits::const_node_ptr   const_node_ptr;
+   typedef typename value_traits::reference        reference;
+   typedef typename value_traits::const_reference  const_reference;
+
+   typedef typename if_c<IsConst, const_reference, reference>::type reference_type;
+
+   node_cloner(F f, const ValueTraits *traits)
+      :  base_t(f), traits_(traits)
+   {}
+
+   // tree-based containers use this method, which is proxy-reference friendly
+   node_ptr operator()(const node_ptr & p)
+   {
+      reference_type v = *traits_->to_value_ptr(p);
+      node_ptr n = traits_->to_node_ptr(*base_t::get()(v));
+      //Cloned node must be in default mode if the linking mode requires it
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
+      return n;
+   }
+
+   // hashtables use this method, which is proxy-reference unfriendly
+   node_ptr operator()(const node &to_clone)
+   {
+      reference_type v =
+         *traits_->to_value_ptr
+            (pointer_traits<const_node_ptr>::pointer_to(to_clone));
+      node_ptr n = traits_->to_node_ptr(*base_t::get()(v));
+      //Cloned node must be in default mode if the linking mode requires it
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
+      return n;
+   }
+
+   const ValueTraits * const traits_;
+};
+
+template<class F, class ValueTraits, algo_types AlgoType>
+struct node_disposer
+   //Use public inheritance to avoid MSVC bugs with closures
+   :  public ebo_functor_holder<F>
+{
+   typedef ValueTraits                          value_traits;
+   typedef typename value_traits::node_traits   node_traits;
+   typedef typename node_traits::node_ptr       node_ptr;
+   typedef ebo_functor_holder<F>                base_t;
+   typedef typename get_algo< AlgoType
+                            , node_traits>::type   node_algorithms;
+   static const bool safemode_or_autounlink =
+      is_safe_autounlink<value_traits::link_mode>::value;
+
+   node_disposer(F f, const ValueTraits *cont)
+      :  base_t(f), traits_(cont)
+   {}
+
+   void operator()(const node_ptr & p)
+   {
+      if(safemode_or_autounlink)
+         node_algorithms::init(p);
+      base_t::get()(traits_->to_value_ptr(p));
+   }
+   const ValueTraits * const traits_;
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_NODE_CLONER_DISPOSER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/node_holder.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_NODE_HOLDER_HPP
+#define BOOST_INTRUSIVE_DETAIL_NODE_HOLDER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+
+template<class Node, class Tag, unsigned int>
+struct node_holder
+   :  public Node
+{};
+
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_NODE_HOLDER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/node_to_value.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,130 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP
+#define BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/is_stateful_value_traits.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class VoidPointer>
+struct dummy_constptr
+{
+   typedef typename boost::intrusive::pointer_traits<VoidPointer>::
+      template rebind_pointer<const void>::type ConstVoidPtr;
+
+   explicit dummy_constptr(ConstVoidPtr)
+   {}
+
+   dummy_constptr()
+   {}
+
+   ConstVoidPtr get_ptr() const
+   {  return ConstVoidPtr();  }
+};
+
+template<class VoidPointer>
+struct constptr
+{
+   typedef typename boost::intrusive::pointer_traits<VoidPointer>::
+      template rebind_pointer<const void>::type ConstVoidPtr;
+
+   constptr()
+   {}
+
+   explicit constptr(const ConstVoidPtr &ptr)
+      :  const_void_ptr_(ptr)
+   {}
+
+   const void *get_ptr() const
+   {  return boost::intrusive::detail::to_raw_pointer(const_void_ptr_);  }
+
+   ConstVoidPtr const_void_ptr_;
+};
+
+template <class VoidPointer, bool store_ptr>
+struct select_constptr
+{
+   typedef typename if_c
+      < store_ptr
+      , constptr<VoidPointer>
+      , dummy_constptr<VoidPointer>
+      >::type type;
+};
+
+
+template<class ValueTraits, bool IsConst>
+struct node_to_value
+   :  public select_constptr
+      < typename pointer_traits
+            <typename ValueTraits::pointer>::template rebind_pointer<void>::type
+      , is_stateful_value_traits<ValueTraits>::value
+      >::type
+{
+   static const bool stateful_value_traits = is_stateful_value_traits<ValueTraits>::value;
+   typedef typename select_constptr
+      < typename pointer_traits
+            <typename ValueTraits::pointer>::
+               template rebind_pointer<void>::type
+      , stateful_value_traits >::type                 Base;
+
+   typedef ValueTraits                                 value_traits;
+   typedef typename value_traits::value_type           value_type;
+   typedef typename value_traits::node_traits::node    node;
+   typedef typename add_const_if_c
+         <value_type, IsConst>::type                   vtype;
+   typedef typename add_const_if_c
+         <node, IsConst>::type                         ntype;
+   typedef typename pointer_traits
+      <typename ValueTraits::pointer>::
+         template rebind_pointer<ntype>::type          npointer;
+   typedef typename pointer_traits<npointer>::
+      template rebind_pointer<const ValueTraits>::type const_value_traits_ptr;
+
+   node_to_value(const const_value_traits_ptr &ptr)
+      :  Base(ptr)
+   {}
+
+   typedef vtype &                                 result_type;
+   typedef ntype &                                 first_argument_type;
+
+   const_value_traits_ptr get_value_traits() const
+   {  return pointer_traits<const_value_traits_ptr>::static_cast_from(Base::get_ptr());  }
+
+   result_type to_value(first_argument_type arg, false_) const
+   {  return *(value_traits::to_value_ptr(pointer_traits<npointer>::pointer_to(arg)));  }
+
+   result_type to_value(first_argument_type arg, true_) const
+   {  return *(this->get_value_traits()->to_value_ptr(pointer_traits<npointer>::pointer_to(arg))); }
+
+   result_type operator()(first_argument_type arg) const
+   {  return this->to_value(arg, bool_<stateful_value_traits>()); }
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/pointer_element.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,168 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
+#define BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
+#include <boost/intrusive/detail/workaround.hpp>
+#endif   //BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
+
+namespace boost {
+namespace intrusive {
+namespace detail{
+
+//////////////////////
+//struct first_param
+//////////////////////
+
+template <typename T> struct first_param
+{  typedef void type;   };
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+   template <template <typename, typename...> class TemplateClass, typename T, typename... Args>
+   struct first_param< TemplateClass<T, Args...> >
+   {
+      typedef T type;
+   };
+
+#else //C++03 compilers
+
+   template < template  //0arg
+               <class
+               > class TemplateClass, class T
+            >
+   struct first_param
+      < TemplateClass<T> >
+   {  typedef T type;   };
+
+   template < template  //1arg
+               <class,class
+               > class TemplateClass, class T
+            , class P0>
+   struct first_param
+      < TemplateClass<T, P0> >
+   {  typedef T type;   };
+
+   template < template  //2arg
+               <class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1>
+   struct first_param
+      < TemplateClass<T, P0, P1> >
+   {  typedef T type;   };
+
+   template < template  //3arg
+               <class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2> >
+   {  typedef T type;   };
+
+   template < template  //4arg
+               <class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3> >
+   {  typedef T type;   };
+
+   template < template  //5arg
+               <class,class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3, class P4>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3, P4> >
+   {  typedef T type;   };
+
+   template < template  //6arg
+               <class,class,class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3, class P4, class P5>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3, P4, P5> >
+   {  typedef T type;   };
+
+   template < template  //7arg
+               <class,class,class,class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3, class P4, class P5, class P6>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6> >
+   {  typedef T type;   };
+
+   template < template  //8arg
+               <class,class,class,class,class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7> >
+   {  typedef T type;   };
+
+   template < template  //9arg
+               <class,class,class,class,class,class,class,class,class,class
+               > class TemplateClass, class T
+            , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
+   struct first_param
+      < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7, P8> >
+   {  typedef T type;   };
+
+#endif   //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+template <typename T>
+struct has_internal_pointer_element
+{
+   template <typename X>
+   static char test(int, typename X::element_type*);
+
+   template <typename X>
+   static int test(...);
+
+   static const bool value = (1 == sizeof(test<T>(0, 0)));
+};
+
+template<class Ptr, bool = has_internal_pointer_element<Ptr>::value>
+struct pointer_element_impl
+{
+   typedef typename Ptr::element_type type;
+};
+
+template<class Ptr>
+struct pointer_element_impl<Ptr, false>
+{
+   typedef typename boost::intrusive::detail::first_param<Ptr>::type type;
+};
+
+}  //namespace detail{
+
+template <typename Ptr>
+struct pointer_element
+{
+   typedef typename ::boost::intrusive::detail::pointer_element_impl<Ptr>::type type;
+};
+
+template <typename T>
+struct pointer_element<T*>
+{  typedef T type; };
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif // defined(BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP)
--- a/DEPENDENCIES/generic/include/boost/intrusive/detail/preprocessor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2008-2013. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTRUSIVE_DETAIL_PREPROCESSOR_HPP
-#define BOOST_INTRUSIVE_DETAIL_PREPROCESSOR_HPP
-
-#if (defined _MSC_VER) && (_MSC_VER >= 1200)
-#  pragma once
-#endif
-
-#include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/intrusive/detail/workaround.hpp>
-
-#include <boost/preprocessor/iteration/local.hpp>
-#include <boost/preprocessor/punctuation/paren_if.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/control/expr_if.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing.hpp>
-#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
-#include <boost/preprocessor/repetition/enum_shifted.hpp>
-#include <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/logical/not.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-
-#define BOOST_INTRUSIVE_MAX_CONSTRUCTOR_PARAMETERS 10
-
-#define BOOST_INTRUSIVE_PP_IDENTITY(z, n, data) data
-
-#define BOOST_INTRUSIVE_PP_DECLVAL(z, n, data) \
-boost::move_detail::declval< BOOST_PP_CAT(P, n) >() \
-//!
-
-#define BOOST_INTRUSIVE_PP_TEMPLATE_PARAM_VOID_DEFAULT(z, n, data)   \
-  BOOST_PP_CAT(class P, n) = void                                      \
-//!
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif //#ifndef BOOST_INTRUSIVE_DETAIL_PREPROCESSOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/reverse_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,141 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
+#define BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/detail/iterator.hpp>
+
+namespace boost {
+namespace intrusive {
+
+template<class It>
+class reverse_iterator
+{
+   public:
+   typedef typename boost::intrusive::iterator_traits<It>::pointer             pointer;
+   typedef typename boost::intrusive::iterator_traits<It>::reference           reference;
+   typedef typename boost::intrusive::iterator_traits<It>::difference_type     difference_type;
+   typedef typename boost::intrusive::iterator_traits<It>::iterator_category   iterator_category;
+   typedef typename boost::intrusive::iterator_traits<It>::value_type          value_type;
+
+
+   typedef It iterator_type;
+
+   reverse_iterator()
+      : m_current()  //Value initialization to achieve "null iterators" (N3644)
+      {}
+
+   explicit reverse_iterator(It r)
+      : m_current(r)
+   {}
+
+   template<class OtherIt>
+   reverse_iterator(const reverse_iterator<OtherIt>& r)
+      : m_current(r.base())
+   {}
+
+   It base() const
+   {  return m_current;  }
+
+   reference operator*() const
+   {  It temp(m_current);   --temp; return *temp; }
+
+   pointer operator->() const
+   {  It temp(m_current);   --temp; return temp.operator->(); }
+
+   reference operator[](difference_type off) const
+   {  return this->m_current[-off-1];  }
+
+   reverse_iterator& operator++()
+   {  --m_current;   return *this;   }
+
+   reverse_iterator operator++(int)
+   {
+      reverse_iterator temp = *this;
+      --m_current;
+      return temp;
+   }
+
+   reverse_iterator& operator--()
+   {
+      ++m_current;
+      return *this;
+   }
+
+   reverse_iterator operator--(int)
+   {
+      reverse_iterator temp(*this);
+      ++m_current;
+      return temp;
+   }
+
+   friend bool operator==(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current == r.m_current;  }
+
+   friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current != r.m_current;  }
+
+   friend bool operator<(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current > r.m_current;  }
+
+   friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current >= r.m_current;  }
+
+   friend bool operator>(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current < r.m_current;  }
+
+   friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r)
+   {  return l.m_current <= r.m_current;  }
+
+   reverse_iterator& operator+=(difference_type off)
+   {  m_current -= off; return *this;  }
+
+   friend reverse_iterator operator+(const reverse_iterator & l, difference_type off)
+   {
+      reverse_iterator tmp(l.m_current);
+      tmp.m_current -= off;
+      return tmp;
+   }
+
+   reverse_iterator& operator-=(difference_type off)
+   {  m_current += off; return *this;  }
+
+   friend reverse_iterator operator-(const reverse_iterator & l, difference_type off)
+   {
+      reverse_iterator tmp(l.m_current);
+      tmp.m_current += off;
+      return tmp;
+   }
+
+   friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
+   {  return r.m_current - l.m_current;  }
+
+   private:
+   It m_current;   // the wrapped iterator
+};
+
+} //namespace intrusive {
+} //namespace boost {
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/simple_disposers.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_SIMPLE_DISPOSERS_HPP
+#define BOOST_INTRUSIVE_DETAIL_SIMPLE_DISPOSERS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+class null_disposer
+{
+   public:
+   template <class Pointer>
+   void operator()(Pointer)
+   {}
+};
+
+template<class NodeAlgorithms>
+class init_disposer
+{
+   typedef typename NodeAlgorithms::node_ptr node_ptr;
+
+   public:
+   void operator()(const node_ptr & p)
+   {  NodeAlgorithms::init(p);   }
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_SIMPLE_DISPOSERS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/size_holder.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,84 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP
+#define BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<bool ConstantSize, class SizeType, class Tag = void>
+struct size_holder
+{
+   static const bool constant_time_size = ConstantSize;
+   typedef SizeType  size_type;
+
+   SizeType get_size() const
+   {  return size_;  }
+
+   void set_size(SizeType size)
+   {  size_ = size; }
+
+   void decrement()
+   {  --size_; }
+
+   void increment()
+   {  ++size_; }
+
+   void increase(SizeType n)
+   {  size_ += n; }
+
+   void decrease(SizeType n)
+   {  size_ -= n; }
+
+   SizeType size_;
+};
+
+template<class SizeType, class Tag>
+struct size_holder<false, SizeType, Tag>
+{
+   static const bool constant_time_size = false;
+   typedef SizeType  size_type;
+
+   size_type get_size() const
+   {  return 0;  }
+
+   void set_size(size_type)
+   {}
+
+   void decrement()
+   {}
+
+   void increment()
+   {}
+
+   void increase(SizeType)
+   {}
+
+   void decrease(SizeType)
+   {}
+};
+
+}  //namespace detail{
+}  //namespace intrusive{
+}  //namespace boost{
+
+#endif //BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/slist_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,124 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Olaf Krzikalla 2004-2006.
+// (C) Copyright Ion Gaztanaga  2006-2013
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_SLIST_ITERATOR_HPP
+#define BOOST_INTRUSIVE_SLIST_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/detail/std_fwd.hpp>
+#include <boost/intrusive/detail/iiterator.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+
+namespace boost {
+namespace intrusive {
+
+
+// slist_iterator provides some basic functions for a
+// node oriented bidirectional iterator:
+template<class ValueTraits, bool IsConst>
+class slist_iterator
+{
+   protected:
+   typedef iiterator
+      <ValueTraits, IsConst, std::forward_iterator_tag> types_t;
+
+   static const bool stateful_value_traits =                types_t::stateful_value_traits;
+
+   typedef ValueTraits                                      value_traits;
+   typedef typename types_t::node_traits                    node_traits;
+
+   typedef typename types_t::node                           node;
+   typedef typename types_t::node_ptr                       node_ptr;
+   typedef typename types_t::const_value_traits_ptr         const_value_traits_ptr;
+
+   public:
+   typedef typename types_t::iterator_traits::difference_type    difference_type;
+   typedef typename types_t::iterator_traits::value_type         value_type;
+   typedef typename types_t::iterator_traits::pointer            pointer;
+   typedef typename types_t::iterator_traits::reference          reference;
+   typedef typename types_t::iterator_traits::iterator_category  iterator_category;
+
+   slist_iterator()
+   {}
+
+   explicit slist_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
+      : members_(nodeptr, traits_ptr)
+   {}
+
+   slist_iterator(slist_iterator<ValueTraits, false> const& other)
+      :  members_(other.pointed_node(), other.get_value_traits())
+   {}
+
+   const node_ptr &pointed_node() const
+   { return members_.nodeptr_; }
+
+   slist_iterator &operator=(const node_ptr &node)
+   {  members_.nodeptr_ = node;  return static_cast<slist_iterator&>(*this);  }
+
+   const_value_traits_ptr get_value_traits() const
+   {  return members_.get_ptr(); }
+
+   public:
+   slist_iterator& operator++()
+   {
+      members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
+      return static_cast<slist_iterator&> (*this);
+   }
+
+   slist_iterator operator++(int)
+   {
+      slist_iterator result (*this);
+      members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
+      return result;
+   }
+
+   friend bool operator== (const slist_iterator& l, const slist_iterator& r)
+   {  return l.pointed_node() == r.pointed_node();   }
+
+   friend bool operator!= (const slist_iterator& l, const slist_iterator& r)
+   {  return !(l == r);   }
+
+   reference operator*() const
+   {  return *operator->();   }
+
+   pointer operator->() const
+   { return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
+
+   slist_iterator<ValueTraits, false> unconst() const
+   {  return slist_iterator<ValueTraits, false>(this->pointed_node(), this->get_value_traits());   }
+
+   private:
+
+   pointer operator_arrow(detail::false_) const
+   { return ValueTraits::to_value_ptr(members_.nodeptr_); }
+
+   pointer operator_arrow(detail::true_) const
+   { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
+
+   iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
+};
+
+} //namespace intrusive
+} //namespace boost
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_SLIST_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/std_fwd.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_STD_FWD_HPP
+#define BOOST_INTRUSIVE_DETAIL_STD_FWD_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//                        Standard predeclarations
+//////////////////////////////////////////////////////////////////////////////
+
+#if defined(__clang__) && defined(_LIBCPP_VERSION)
+   #define BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic push
+   #pragma GCC diagnostic ignored "-Wc++11-extensions"
+   #define BOOST_INTRUSIVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+   #define BOOST_INTRUSIVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION)  //GCC >= 4.6
+   #define BOOST_INTRUSIVE_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION 
+   #define BOOST_INTRUSIVE_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION  } // namespace
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE)  //GCC >= 4.2
+   #define BOOST_INTRUSIVE_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
+   #define BOOST_INTRUSIVE_STD_NS_END _GLIBCXX_END_NAMESPACE
+#else
+   #define BOOST_INTRUSIVE_STD_NS_BEG namespace std{
+   #define BOOST_INTRUSIVE_STD_NS_END }
+#endif
+
+BOOST_INTRUSIVE_STD_NS_BEG
+
+template<class T>
+struct less;
+
+template<class T>
+struct equal_to;
+
+struct input_iterator_tag;
+struct forward_iterator_tag;
+struct bidirectional_iterator_tag;
+struct random_access_iterator_tag;
+
+BOOST_INTRUSIVE_STD_NS_END
+
+#ifdef BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic pop
+   #undef BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
+#endif   //BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
+
+#endif //#ifndef BOOST_INTRUSIVE_DETAIL_STD_FWD_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/to_raw_pointer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2014-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_TO_RAW_POINTER_HPP
+#define BOOST_INTRUSIVE_DETAIL_TO_RAW_POINTER_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/detail/pointer_element.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template <class T>
+inline T* to_raw_pointer(T* p)
+{  return p; }
+
+template <class Pointer>
+inline typename boost::intrusive::pointer_element<Pointer>::type*
+to_raw_pointer(const Pointer &p)
+{  return boost::intrusive::detail::to_raw_pointer(p.operator->());  }
+
+} //namespace detail
+} //namespace intrusive
+} //namespace boost
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/tree_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,164 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2007-2013
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_TREE_ITERATOR_HPP
+#define BOOST_INTRUSIVE_TREE_ITERATOR_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/detail/std_fwd.hpp>
+#include <boost/intrusive/detail/iiterator.hpp>
+#include <boost/intrusive/detail/bstree_algorithms_base.hpp>
+
+namespace boost {
+namespace intrusive {
+
+/////////////////////////////////////////////////////////////////////////////
+//                                                                         //
+//                   Implementation of the tree iterator                   //
+//                                                                         //
+/////////////////////////////////////////////////////////////////////////////
+
+// tree_iterator provides some basic functions for a
+// node oriented bidirectional iterator:
+template<class ValueTraits, bool IsConst>
+class tree_iterator
+{
+   protected:
+   typedef iiterator< ValueTraits, IsConst
+                    , std::bidirectional_iterator_tag>   types_t;
+
+   typedef ValueTraits                                   value_traits;
+   typedef typename types_t::node_traits                 node_traits;
+
+   typedef typename types_t::node                        node;
+   typedef typename types_t::node_ptr                    node_ptr;
+   typedef typename types_t::const_value_traits_ptr      const_value_traits_ptr;
+   typedef bstree_algorithms_base<node_traits>           node_algorithms;
+
+   static const bool stateful_value_traits = types_t::stateful_value_traits;
+
+   void unspecified_bool_type_func() const {}
+   typedef void (tree_iterator::*unspecified_bool_type)() const;
+
+   public:
+   typedef typename types_t::iterator_traits::difference_type    difference_type;
+   typedef typename types_t::iterator_traits::value_type         value_type;
+   typedef typename types_t::iterator_traits::pointer            pointer;
+   typedef typename types_t::iterator_traits::reference          reference;
+   typedef typename types_t::iterator_traits::iterator_category  iterator_category;
+
+   tree_iterator()
+   {}
+
+   explicit tree_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
+      : members_(nodeptr, traits_ptr)
+   {}
+
+   tree_iterator(tree_iterator<value_traits, false> const& other)
+      :  members_(other.pointed_node(), other.get_value_traits())
+   {}
+
+   const node_ptr &pointed_node() const
+   { return members_.nodeptr_; }
+
+   tree_iterator &operator=(const node_ptr &nodeptr)
+   {  members_.nodeptr_ = nodeptr;  return static_cast<tree_iterator&>(*this);  }
+
+   public:
+   tree_iterator& operator++()
+   {
+      members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
+      return static_cast<tree_iterator&> (*this);
+   }
+
+   tree_iterator operator++(int)
+   {
+      tree_iterator result (*this);
+      members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
+      return result;
+   }
+
+   tree_iterator& operator--()
+   {
+      members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
+      return static_cast<tree_iterator&> (*this);
+   }
+
+   tree_iterator operator--(int)
+   {
+      tree_iterator result (*this);
+      members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
+      return result;
+   }
+
+   void go_left()
+   { members_.nodeptr_ = node_traits::get_left(members_.nodeptr_); }
+
+   void go_right()
+   { members_.nodeptr_ = node_traits::get_right(members_.nodeptr_); }
+
+   void go_parent()
+   { members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_); }
+
+   operator unspecified_bool_type() const
+   {  return members_.nodeptr_ ? &tree_iterator::unspecified_bool_type_func : 0;   }
+
+   bool operator! () const
+   {  return !members_.nodeptr_;   }
+
+   friend bool operator== (const tree_iterator& l, const tree_iterator& r)
+   { return l.pointed_node() == r.pointed_node(); }
+
+   friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
+   {  return !(l == r);   }
+
+   reference operator*() const
+   {  return *operator->();   }
+
+   pointer operator->() const
+   { return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
+
+   const_value_traits_ptr get_value_traits() const
+   {  return members_.get_ptr();  }
+
+   tree_iterator end_iterator_from_it() const
+   {
+      return tree_iterator(node_algorithms::get_header(this->pointed_node()), this->get_value_traits());
+   }
+
+   tree_iterator<value_traits, false> unconst() const
+   {  return tree_iterator<value_traits, false>(this->pointed_node(), this->get_value_traits());   }
+
+   private:
+   pointer operator_arrow(detail::false_) const
+   { return ValueTraits::to_value_ptr(members_.nodeptr_); }
+
+   pointer operator_arrow(detail::true_) const
+   { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
+
+   iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
+};
+
+} //namespace intrusive
+} //namespace boost
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_TREE_ITERATOR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/detail/uncast.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2006-2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_UNCAST_HPP
+#define BOOST_INTRUSIVE_DETAIL_UNCAST_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class ConstNodePtr>
+struct uncast_types
+{
+   typedef typename pointer_traits<ConstNodePtr>::element_type element_type;
+   typedef typename remove_const<element_type>::type           non_const_type;
+   typedef typename pointer_traits<ConstNodePtr>::
+      template rebind_pointer<non_const_type>::type            non_const_pointer;
+   typedef pointer_traits<non_const_pointer>                   non_const_traits;
+};
+
+template<class ConstNodePtr>
+static typename uncast_types<ConstNodePtr>::non_const_pointer
+   uncast(const ConstNodePtr & ptr)
+{
+   return uncast_types<ConstNodePtr>::non_const_traits::const_cast_from(ptr);
+}
+
+} //namespace detail {
+} //namespace intrusive
+} //namespace boost
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
--- a/DEPENDENCIES/generic/include/boost/intrusive/detail/utilities.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1072 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga  2006-2013
-//
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
-#define BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
-
-#include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/intrusive/pointer_traits.hpp>
-#include <boost/intrusive/detail/parent_from_member.hpp>
-#include <boost/intrusive/detail/ebo_functor_holder.hpp>
-#include <boost/intrusive/link_mode.hpp>
-#include <boost/intrusive/detail/mpl.hpp>
-#include <boost/intrusive/detail/assert.hpp>
-#include <boost/intrusive/detail/is_stateful_value_traits.hpp>
-#include <boost/intrusive/pointer_traits.hpp>
-#include <boost/cstdint.hpp>
-#include <cstddef>
-#include <climits>
-#include <iterator>
-#include <boost/cstdint.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/detail/no_exceptions_support.hpp>
-#include <functional>
-#include <boost/functional/hash.hpp>
-
-namespace boost {
-namespace intrusive {
-
-enum algo_types
-{
-   CircularListAlgorithms,
-   CircularSListAlgorithms,
-   LinearSListAlgorithms,
-   BsTreeAlgorithms,
-   RbTreeAlgorithms,
-   AvlTreeAlgorithms,
-   SgTreeAlgorithms,
-   SplayTreeAlgorithms,
-   TreapAlgorithms
-};
-
-template<algo_types AlgoType, class NodeTraits>
-struct get_algo;
-
-template <link_mode_type link_mode>
-struct is_safe_autounlink
-{
-   static const bool value = 
-      (int)link_mode == (int)auto_unlink   ||
-      (int)link_mode == (int)safe_link;
-};
-
-namespace detail {
-
-template <class T>
-struct internal_member_value_traits
-{
-   template <class U> static detail::one test(...);
-   template <class U> static detail::two test(typename U::member_value_traits* = 0);
-   static const bool value = sizeof(test<T>(0)) == sizeof(detail::two);
-};
-
-#define BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(TRAITS_PREFIX, TYPEDEF_TO_FIND) \
-template <class T>\
-struct TRAITS_PREFIX##_bool\
-{\
-   template<bool Add>\
-   struct two_or_three {one _[2 + Add];};\
-   template <class U> static one test(...);\
-   template <class U> static two_or_three<U::TYPEDEF_TO_FIND> test (int);\
-   static const std::size_t value = sizeof(test<T>(0));\
-};\
-\
-template <class T>\
-struct TRAITS_PREFIX##_bool_is_true\
-{\
-   static const bool value = TRAITS_PREFIX##_bool<T>::value > sizeof(one)*2;\
-};\
-//
-
-BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_base_hook, hooktags::is_base_hook)
-BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_any_hook, is_any_hook)
-BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(external_value_traits, external_value_traits)
-BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(external_bucket_traits, external_bucket_traits)
-BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(resizable, resizable)
-
-template <class T>
-inline T* to_raw_pointer(T* p)
-{  return p; }
-
-template <class Pointer>
-inline typename boost::intrusive::pointer_traits<Pointer>::element_type*
-to_raw_pointer(const Pointer &p)
-{  return boost::intrusive::detail::to_raw_pointer(p.operator->());  }
-
-//This functor compares a stored value
-//and the one passed as an argument
-template<class ConstReference>
-class equal_to_value
-{
-   ConstReference t_;
-
-   public:
-   equal_to_value(ConstReference t)
-      :  t_(t)
-   {}
-
-   bool operator()(ConstReference t)const
-   {  return t_ == t;   }
-};
-
-class null_disposer
-{
-   public:
-   template <class Pointer>
-   void operator()(Pointer)
-   {}
-};
-
-template<class NodeAlgorithms>
-class init_disposer
-{
-   typedef typename NodeAlgorithms::node_ptr node_ptr;
-
-   public:
-   void operator()(const node_ptr & p)
-   {  NodeAlgorithms::init(p);   }
-};
-
-template<bool ConstantSize, class SizeType, class Tag = void>
-struct size_holder
-{
-   static const bool constant_time_size = ConstantSize;
-   typedef SizeType  size_type;
-
-   SizeType get_size() const
-   {  return size_;  }
-
-   void set_size(SizeType size)
-   {  size_ = size; }
-
-   void decrement()
-   {  --size_; }
-
-   void increment()
-   {  ++size_; }
-
-   void increase(SizeType n)
-   {  size_ += n; }
-
-   void decrease(SizeType n)
-   {  size_ -= n; }
-
-   SizeType size_;
-};
-
-template<class SizeType>
-struct size_holder<false, SizeType>
-{
-   static const bool constant_time_size = false;
-   typedef SizeType  size_type;
-
-   size_type get_size() const
-   {  return 0;  }
-
-   void set_size(size_type)
-   {}
-
-   void decrement()
-   {}
-
-   void increment()
-   {}
-
-   void increase(SizeType)
-   {}
-
-   void decrease(SizeType)
-   {}
-};
-
-template<class KeyValueCompare, class RealValueTraits>
-struct key_nodeptr_comp
-   :  private detail::ebo_functor_holder<KeyValueCompare>
-{
-   typedef RealValueTraits                               real_value_traits;
-   typedef typename real_value_traits::value_type        value_type;
-   typedef typename real_value_traits::node_ptr          node_ptr;
-   typedef typename real_value_traits::const_node_ptr    const_node_ptr;
-   typedef detail::ebo_functor_holder<KeyValueCompare>   base_t;
-   key_nodeptr_comp(KeyValueCompare kcomp, const RealValueTraits *traits)
-      :  base_t(kcomp), traits_(traits)
-   {}
-
-   template<class T>
-   struct is_node_ptr
-   {
-      static const bool value = is_same<T, const_node_ptr>::value || is_same<T, node_ptr>::value;
-   };
-
-   template<class T>
-   const value_type & key_forward
-      (const T &node, typename enable_if_c<is_node_ptr<T>::value>::type * = 0) const
-   {  return *traits_->to_value_ptr(node);  }
-
-   template<class T>
-   const T & key_forward(const T &key, typename enable_if_c<!is_node_ptr<T>::value>::type* = 0) const
-   {  return key;  }
-
-
-   template<class KeyType, class KeyType2>
-   bool operator()(const KeyType &key1, const KeyType2 &key2) const
-   {  return base_t::get()(this->key_forward(key1), this->key_forward(key2));  }
-
-   const RealValueTraits *traits_;
-};
-
-template<class F, class RealValueTraits, algo_types AlgoType>
-struct node_cloner
-   :  private detail::ebo_functor_holder<F>
-{
-   typedef RealValueTraits                         real_value_traits;
-   typedef typename real_value_traits::node_traits node_traits;
-   typedef typename node_traits::node_ptr          node_ptr;
-   typedef detail::ebo_functor_holder<F>           base_t;
-   typedef typename get_algo< AlgoType
-                            , node_traits>::type   node_algorithms;
-   static const bool safemode_or_autounlink =
-      is_safe_autounlink<real_value_traits::link_mode>::value;
-   typedef typename real_value_traits::value_type  value_type;
-   typedef typename real_value_traits::pointer     pointer;
-   typedef typename node_traits::node              node;
-   typedef typename real_value_traits::const_node_ptr    const_node_ptr;
-
-   node_cloner(F f, const RealValueTraits *traits)
-      :  base_t(f), traits_(traits)
-   {}
-
-   node_ptr operator()(const node_ptr & p)
-   {  return this->operator()(*p); }
-
-   node_ptr operator()(const node &to_clone)
-   {
-      const value_type &v =
-         *traits_->to_value_ptr
-            (pointer_traits<const_node_ptr>::pointer_to(to_clone));
-      node_ptr n = traits_->to_node_ptr(*base_t::get()(v));
-      //Cloned node must be in default mode if the linking mode requires it
-      if(safemode_or_autounlink)
-         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
-      return n;
-   }
-
-   const RealValueTraits *traits_;
-};
-
-template<class F, class RealValueTraits, algo_types AlgoType>
-struct node_disposer
-   :  private detail::ebo_functor_holder<F>
-{
-   typedef RealValueTraits                         real_value_traits;
-   typedef typename real_value_traits::node_traits node_traits;
-   typedef typename node_traits::node_ptr          node_ptr;
-   typedef detail::ebo_functor_holder<F>           base_t;
-   typedef typename get_algo< AlgoType
-                            , node_traits>::type   node_algorithms;
-   static const bool safemode_or_autounlink =
-      is_safe_autounlink<real_value_traits::link_mode>::value;
-
-   node_disposer(F f, const RealValueTraits *cont)
-      :  base_t(f), traits_(cont)
-   {}
-
-   void operator()(const node_ptr & p)
-   {
-      if(safemode_or_autounlink)
-         node_algorithms::init(p);
-      base_t::get()(traits_->to_value_ptr(p));
-   }
-   const RealValueTraits *traits_;
-};
-
-template<class VoidPointer>
-struct dummy_constptr
-{
-   typedef typename boost::intrusive::pointer_traits<VoidPointer>::
-      template rebind_pointer<const void>::type ConstVoidPtr;
-
-   explicit dummy_constptr(ConstVoidPtr)
-   {}
-
-   dummy_constptr()
-   {}
-
-   ConstVoidPtr get_ptr() const
-   {  return ConstVoidPtr();  }
-};
-
-template<class VoidPointer>
-struct constptr
-{
-   typedef typename boost::intrusive::pointer_traits<VoidPointer>::
-      template rebind_pointer<const void>::type ConstVoidPtr;
-
-   constptr()
-   {}
-
-   explicit constptr(const ConstVoidPtr &ptr)
-      :  const_void_ptr_(ptr)
-   {}
-
-   const void *get_ptr() const
-   {  return boost::intrusive::detail::to_raw_pointer(const_void_ptr_);  }
-
-   ConstVoidPtr const_void_ptr_;
-};
-
-template <class VoidPointer, bool store_ptr>
-struct select_constptr
-{
-   typedef typename detail::if_c
-      < store_ptr
-      , constptr<VoidPointer>
-      , dummy_constptr<VoidPointer>
-      >::type type;
-};
-
-template<class T, bool Add>
-struct add_const_if_c
-{
-   typedef typename detail::if_c
-      < Add
-      , typename detail::add_const<T>::type
-      , T
-      >::type type;
-};
-
-template <link_mode_type LinkMode>
-struct link_dispatch
-{};
-
-template<class Hook>
-void destructor_impl(Hook &hook, detail::link_dispatch<safe_link>)
-{  //If this assertion raises, you might have destroyed an object
-   //while it was still inserted in a container that is alive.
-   //If so, remove the object from the container before destroying it.
-   (void)hook; BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT(!hook.is_linked());
-}
-
-template<class Hook>
-void destructor_impl(Hook &hook, detail::link_dispatch<auto_unlink>)
-{  hook.unlink();  }
-
-template<class Hook>
-void destructor_impl(Hook &, detail::link_dispatch<normal_link>)
-{}
-
-//This function uses binary search to discover the
-//highest set bit of the integer
-inline std::size_t floor_log2 (std::size_t x)
-{
-   const std::size_t Bits = sizeof(std::size_t)*CHAR_BIT;
-   const bool Size_t_Bits_Power_2= !(Bits & (Bits-1));
-   BOOST_STATIC_ASSERT(Size_t_Bits_Power_2);
-
-   std::size_t n = x;
-   std::size_t log2 = 0;
-
-   for(std::size_t shift = Bits >> 1; shift; shift >>= 1){
-      std::size_t tmp = n >> shift;
-      if (tmp)
-         log2 += shift, n = tmp;
-   }
-
-   return log2;
-}
-
-//Thanks to Laurent de Soras in
-//http://www.flipcode.com/archives/Fast_log_Function.shtml
-inline float fast_log2 (float val)
-{
-   union caster_t
-   {
-      boost::uint32_t x;
-      float val;
-   } caster;
-
-   caster.val = val;
-   boost::uint32_t x = caster.x;
-   const int log_2 = int((x >> 23) & 255) - 128;
-   x &= ~(boost::uint32_t(255u) << 23u);
-   x += boost::uint32_t(127) << 23u;
-   caster.x = x;
-   val = caster.val;
-   //1+log2(m), m ranging from 1 to 2
-   //3rd degree polynomial keeping first derivate continuity.
-   //For less precision the line can be commented out
-   val = ((-1.0f/3.f) * val + 2.f) * val - (2.0f/3.f);
-   return (val + log_2);
-}
-
-inline std::size_t ceil_log2 (std::size_t x)
-{
-   return ((x & (x-1))!= 0) + floor_log2(x);
-}
-
-template<class SizeType, std::size_t N>
-struct numbits_eq
-{
-   static const bool value = sizeof(SizeType)*CHAR_BIT == N;
-};
-
-template<class SizeType, class Enabler = void >
-struct sqrt2_pow_max;
-
-template <class SizeType>
-struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 32> >::type>
-{
-   static const boost::uint32_t value = 0xb504f334;
-   static const std::size_t pow   = 31;
-};
-
-#ifndef BOOST_NO_INT64_T
-
-template <class SizeType>
-struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 64> >::type>
-{
-   static const boost::uint64_t value = 0xb504f333f9de6484ull;
-   static const std::size_t pow   = 63;
-};
-
-#endif   //BOOST_NO_INT64_T
-
-// Returns floor(pow(sqrt(2), x * 2 + 1)).
-// Defined for X from 0 up to the number of bits in size_t minus 1.
-inline std::size_t sqrt2_pow_2xplus1 (std::size_t x)
-{
-   const std::size_t value = (std::size_t)sqrt2_pow_max<std::size_t>::value;
-   const std::size_t pow   = (std::size_t)sqrt2_pow_max<std::size_t>::pow;
-   return (value >> (pow - x)) + 1;
-}
-
-template<class Container, class Disposer>
-class exception_disposer
-{
-   Container *cont_;
-   Disposer  &disp_;
-
-   exception_disposer(const exception_disposer&);
-   exception_disposer &operator=(const exception_disposer&);
-
-   public:
-   exception_disposer(Container &cont, Disposer &disp)
-      :  cont_(&cont), disp_(disp)
-   {}
-
-   void release()
-   {  cont_ = 0;  }
-
-   ~exception_disposer()
-   {
-      if(cont_){
-         cont_->clear_and_dispose(disp_);
-      }
-   }
-};
-
-template<class Container, class Disposer, class SizeType>
-class exception_array_disposer
-{
-   Container *cont_;
-   Disposer  &disp_;
-   SizeType  &constructed_;
-
-   exception_array_disposer(const exception_array_disposer&);
-   exception_array_disposer &operator=(const exception_array_disposer&);
-
-   public:
-
-   exception_array_disposer
-      (Container &cont, Disposer &disp, SizeType &constructed)
-      :  cont_(&cont), disp_(disp), constructed_(constructed)
-   {}
-
-   void release()
-   {  cont_ = 0;  }
-
-   ~exception_array_disposer()
-   {
-      SizeType n = constructed_;
-      if(cont_){
-         while(n--){
-            cont_[n].clear_and_dispose(disp_);
-         }
-      }
-   }
-};
-
-template<class RealValueTraits, bool IsConst>
-struct node_to_value
-   :  public detail::select_constptr
-      < typename pointer_traits
-            <typename RealValueTraits::pointer>::template rebind_pointer<void>::type
-      , is_stateful_value_traits<RealValueTraits>::value
-      >::type
-{
-   static const bool stateful_value_traits = is_stateful_value_traits<RealValueTraits>::value;
-   typedef typename detail::select_constptr
-      < typename pointer_traits
-            <typename RealValueTraits::pointer>::
-               template rebind_pointer<void>::type
-      , stateful_value_traits >::type                 Base;
-
-   typedef RealValueTraits                                  real_value_traits;
-   typedef typename real_value_traits::value_type           value_type;
-   typedef typename real_value_traits::node_traits::node    node;
-   typedef typename detail::add_const_if_c
-         <value_type, IsConst>::type                        vtype;
-   typedef typename detail::add_const_if_c
-         <node, IsConst>::type                              ntype;
-   typedef typename pointer_traits
-      <typename RealValueTraits::pointer>::
-         template rebind_pointer<ntype>::type               npointer;
-   typedef typename pointer_traits<npointer>::
-      template rebind_pointer<const RealValueTraits>::type  const_real_value_traits_ptr;
-
-   node_to_value(const const_real_value_traits_ptr &ptr)
-      :  Base(ptr)
-   {}
-
-   typedef vtype &                                 result_type;
-   typedef ntype &                                 first_argument_type;
-
-   const_real_value_traits_ptr get_real_value_traits() const
-   {
-      if(stateful_value_traits)
-         return pointer_traits<const_real_value_traits_ptr>::static_cast_from(Base::get_ptr());
-      else
-         return const_real_value_traits_ptr();
-   }
-
-   result_type operator()(first_argument_type arg) const
-   {
-      return *(this->get_real_value_traits()->to_value_ptr
-         (pointer_traits<npointer>::pointer_to(arg)));
-   }
-};
-
-//This is not standard, but should work with all compilers
-union max_align
-{
-   char        char_;
-   short       short_;
-   int         int_;
-   long        long_;
-   #ifdef BOOST_HAS_LONG_LONG
-   long long   long_long_;
-   #endif
-   float       float_;
-   double      double_;
-   long double long_double_;
-   void *      void_ptr_;
-};
-
-template<class T, std::size_t N>
-class array_initializer
-{
-   public:
-   template<class CommonInitializer>
-   array_initializer(const CommonInitializer &init)
-   {
-      char *init_buf = (char*)rawbuf;
-      std::size_t i = 0;
-      BOOST_TRY{
-         for(; i != N; ++i){
-            new(init_buf)T(init);
-            init_buf += sizeof(T);
-         }
-      }
-      BOOST_CATCH(...){
-         while(i--){
-            init_buf -= sizeof(T);
-            ((T*)init_buf)->~T();
-         }
-         BOOST_RETHROW;
-      }
-      BOOST_CATCH_END
-   }
-
-   operator T* ()
-   {  return (T*)(rawbuf);  }
-
-   operator const T*() const
-   {  return (const T*)(rawbuf);  }
-
-   ~array_initializer()
-   {
-      char *init_buf = (char*)rawbuf + N*sizeof(T);
-      for(std::size_t i = 0; i != N; ++i){
-         init_buf -= sizeof(T);
-         ((T*)init_buf)->~T();
-      }
-   }
-
-   private:
-   detail::max_align rawbuf[(N*sizeof(T)-1)/sizeof(detail::max_align)+1];
-};
-
-
-
-
-template<class It>
-class reverse_iterator
-	: public std::iterator<
-		typename std::iterator_traits<It>::iterator_category,
-		typename std::iterator_traits<It>::value_type,
-		typename std::iterator_traits<It>::difference_type,
-		typename std::iterator_traits<It>::pointer,
-		typename std::iterator_traits<It>::reference>
-{
-   public:
-	typedef typename std::iterator_traits<It>::pointer pointer;
-	typedef typename std::iterator_traits<It>::reference reference;
- 	typedef typename std::iterator_traits<It>::difference_type difference_type;
-	typedef It iterator_type;
-
-	reverse_iterator(){}
-
-	explicit reverse_iterator(It r)
-		: m_current(r)
-   {}
-
-	template<class OtherIt>
-	reverse_iterator(const reverse_iterator<OtherIt>& r)
-	   : m_current(r.base())
-	{}
-
-	It base() const
-   {  return m_current;  }
-
-	reference operator*() const
-   {  It temp(m_current);   --temp; return *temp; }
-
-	pointer operator->() const
-   {  It temp(m_current);   --temp; return temp.operator->(); }
-
-	reference operator[](difference_type off) const
-	{  return this->m_current[-off];  }
-
-	reverse_iterator& operator++()
-   {  --m_current;   return *this;   }
-
-	reverse_iterator operator++(int)
-	{
-		reverse_iterator temp = *this;
-		--m_current;
-		return temp;
-	}
-
-	reverse_iterator& operator--()
-	{
-	   ++m_current;
-		return *this;
-   }
-
-	reverse_iterator operator--(int)
-	{
-	   reverse_iterator temp(*this);
-	   ++m_current;
-	   return temp;
-	}
-
-	friend bool operator==(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current == r.m_current;  }
-
-	friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current != r.m_current;  }
-
-	friend bool operator<(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current < r.m_current;  }
-
-	friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current <= r.m_current;  }
-
-	friend bool operator>(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current > r.m_current;  }
-
-	friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r)
-	{  return l.m_current >= r.m_current;  }
-
-	reverse_iterator& operator+=(difference_type off)
-	{  m_current -= off; return *this;  }
-
-	friend reverse_iterator operator+(const reverse_iterator & l, difference_type off)
-	{
-      reverse_iterator tmp(l.m_current);
-      tmp.m_current -= off;
-      return tmp;
-   }
-
-	reverse_iterator& operator-=(difference_type off)
-	{  m_current += off; return *this;  }
-
-	friend reverse_iterator operator-(const reverse_iterator & l, difference_type off)
-	{
-      reverse_iterator tmp(l.m_current);
-      tmp.m_current += off;
-      return tmp;
-   }
-
-	friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
-	{  return r.m_current - l.m_current;  }
-
-   private:
-	It m_current;	// the wrapped iterator
-};
-
-template<class ConstNodePtr>
-struct uncast_types
-{
-   typedef typename pointer_traits<ConstNodePtr>::element_type element_type;
-   typedef typename remove_const<element_type>::type           non_const_type;
-   typedef typename pointer_traits<ConstNodePtr>::
-      template rebind_pointer<non_const_type>::type            non_const_pointer;
-   typedef pointer_traits<non_const_pointer>                   non_const_traits;
-};
-
-template<class ConstNodePtr>
-static typename uncast_types<ConstNodePtr>::non_const_pointer
-   uncast(const ConstNodePtr & ptr)
-{
-   return uncast_types<ConstNodePtr>::non_const_traits::const_cast_from(ptr);
-}
-
-} //namespace detail
-
-template<class Node, class Tag, unsigned int>
-struct node_holder
-   :  public Node
-{};
-
-template<class T, class NodePtr, class Tag, unsigned int Type>
-struct bhtraits_base
-{
-   public:
-   typedef NodePtr                                                   node_ptr;
-   typedef typename pointer_traits<node_ptr>::element_type           node;
-   typedef node_holder<node, Tag, Type>                              node_holder_type;
-   typedef T                                                         value_type;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const node>::type                      const_node_ptr;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<T>::type                               pointer;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const T>::type                         const_pointer;
-   //typedef typename pointer_traits<pointer>::reference               reference;
-   //typedef typename pointer_traits<const_pointer>::reference         const_reference;
-   typedef T &                                                       reference;
-   typedef const T &                                                 const_reference;
-   typedef node_holder_type &                                        node_holder_reference;
-   typedef const node_holder_type &                                  const_node_holder_reference;
-   typedef node&                                                     node_reference;
-   typedef const node &                                              const_node_reference;
-
-   static pointer to_value_ptr(const node_ptr & n)
-   {
-      return pointer_traits<pointer>::pointer_to
-         (static_cast<reference>(static_cast<node_holder_reference>(*n)));
-   }
-
-   static const_pointer to_value_ptr(const const_node_ptr & n)
-   {
-      return pointer_traits<const_pointer>::pointer_to
-         (static_cast<const_reference>(static_cast<const_node_holder_reference>(*n)));
-   }
-
-   static node_ptr to_node_ptr(reference value)
-   {
-      return pointer_traits<node_ptr>::pointer_to
-         (static_cast<node_reference>(static_cast<node_holder_reference>(value)));
-   }
-
-   static const_node_ptr to_node_ptr(const_reference value)
-   {
-      return pointer_traits<const_node_ptr>::pointer_to
-         (static_cast<const_node_reference>(static_cast<const_node_holder_reference>(value)));
-   }
-};
-
-template<class T, class NodeTraits, link_mode_type LinkMode, class Tag, unsigned int Type>
-struct bhtraits
-   : public bhtraits_base<T, typename NodeTraits::node_ptr, Tag, Type>
-{
-   static const link_mode_type link_mode = LinkMode;
-   typedef NodeTraits node_traits;
-};
-
-/*
-template<class T, class NodePtr, typename pointer_traits<NodePtr>::element_type T::* P>
-struct mhtraits_base
-{
-   public:
-   typedef typename pointer_traits<NodePtr>::element_type            node;
-   typedef T                                                         value_type;
-   typedef NodePtr                                                   node_ptr;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const node>::type                      const_node_ptr;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<T>::type                               pointer;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const T>::type                         const_pointer;
-   typedef T &                                                       reference;
-   typedef const T &                                                 const_reference;
-   typedef node&                                                     node_reference;
-   typedef const node &                                              const_node_reference;
-
-   static node_ptr to_node_ptr(reference value)
-   {
-      return pointer_traits<node_ptr>::pointer_to
-         (static_cast<node_reference>(value.*P));
-   }
-
-   static const_node_ptr to_node_ptr(const_reference value)
-   {
-      return pointer_traits<const_node_ptr>::pointer_to
-         (static_cast<const_node_reference>(value.*P));
-   }
-
-   static pointer to_value_ptr(const node_ptr & n)
-   {
-      return pointer_traits<pointer>::pointer_to
-         (*detail::parent_from_member<T, node>
-            (boost::intrusive::detail::to_raw_pointer(n), P));
-   }
-
-   static const_pointer to_value_ptr(const const_node_ptr & n)
-   {
-      return pointer_traits<const_pointer>::pointer_to
-         (*detail::parent_from_member<T, node>
-            (boost::intrusive::detail::to_raw_pointer(n), P));
-   }
-};
-
-
-template<class T, class NodeTraits, typename NodeTraits::node T::* P, link_mode_type LinkMode>
-struct mhtraits
-   : public mhtraits_base<T, typename NodeTraits::node_ptr, P>
-{
-   static const link_mode_type link_mode = LinkMode;
-   typedef NodeTraits node_traits;
-};
-*/
-
-
-template<class T, class Hook, Hook T::* P>
-struct mhtraits
-{
-   public:
-   typedef Hook                                                      hook_type;
-   typedef typename hook_type::hooktags::node_traits                 node_traits;
-   typedef typename node_traits::node                                node;
-   typedef T                                                         value_type;
-   typedef typename node_traits::node_ptr                            node_ptr;
-   typedef typename node_traits::const_node_ptr                      const_node_ptr;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<T>::type                               pointer;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const T>::type                         const_pointer;
-   typedef T &                                                       reference;
-   typedef const T &                                                 const_reference;
-   typedef node&                                                     node_reference;
-   typedef const node &                                              const_node_reference;
-   typedef hook_type&                                                hook_reference;
-   typedef const hook_type &                                         const_hook_reference;
-
-   static const link_mode_type link_mode = Hook::hooktags::link_mode;
-
-   static node_ptr to_node_ptr(reference value)
-   {
-      return pointer_traits<node_ptr>::pointer_to
-         (static_cast<node_reference>(static_cast<hook_reference>(value.*P)));
-   }
-
-   static const_node_ptr to_node_ptr(const_reference value)
-   {
-      return pointer_traits<const_node_ptr>::pointer_to
-         (static_cast<const_node_reference>(static_cast<const_hook_reference>(value.*P)));
-   }
-
-   static pointer to_value_ptr(const node_ptr & n)
-   {
-      return pointer_traits<pointer>::pointer_to
-         (*detail::parent_from_member<T, Hook>
-            (static_cast<Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
-   }
-
-   static const_pointer to_value_ptr(const const_node_ptr & n)
-   {
-      return pointer_traits<const_pointer>::pointer_to
-         (*detail::parent_from_member<T, Hook>
-            (static_cast<const Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
-   }
-};
-
-
-template<class Functor>
-struct fhtraits
-{
-   public:
-   typedef typename Functor::hook_type                               hook_type;
-   typedef typename Functor::hook_ptr                                hook_ptr;
-   typedef typename Functor::const_hook_ptr                          const_hook_ptr;
-   typedef typename hook_type::hooktags::node_traits                 node_traits;
-   typedef typename node_traits::node                                node;
-   typedef typename Functor::value_type                              value_type;
-   typedef typename node_traits::node_ptr                            node_ptr;
-   typedef typename node_traits::const_node_ptr                      const_node_ptr;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<value_type>::type                      pointer;
-   typedef typename pointer_traits<node_ptr>::
-      template rebind_pointer<const value_type>::type                const_pointer;
-   typedef value_type &                                              reference;
-   typedef const value_type &                                        const_reference;
-   static const link_mode_type link_mode = hook_type::hooktags::link_mode;
-
-   static node_ptr to_node_ptr(reference value)
-   {  return static_cast<node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
-
-   static const_node_ptr to_node_ptr(const_reference value)
-   {  return static_cast<const node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value)));  }
-
-   static pointer to_value_ptr(const node_ptr & n)
-   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
-
-   static const_pointer to_value_ptr(const const_node_ptr & n)
-   {  return Functor::to_value_ptr(to_hook_ptr(n));  }
-
-   private:
-   static hook_ptr to_hook_ptr(const node_ptr & n)
-   {  return hook_ptr(&*static_cast<hook_type*>(&*n));  }
-
-   static const_hook_ptr to_hook_ptr(const const_node_ptr & n)
-   {  return const_hook_ptr(&*static_cast<const hook_type*>(&*n));  }
-};
-
-template<class RealValueTraits, bool IsConst, class Category>
-struct iiterator
-{
-   typedef RealValueTraits                                     real_value_traits;
-   typedef typename real_value_traits::node_traits             node_traits;
-   typedef typename node_traits::node                          node;
-   typedef typename node_traits::node_ptr                      node_ptr;
-   typedef ::boost::intrusive::pointer_traits<node_ptr>        nodepointer_traits_t;
-   typedef typename nodepointer_traits_t::template
-      rebind_pointer<void>::type                               void_pointer;
-   typedef typename RealValueTraits::value_type                value_type;
-   typedef typename RealValueTraits::pointer                   nonconst_pointer;
-   typedef typename RealValueTraits::const_pointer             yesconst_pointer;
-   typedef typename ::boost::intrusive::pointer_traits
-      <nonconst_pointer>::reference                            nonconst_reference;
-   typedef typename ::boost::intrusive::pointer_traits
-      <yesconst_pointer>::reference                            yesconst_reference;
-   typedef typename nodepointer_traits_t::difference_type      difference_type;
-   typedef typename detail::if_c
-      <IsConst, yesconst_pointer, nonconst_pointer>::type      pointer;
-   typedef typename detail::if_c
-      <IsConst, yesconst_reference, nonconst_reference>::type  reference;
-   typedef std::iterator
-         < Category
-         , value_type
-         , difference_type
-         , pointer
-         , reference
-         > iterator_base;
-   static const bool stateful_value_traits =
-      detail::is_stateful_value_traits<real_value_traits>::value;
-};
-
-template<class NodePtr, bool StatefulValueTraits = true>
-struct iiterator_members
-{
-   typedef ::boost::intrusive::pointer_traits<NodePtr>   pointer_traits_t;
-   typedef typename pointer_traits_t::template
-      rebind_pointer<const void>::type                   const_void_pointer;
-
-   iiterator_members()
-   {}
-
-   iiterator_members(const NodePtr &n_ptr, const const_void_pointer &data)
-      :  nodeptr_(n_ptr), ptr_(data)
-   {}
-
-   const_void_pointer get_ptr() const
-   {  return ptr_;  }
-
-   NodePtr nodeptr_;
-   const_void_pointer ptr_;
-};
-
-template<class NodePtr>
-struct iiterator_members<NodePtr, false>
-{
-   typedef ::boost::intrusive::pointer_traits<NodePtr>   pointer_traits_t;
-   typedef typename pointer_traits_t::template
-      rebind_pointer<const void>::type                   const_void_pointer;
-
-   iiterator_members()
-   {}
-
-   iiterator_members(const NodePtr &n_ptr, const const_void_pointer &)
-      : nodeptr_(n_ptr)
-   {}
-
-   const_void_pointer get_ptr() const
-   {  return const_void_pointer();  }
-
-   NodePtr nodeptr_;
-};
-
-template<class Less, class T>
-struct get_less
-{
-   typedef Less type;
-};
-
-template<class T>
-struct get_less<void, T>
-{
-   typedef ::std::less<T> type;
-};
-
-template<class EqualTo, class T>
-struct get_equal_to
-{
-   typedef EqualTo type;
-};
-
-template<class T>
-struct get_equal_to<void, T>
-{
-   typedef ::std::equal_to<T> type;
-};
-
-template<class Hash, class T>
-struct get_hash
-{
-   typedef Hash type;
-};
-
-template<class T>
-struct get_hash<void, T>
-{
-   typedef ::boost::hash<T> type;
-};
-
-struct empty{};
-
-} //namespace intrusive
-} //namespace boost
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif //BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/pack_options.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,374 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2013-2013
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_PACK_OPTIONS_HPP
+#define BOOST_INTRUSIVE_PACK_OPTIONS_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+
+#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+
+template<class Prev, class Next>
+struct do_pack
+{
+   //Use "pack" member template to pack options
+   typedef typename Next::template pack<Prev> type;
+};
+
+template<class Prev>
+struct do_pack<Prev, void>
+{
+   //Avoid packing "void" to shorten template names
+   typedef Prev type;
+};
+
+template
+   < class DefaultOptions
+   , class O1         = void
+   , class O2         = void
+   , class O3         = void
+   , class O4         = void
+   , class O5         = void
+   , class O6         = void
+   , class O7         = void
+   , class O8         = void
+   , class O9         = void
+   , class O10        = void
+   , class O11        = void
+   >
+struct pack_options
+{
+   // join options
+   typedef
+      typename do_pack
+      <  typename do_pack
+         <  typename do_pack
+            <  typename do_pack
+               <  typename do_pack
+                  <  typename do_pack
+                     <  typename do_pack
+                        <  typename do_pack
+                           <  typename do_pack
+                              <  typename do_pack
+                                 <  typename do_pack
+                                    < DefaultOptions
+                                    , O1
+                                    >::type
+                                 , O2
+                                 >::type
+                              , O3
+                              >::type
+                           , O4
+                           >::type
+                        , O5
+                        >::type
+                     , O6
+                     >::type
+                  , O7
+                  >::type
+               , O8
+               >::type
+            , O9
+            >::type
+         , O10
+         >::type
+      , O11
+      >::type
+   type;
+};
+#else
+
+//index_tuple
+template<int... Indexes>
+struct index_tuple{};
+
+//build_number_seq
+template<std::size_t Num, typename Tuple = index_tuple<> >
+struct build_number_seq;
+
+template<std::size_t Num, int... Indexes>
+struct build_number_seq<Num, index_tuple<Indexes...> >
+   : build_number_seq<Num - 1, index_tuple<Indexes..., sizeof...(Indexes)> >
+{};
+
+template<int... Indexes>
+struct build_number_seq<0, index_tuple<Indexes...> >
+{  typedef index_tuple<Indexes...> type;  };
+
+template<class ...Types>
+struct typelist
+{};
+
+//invert_typelist
+template<class T>
+struct invert_typelist;
+
+template<int I, typename Tuple>
+struct typelist_element;
+
+template<int I, typename Head, typename... Tail>
+struct typelist_element<I, typelist<Head, Tail...> >
+{
+   typedef typename typelist_element<I-1, typelist<Tail...> >::type type;
+};
+
+template<typename Head, typename... Tail>
+struct typelist_element<0, typelist<Head, Tail...> >
+{
+   typedef Head type;
+};
+
+template<int ...Ints, class ...Types>
+typelist<typename typelist_element<(sizeof...(Types) - 1) - Ints, typelist<Types...> >::type...>
+   inverted_typelist(index_tuple<Ints...>, typelist<Types...>)
+{
+   return typelist<typename typelist_element<(sizeof...(Types) - 1) - Ints, typelist<Types...> >::type...>();
+}
+
+//sizeof_typelist
+template<class Typelist>
+struct sizeof_typelist;
+
+template<class ...Types>
+struct sizeof_typelist< typelist<Types...> >
+{
+   static const std::size_t value = sizeof...(Types);
+};
+
+//invert_typelist_impl
+template<class Typelist, class Indexes>
+struct invert_typelist_impl;
+
+
+template<class Typelist, int ...Ints>
+struct invert_typelist_impl< Typelist, index_tuple<Ints...> >
+{
+   static const std::size_t last_idx = sizeof_typelist<Typelist>::value - 1;
+   typedef typelist
+      <typename typelist_element<last_idx - Ints, Typelist>::type...> type;
+};
+
+template<class Typelist, int Int>
+struct invert_typelist_impl< Typelist, index_tuple<Int> >
+{
+   typedef Typelist type;
+};
+
+template<class Typelist>
+struct invert_typelist_impl< Typelist, index_tuple<> >
+{
+   typedef Typelist type;
+};
+
+//invert_typelist
+template<class Typelist>
+struct invert_typelist;
+
+template<class ...Types>
+struct invert_typelist< typelist<Types...> >
+{
+   typedef typelist<Types...> typelist_t;
+   typedef typename build_number_seq<sizeof...(Types)>::type indexes_t;
+   typedef typename invert_typelist_impl<typelist_t, indexes_t>::type type;
+};
+
+//Do pack
+template<class Typelist>
+struct do_pack;
+
+template<>
+struct do_pack<typelist<> >;
+
+template<class Prev>
+struct do_pack<typelist<Prev> >
+{
+   typedef Prev type;
+};
+
+template<class Prev, class Last>
+struct do_pack<typelist<Prev, Last> >
+{
+   typedef typename Prev::template pack<Last> type;
+};
+
+template<class Prev, class ...Others>
+struct do_pack<typelist<Prev, Others...> >
+{
+   typedef typename Prev::template pack
+      <typename do_pack<typelist<Others...> >::type> type;
+};
+
+
+template<class DefaultOptions, class ...Options>
+struct pack_options
+{
+   typedef typelist<DefaultOptions, Options...> typelist_t;
+   typedef typename invert_typelist<typelist_t>::type inverted_typelist;
+   typedef typename do_pack<inverted_typelist>::type type;
+};
+
+#endif   //!defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+
+#define BOOST_INTRUSIVE_OPTION_TYPE(OPTION_NAME, TYPE, TYPEDEF_EXPR, TYPEDEF_NAME) \
+template< class TYPE> \
+struct OPTION_NAME \
+{ \
+   template<class Base> \
+   struct pack : Base \
+   { \
+      typedef TYPEDEF_EXPR TYPEDEF_NAME; \
+   }; \
+}; \
+//
+
+#define BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME) \
+template< TYPE VALUE> \
+struct OPTION_NAME \
+{ \
+   template<class Base> \
+   struct pack : Base \
+   { \
+      static const TYPE CONSTANT_NAME = VALUE; \
+   }; \
+}; \
+//
+
+#else    //#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+//! This class is a utility that takes:
+//!   - a default options class defining initial static constant
+//!   and typedefs
+//!   - several options defined with BOOST_INTRUSIVE_OPTION_CONSTANT and
+//! BOOST_INTRUSIVE_OPTION_TYPE
+//!
+//! and packs them together in a new type that defines all options as
+//! member typedefs or static constant values. Given options of form:
+//!
+//! \code
+//!   BOOST_INTRUSIVE_OPTION_TYPE(my_pointer, VoidPointer, VoidPointer, my_pointer_type)
+//!   BOOST_INTRUSIVE_OPTION_CONSTANT(incremental, bool, Enabled, is_incremental)
+//! \endcode
+//!
+//! the following expression
+//!
+//! \code
+//!
+//! struct default_options
+//! {
+//!   typedef long      int_type;
+//!   static const int  int_constant = -1;
+//! };
+//!
+//! pack_options< default_options, my_pointer<void*>, incremental<true> >::type
+//! \endcode
+//!
+//! will create a type that will contain the following typedefs/constants
+//!
+//! \code
+//!   struct unspecified_type
+//!   {
+//!      //Default options
+//!      typedef long      int_type;
+//!      static const int  int_constant  = -1;
+//!
+//!      //Packed options (will ovewrite any default option)
+//!      typedef void*     my_pointer_type;
+//!      static const bool is_incremental = true;
+//!   };
+//! \endcode
+//!
+//! If an option is specified in the default options argument and later
+//! redefined as an option, the last definition will prevail.
+template<class DefaultOptions, class ...Options>
+struct pack_options
+{
+   typedef unspecified_type type;
+};
+
+//! Defines an option class of name OPTION_NAME that can be used to specify a type
+//! of type TYPE...
+//!
+//! \code
+//! struct OPTION_NAME<class TYPE>
+//! {  unspecified_content  };
+//! \endcode
+//!
+//! ...that after being combined with
+//! <code>boost::intrusive::pack_options</code>,
+//! will typedef TYPE as a typedef of name TYPEDEF_NAME. Example:
+//!
+//! \code
+//!   //[includes and namespaces omitted for brevity]
+//!
+//!   //This macro will create the following class:
+//!   //    template<class VoidPointer>
+//!   //    struct my_pointer
+//!   //    { unspecified_content };
+//!   BOOST_INTRUSIVE_OPTION_TYPE(my_pointer, VoidPointer, boost::remove_pointer<VoidPointer>::type, my_pointer_type)
+//!
+//!   struct empty_default{};
+//!
+//!   typedef pack_options< empty_default, typename my_pointer<void*> >::type::my_pointer_type type;
+//!
+//!   BOOST_STATIC_ASSERT(( boost::is_same<type, void>::value ));
+//!
+//! \endcode
+#define BOOST_INTRUSIVE_OPTION_TYPE(OPTION_NAME, TYPE, TYPEDEF_EXPR, TYPEDEF_NAME)
+
+//! Defines an option class of name OPTION_NAME that can be used to specify a constant
+//! of type TYPE with value VALUE...
+//!
+//! \code
+//! struct OPTION_NAME<TYPE VALUE>
+//! {  unspecified_content  };
+//! \endcode
+//!
+//! ...that after being combined with
+//! <code>boost::intrusive::pack_options</code>,
+//! will contain a CONSTANT_NAME static constant of value VALUE. Example:
+//!
+//! \code
+//!   //[includes and namespaces omitted for brevity]
+//!
+//!   //This macro will create the following class:
+//!   //    template<bool Enabled>
+//!   //    struct incremental
+//!   //    { unspecified_content };
+//!   BOOST_INTRUSIVE_OPTION_CONSTANT(incremental, bool, Enabled, is_incremental)
+//!
+//!   struct empty_default{};
+//!
+//!   const bool is_incremental = pack_options< empty_default, incremental<true> >::type::is_incremental;
+//!
+//!   BOOST_STATIC_ASSERT(( is_incremental == true ));
+//!
+//! \endcode
+#define BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME)
+
+#endif   //#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+
+}  //namespace intrusive {
+}  //namespace boost {
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_INTRUSIVE_PACK_OPTIONS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/intrusive/pointer_rebind.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,188 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_POINTER_REBIND_HPP
+#define BOOST_INTRUSIVE_POINTER_REBIND_HPP
+
+#ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
+#include <boost/intrusive/detail/workaround.hpp>
+#endif   //BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+namespace boost {
+namespace intrusive {
+
+///////////////////////////
+//struct pointer_rebind_mode
+///////////////////////////
+template <typename Ptr, typename U>
+struct pointer_has_rebind
+{
+   template <typename V> struct any
+   {  any(const V&) { } };
+
+   template <typename X>
+   static char test(int, typename X::template rebind<U>*);
+
+   template <typename X>
+   static int test(any<int>, void*);
+
+   static const bool value = (1 == sizeof(test<Ptr>(0, 0)));
+};
+
+template <typename Ptr, typename U>
+struct pointer_has_rebind_other
+{
+   template <typename V> struct any
+   {  any(const V&) { } };
+
+   template <typename X>
+   static char test(int, typename X::template rebind<U>::other*);
+
+   template <typename X>
+   static int test(any<int>, void*);
+
+   static const bool value = (1 == sizeof(test<Ptr>(0, 0)));
+};
+
+template <typename Ptr, typename U>
+struct pointer_rebind_mode
+{
+   static const unsigned int rebind =       (unsigned int)pointer_has_rebind<Ptr, U>::value;
+   static const unsigned int rebind_other = (unsigned int)pointer_has_rebind_other<Ptr, U>::value;
+   static const unsigned int mode =         rebind + rebind*rebind_other;
+};
+
+////////////////////////
+//struct pointer_rebinder
+////////////////////////
+template <typename Ptr, typename U, unsigned int RebindMode>
+struct pointer_rebinder;
+
+// Implementation of pointer_rebinder<U>::type if Ptr has
+// its own rebind<U>::other type (C++03)
+template <typename Ptr, typename U>
+struct pointer_rebinder< Ptr, U, 2u >
+{
+   typedef typename Ptr::template rebind<U>::other type;
+};
+
+// Implementation of pointer_rebinder<U>::type if Ptr has
+// its own rebind template.
+template <typename Ptr, typename U>
+struct pointer_rebinder< Ptr, U, 1u >
+{
+   typedef typename Ptr::template rebind<U> type;
+};
+
+// Specialization of pointer_rebinder if Ptr does not
+// have its own rebind template but has a the form Ptr<A, An...>,
+// where An... comprises zero or more type parameters.
+// Many types fit this form, hence many pointers will get a
+// reasonable default for rebind.
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+template <template <class, class...> class Ptr, typename A, class... An, class U>
+struct pointer_rebinder<Ptr<A, An...>, U, 0u >
+{
+   typedef Ptr<U, An...> type;
+};
+
+//Needed for non-conforming compilers like GCC 4.3
+template <template <class> class Ptr, typename A, class U>
+struct pointer_rebinder<Ptr<A>, U, 0u >
+{
+   typedef Ptr<U> type;
+};
+
+#else //C++03 compilers
+
+template <template <class> class Ptr  //0arg
+         , typename A
+         , class U>
+struct pointer_rebinder<Ptr<A>, U, 0u>
+{  typedef Ptr<U> type;   };
+
+template <template <class, class> class Ptr  //1arg
+         , typename A, class P0
+         , class U>
+struct pointer_rebinder<Ptr<A, P0>, U, 0u>
+{  typedef Ptr<U, P0> type;   };
+
+template <template <class, class, class> class Ptr  //2arg
+         , typename A, class P0, class P1
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1>, U, 0u>
+{  typedef Ptr<U, P0, P1> type;   };
+
+template <template <class, class, class, class> class Ptr  //3arg
+         , typename A, class P0, class P1, class P2
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2> type;   };
+
+template <template <class, class, class, class, class> class Ptr  //4arg
+         , typename A, class P0, class P1, class P2, class P3
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3> type;   };
+
+template <template <class, class, class, class, class, class> class Ptr  //5arg
+         , typename A, class P0, class P1, class P2, class P3, class P4
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3, P4>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3, P4> type;   };
+
+template <template <class, class, class, class, class, class, class> class Ptr  //6arg
+         , typename A, class P0, class P1, class P2, class P3, class P4, class P5
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3, P4, P5>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3, P4, P5> type;   };
+
+template <template <class, class, class, class, class, class, class, class> class Ptr  //7arg
+         , typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3, P4, P5, P6>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3, P4, P5, P6> type;   };
+
+template <template <class, class, class, class, class, class, class, class, class> class Ptr  //8arg
+         , typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3, P4, P5, P6, P7>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3, P4, P5, P6, P7> type;   };
+
+template <template <class, class, class, class, class, class, class, class, class, class> class Ptr  //9arg
+         , typename A, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8
+         , class U>
+struct pointer_rebinder<Ptr<A, P0, P1, P2, P3, P4, P5, P6, P7, P8>, U, 0u>
+{  typedef Ptr<U, P0, P1, P2, P3, P4, P5, P6, P7, P8> type;   };
+
+#endif   //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+template <typename Ptr, typename U>
+struct pointer_rebind
+   : public pointer_rebinder<Ptr, U, pointer_rebind_mode<Ptr, U>::mode>
+{};
+
+template <typename T, typename U>
+struct pointer_rebind<T*, U>
+{  typedef U* type; };
+
+}  //namespace container {
+}  //namespace boost {
+
+#endif // defined(BOOST_INTRUSIVE_POINTER_REBIND_HPP)
--- a/DEPENDENCIES/generic/include/boost/intrusive/splay_set_hook.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2013
-//
-// Distributed under the Boost Software License, Version 1.0.
-//    (See accompanying file LICENSE_1_0.txt or copy at
-//          http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-/////////////////////////////////////////////////////////////////////////////
-#ifndef BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP
-#define BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP
-
-#include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/intrusive/bs_set_hook.hpp>
-
-namespace boost {
-namespace intrusive {
-
-//! Helper metafunction to define a \c splay_set_base_hook that yields to the same
-//! type when the same options (either explicitly or implicitly) are used.
-//! <b>WARNING: </b> Deprecated class, use `make_bs_set_base_hook` instead.
-#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-template<class ...Options>
-#else
-template<class O1 = void, class O2 = void, class O3 = void>
-#endif
-struct make_splay_set_base_hook
-#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
-   #if defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-   : public make_bs_set_base_hook<Options...>
-   #else
-   : public make_bs_set_base_hook<O1, O2, O3>
-   #endif
-#endif
-{
-   /// @cond
-   typedef typename make_bs_set_base_hook
-      <
-         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-         O1, O2, O3
-         #else
-         Options...
-         #endif
-      >::type implementation_defined;
-   /// @endcond
-   typedef implementation_defined type;
-};
-
-//! Derive a class from splay_set_base_hook in order to store objects in
-//! in a splay_set/splay_multiset. splay_set_base_hook holds the data necessary to maintain
-//! the splay_set/splay_multiset and provides an appropriate value_traits class for splay_set/splay_multiset.
-//!
-//! The hook admits the following options: \c tag<>, \c void_pointer<>,
-//! \c link_mode<> and \c optimize_size<>.
-//!
-//! \c tag<> defines a tag to identify the node.
-//! The same tag value can be used in different classes, but if a class is
-//! derived from more than one \c list_base_hook, then each \c list_base_hook needs its
-//! unique tag.
-//!
-//! \c void_pointer<> is the pointer type that will be used internally in the hook
-//! and the the container configured to use this hook.
-//!
-//! \c link_mode<> will specify the linking mode of the hook (\c normal_link,
-//! \c auto_unlink or \c safe_link).
-//!
-//! <b>WARNING: </b> Deprecated class, use `bs_set_base_hook` instead.
-#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-template<class ...Options>
-#else
-template<class O1, class O2, class O3>
-#endif
-class splay_set_base_hook
-   :  public make_splay_set_base_hook<
-         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-         O1, O2, O3
-         #else
-         Options...
-         #endif
-      >::type
-{
-   #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
-   public:
-   //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
-   //!   initializes the node to an unlinked state.
-   //!
-   //! <b>Throws</b>: Nothing.
-   splay_set_base_hook();
-
-   //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
-   //!   initializes the node to an unlinked state. The argument is ignored.
-   //!
-   //! <b>Throws</b>: Nothing.
-   //!
-   //! <b>Rationale</b>: Providing a copy-constructor
-   //!   makes classes using the hook STL-compliant without forcing the
-   //!   user to do some additional work. \c swap can be used to emulate
-   //!   move-semantics.
-   splay_set_base_hook(const splay_set_base_hook& );
-
-   //! <b>Effects</b>: Empty function. The argument is ignored.
-   //!
-   //! <b>Throws</b>: Nothing.
-   //!
-   //! <b>Rationale</b>: Providing an assignment operator
-   //!   makes classes using the hook STL-compliant without forcing the
-   //!   user to do some additional work. \c swap can be used to emulate
-   //!   move-semantics.
-   splay_set_base_hook& operator=(const splay_set_base_hook& );
-
-   //! <b>Effects</b>: If link_mode is \c normal_link, the destructor does
-   //!   nothing (ie. no code is generated). If link_mode is \c safe_link and the
-   //!   object is stored in a set an assertion is raised. If link_mode is
-   //!   \c auto_unlink and \c is_linked() is true, the node is unlinked.
-   //!
-   //! <b>Throws</b>: Nothing.
-   ~splay_set_base_hook();
-
-   //! <b>Effects</b>: Swapping two nodes swaps the position of the elements
-   //!   related to those nodes in one or two containers. That is, if the node
-   //!   this is part of the element e1, the node x is part of the element e2
-   //!   and both elements are included in the containers s1 and s2, then after
-   //!   the swap-operation e1 is in s2 at the position of e2 and e2 is in s1
-   //!   at the position of e1. If one element is not in a container, then
-   //!   after the swap-operation the other element is not in a container.
-   //!   Iterators to e1 and e2 related to those nodes are invalidated.
-   //!
-   //! <b>Complexity</b>: Constant
-   //!
-   //! <b>Throws</b>: Nothing.
-   void swap_nodes(splay_set_base_hook &other);
-
-   //! <b>Precondition</b>: link_mode must be \c safe_link or \c auto_unlink.
-   //!
-   //! <b>Returns</b>: true, if the node belongs to a container, false
-   //!   otherwise. This function can be used to test whether \c set::iterator_to
-   //!   will return a valid iterator.
-   //!
-   //! <b>Complexity</b>: Constant
-   bool is_linked() const;
-
-   //! <b>Effects</b>: Removes the node if it's inserted in a container.
-   //!   This function is only allowed if link_mode is \c auto_unlink.
-   //!
-   //! <b>Throws</b>: Nothing.
-   void unlink();
-   #endif
-};
-
-//! Helper metafunction to define a \c splay_set_member_hook that yields to the same
-//! type when the same options (either explicitly or implicitly) are used.
-//!
-//! <b>WARNING: </b> Deprecated class, use `make_bs_set_member_hook` instead.
-#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-template<class ...Options>
-#else
-template<class O1 = void, class O2 = void, class O3 = void>
-#endif
-struct make_splay_set_member_hook
-#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
-   #if defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-   : public make_bs_set_member_hook<Options...>
-   #else
-   : public make_bs_set_member_hook<O1, O2, O3>
-   #endif
-#endif
-{
-   /// @cond
-   typedef typename make_bs_set_member_hook
-      <
-         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-         O1, O2, O3
-         #else
-         Options...
-         #endif
-      >::type implementation_defined;
-   /// @endcond
-   typedef implementation_defined type;
-};
-
-//! Put a public data member splay_set_member_hook in order to store objects of this
-//! class in a splay_set/splay_multiset. splay_set_member_hook holds the data
-//! necessary for maintaining the splay_set/splay_multiset and provides an appropriate
-//! value_traits class for splay_set/splay_multiset.
-//!
-//! The hook admits the following options: \c void_pointer<>,
-//! \c link_mode<> and \c optimize_size<>.
-//!
-//! \c void_pointer<> is the pointer type that will be used internally in the hook
-//! and the the container configured to use this hook.
-//!
-//! \c link_mode<> will specify the linking mode of the hook (\c normal_link,
-//! \c auto_unlink or \c safe_link).
-//!
-//! <b>WARNING: </b> Deprecated class, use `bs_set_member_hook` instead.
-#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-template<class ...Options>
-#else
-template<class O1, class O2, class O3>
-#endif
-class splay_set_member_hook
-   :  public make_splay_set_member_hook<
-         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-         O1, O2, O3
-         #else
-         Options...
-         #endif
-      >::type
-{
-   #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
-   public:
-   //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
-   //!   initializes the node to an unlinked state.
-   //!
-   //! <b>Throws</b>: Nothing.
-   splay_set_member_hook();
-
-   //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
-   //!   initializes the node to an unlinked state. The argument is ignored.
-   //!
-   //! <b>Throws</b>: Nothing.
-   //!
-   //! <b>Rationale</b>: Providing a copy-constructor
-   //!   makes classes using the hook STL-compliant without forcing the
-   //!   user to do some additional work. \c swap can be used to emulate
-   //!   move-semantics.
-   splay_set_member_hook(const splay_set_member_hook& );
-
-   //! <b>Effects</b>: Empty function. The argument is ignored.
-   //!
-   //! <b>Throws</b>: Nothing.
-   //!
-   //! <b>Rationale</b>: Providing an assignment operator
-   //!   makes classes using the hook STL-compliant without forcing the
-   //!   user to do some additional work. \c swap can be used to emulate
-   //!   move-semantics.
-   splay_set_member_hook& operator=(const splay_set_member_hook& );
-
-   //! <b>Effects</b>: If link_mode is \c normal_link, the destructor does
-   //!   nothing (ie. no code is generated). If link_mode is \c safe_link and the
-   //!   object is stored in a set an assertion is raised. If link_mode is
-   //!   \c auto_unlink and \c is_linked() is true, the node is unlinked.
-   //!
-   //! <b>Throws</b>: Nothing.
-   ~splay_set_member_hook();
-
-   //! <b>Effects</b>: Swapping two nodes swaps the position of the elements
-   //!   related to those nodes in one or two containers. That is, if the node
-   //!   this is part of the element e1, the node x is part of the element e2
-   //!   and both elements are included in the containers s1 and s2, then after
-   //!   the swap-operation e1 is in s2 at the position of e2 and e2 is in s1
-   //!   at the position of e1. If one element is not in a container, then
-   //!   after the swap-operation the other element is not in a container.
-   //!   Iterators to e1 and e2 related to those nodes are invalidated.
-   //!
-   //! <b>Complexity</b>: Constant
-   //!
-   //! <b>Throws</b>: Nothing.
-   void swap_nodes(splay_set_member_hook &other);
-
-   //! <b>Precondition</b>: link_mode must be \c safe_link or \c auto_unlink.
-   //!
-   //! <b>Returns</b>: true, if the node belongs to a container, false
-   //!   otherwise. This function can be used to test whether \c set::iterator_to
-   //!   will return a valid iterator.
-   //!
-   //! <b>Complexity</b>: Constant
-   bool is_linked() const;
-
-   //! <b>Effects</b>: Removes the node if it's inserted in a container.
-   //!   This function is only allowed if link_mode is \c auto_unlink.
-   //!
-   //! <b>Throws</b>: Nothing.
-   void unlink();
-   #endif
-};
-
-} //namespace intrusive
-} //namespace boost
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif //BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/iterator/minimum_category.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,95 @@
+// Copyright David Abrahams 2003. Use, modification and distribution is
+// subject to the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
+# define BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
+
+# include <boost/static_assert.hpp>
+# include <boost/type_traits/is_convertible.hpp>
+# include <boost/type_traits/is_same.hpp>
+
+# include <boost/mpl/placeholders.hpp>
+# include <boost/mpl/aux_/lambda_support.hpp>
+
+namespace boost {
+namespace iterators {
+namespace detail {
+
+template <bool GreaterEqual, bool LessEqual>
+struct minimum_category_impl;
+
+template <class T1, class T2>
+struct error_not_related_by_convertibility;
+
+template <>
+struct minimum_category_impl<true,false>
+{
+    template <class T1, class T2> struct apply
+    {
+        typedef T2 type;
+    };
+};
+
+template <>
+struct minimum_category_impl<false,true>
+{
+    template <class T1, class T2> struct apply
+    {
+        typedef T1 type;
+    };
+};
+
+template <>
+struct minimum_category_impl<true,true>
+{
+    template <class T1, class T2> struct apply
+    {
+        BOOST_STATIC_ASSERT((is_same<T1,T2>::value));
+        typedef T1 type;
+    };
+};
+
+template <>
+struct minimum_category_impl<false,false>
+{
+    template <class T1, class T2> struct apply
+      : error_not_related_by_convertibility<T1,T2>
+    {
+    };
+};
+
+} // namespace detail
+
+//
+// Returns the minimum category type or fails to compile
+// if T1 and T2 are unrelated.
+//
+template <class T1 = mpl::_1, class T2 = mpl::_2>
+struct minimum_category
+{
+    typedef boost::iterators::detail::minimum_category_impl<
+        ::boost::is_convertible<T1,T2>::value
+      , ::boost::is_convertible<T2,T1>::value
+    > outer;
+
+    typedef typename outer::template apply<T1,T2> inner;
+    typedef typename inner::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,minimum_category,(T1,T2))
+};
+
+template <>
+struct minimum_category<mpl::_1,mpl::_2>
+{
+    template <class T1, class T2>
+    struct apply : minimum_category<T1,T2>
+    {};
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,minimum_category,(mpl::_1,mpl::_2))
+};
+
+} // namespace iterators
+
+} // namespace boost
+
+#endif // BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/bad_lexical_cast.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,101 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
+#define BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#include <typeinfo>
+#include <exception>
+#include <boost/throw_exception.hpp>
+
+namespace boost
+{
+    // exception used to indicate runtime lexical_cast failure
+    class BOOST_SYMBOL_VISIBLE bad_lexical_cast :
+    // workaround MSVC bug with std::bad_cast when _HAS_EXCEPTIONS == 0 
+#if defined(BOOST_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS 
+        public std::exception 
+#else 
+        public std::bad_cast 
+#endif 
+
+#if defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x560 )
+        // under bcc32 5.5.1 bad_cast doesn't derive from exception
+        , public std::exception
+#endif
+
+    {
+    public:
+        bad_lexical_cast() BOOST_NOEXCEPT
+#ifndef BOOST_NO_TYPEID
+           : source(&typeid(void)), target(&typeid(void))
+#endif
+        {}
+
+        virtual const char *what() const BOOST_NOEXCEPT_OR_NOTHROW {
+            return "bad lexical cast: "
+                   "source type value could not be interpreted as target";
+        }
+
+        virtual ~bad_lexical_cast() BOOST_NOEXCEPT_OR_NOTHROW
+        {}
+
+#ifndef BOOST_NO_TYPEID
+        bad_lexical_cast(
+                const std::type_info &source_type_arg,
+                const std::type_info &target_type_arg) BOOST_NOEXCEPT
+            : source(&source_type_arg), target(&target_type_arg)
+        {}
+
+        const std::type_info &source_type() const BOOST_NOEXCEPT {
+            return *source;
+        }
+
+        const std::type_info &target_type() const BOOST_NOEXCEPT {
+            return *target;
+        }
+
+    private:
+        const std::type_info *source;
+        const std::type_info *target;
+#endif
+    };
+
+    namespace conversion { namespace detail {
+#ifdef BOOST_NO_TYPEID
+        template <class S, class T>
+        inline void throw_bad_cast() {
+            boost::throw_exception(bad_lexical_cast());
+        }
+#else
+        template <class S, class T>
+        inline void throw_bad_cast() {
+            boost::throw_exception(bad_lexical_cast(typeid(S), typeid(T)));
+        }
+#endif
+    }} // namespace conversion::detail
+
+
+} // namespace boost
+
+#endif // BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_lexical.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,495 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
+#define BOOST_LCAST_NO_WCHAR_T
+#endif
+
+#include <cstddef>
+#include <string>
+#include <boost/limits.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+#include <boost/type_traits/has_left_shift.hpp>
+#include <boost/type_traits/has_right_shift.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/lcast_precision.hpp>
+
+#include <boost/lexical_cast/detail/widest_char.hpp>
+#include <boost/lexical_cast/detail/is_character.hpp>
+
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+#include <array>
+#endif
+
+#include <boost/array.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/container/container_fwd.hpp>
+
+#include <boost/lexical_cast/detail/converter_lexical_streams.hpp>
+
+namespace boost {
+
+    namespace detail // normalize_single_byte_char<Char>
+    {
+        // Converts signed/unsigned char to char
+        template < class Char >
+        struct normalize_single_byte_char 
+        {
+            typedef Char type;
+        };
+
+        template <>
+        struct normalize_single_byte_char< signed char >
+        {
+            typedef char type;
+        };
+
+        template <>
+        struct normalize_single_byte_char< unsigned char >
+        {
+            typedef char type;
+        };
+    }
+
+    namespace detail // deduce_character_type_later<T>
+    {
+        // Helper type, meaning that stram character for T must be deduced 
+        // at Stage 2 (See deduce_source_char<T> and deduce_target_char<T>)
+        template < class T > struct deduce_character_type_later {};
+    }
+
+    namespace detail // stream_char_common<T>
+    {
+        // Selectors to choose stream character type (common for Source and Target)
+        // Returns one of char, wchar_t, char16_t, char32_t or deduce_character_type_later<T> types
+        // Executed on Stage 1 (See deduce_source_char<T> and deduce_target_char<T>)
+        template < typename Type >
+        struct stream_char_common: public boost::mpl::if_c<
+            boost::detail::is_character< Type >::value,
+            Type,
+            boost::detail::deduce_character_type_later< Type >
+        > {};
+
+        template < typename Char >
+        struct stream_char_common< Char* >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< Char* >
+        > {};
+
+        template < typename Char >
+        struct stream_char_common< const Char* >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< const Char* >
+        > {};
+
+        template < typename Char >
+        struct stream_char_common< boost::iterator_range< Char* > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< boost::iterator_range< Char* > >
+        > {};
+    
+        template < typename Char >
+        struct stream_char_common< boost::iterator_range< const Char* > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< boost::iterator_range< const Char* > >
+        > {};
+
+        template < class Char, class Traits, class Alloc >
+        struct stream_char_common< std::basic_string< Char, Traits, Alloc > >
+        {
+            typedef Char type;
+        };
+
+        template < class Char, class Traits, class Alloc >
+        struct stream_char_common< boost::container::basic_string< Char, Traits, Alloc > >
+        {
+            typedef Char type;
+        };
+
+        template < typename Char, std::size_t N >
+        struct stream_char_common< boost::array< Char, N > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< boost::array< Char, N > >
+        > {};
+
+        template < typename Char, std::size_t N >
+        struct stream_char_common< boost::array< const Char, N > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< boost::array< const Char, N > >
+        > {};
+
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+        template < typename Char, std::size_t N >
+        struct stream_char_common< std::array<Char, N > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< std::array< Char, N > >
+        > {};
+
+        template < typename Char, std::size_t N >
+        struct stream_char_common< std::array< const Char, N > >: public boost::mpl::if_c<
+            boost::detail::is_character< Char >::value,
+            Char,
+            boost::detail::deduce_character_type_later< std::array< const Char, N > >
+        > {};
+#endif
+
+#ifdef BOOST_HAS_INT128
+        template <> struct stream_char_common< boost::int128_type >: public boost::mpl::identity< char > {};
+        template <> struct stream_char_common< boost::uint128_type >: public boost::mpl::identity< char > {};
+#endif
+
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && defined(BOOST_NO_INTRINSIC_WCHAR_T)
+        template <>
+        struct stream_char_common< wchar_t >
+        {
+            typedef char type;
+        };
+#endif
+    }
+
+    namespace detail // deduce_source_char_impl<T>
+    {
+        // If type T is `deduce_character_type_later` type, then tries to deduce
+        // character type using boost::has_left_shift<T> metafunction.
+        // Otherwise supplied type T is a character type, that must be normalized
+        // using normalize_single_byte_char<Char>.
+        // Executed at Stage 2  (See deduce_source_char<T> and deduce_target_char<T>)
+        template < class Char > 
+        struct deduce_source_char_impl
+        { 
+            typedef BOOST_DEDUCED_TYPENAME boost::detail::normalize_single_byte_char< Char >::type type; 
+        };
+        
+        template < class T > 
+        struct deduce_source_char_impl< deduce_character_type_later< T > > 
+        {
+            typedef boost::has_left_shift< std::basic_ostream< char >, T > result_t;
+
+#if defined(BOOST_LCAST_NO_WCHAR_T)
+            BOOST_STATIC_ASSERT_MSG((result_t::value), 
+                "Source type is not std::ostream`able and std::wostream`s are not supported by your STL implementation");
+            typedef char type;
+#else
+            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                result_t::value, char, wchar_t
+            >::type type;
+
+            BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_left_shift< std::basic_ostream< type >, T >::value), 
+                "Source type is neither std::ostream`able nor std::wostream`able");
+#endif
+        };
+    }
+
+    namespace detail  // deduce_target_char_impl<T>
+    {
+        // If type T is `deduce_character_type_later` type, then tries to deduce
+        // character type using boost::has_right_shift<T> metafunction.
+        // Otherwise supplied type T is a character type, that must be normalized
+        // using normalize_single_byte_char<Char>.
+        // Executed at Stage 2  (See deduce_source_char<T> and deduce_target_char<T>)
+        template < class Char > 
+        struct deduce_target_char_impl 
+        { 
+            typedef BOOST_DEDUCED_TYPENAME normalize_single_byte_char< Char >::type type; 
+        };
+        
+        template < class T > 
+        struct deduce_target_char_impl< deduce_character_type_later<T> > 
+        { 
+            typedef boost::has_right_shift<std::basic_istream<char>, T > result_t;
+
+#if defined(BOOST_LCAST_NO_WCHAR_T)
+            BOOST_STATIC_ASSERT_MSG((result_t::value), 
+                "Target type is not std::istream`able and std::wistream`s are not supported by your STL implementation");
+            typedef char type;
+#else
+            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                result_t::value, char, wchar_t
+            >::type type;
+            
+            BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift<std::basic_istream<wchar_t>, T >::value), 
+                "Target type is neither std::istream`able nor std::wistream`able");
+#endif
+        };
+    } 
+
+    namespace detail  // deduce_target_char<T> and deduce_source_char<T>
+    {
+        // We deduce stream character types in two stages.
+        //
+        // Stage 1 is common for Target and Source. At Stage 1 we get 
+        // non normalized character type (may contain unsigned/signed char)
+        // or deduce_character_type_later<T> where T is the original type.
+        // Stage 1 is executed by stream_char_common<T>
+        //
+        // At Stage 2 we normalize character types or try to deduce character 
+        // type using metafunctions. 
+        // Stage 2 is executed by deduce_target_char_impl<T> and 
+        // deduce_source_char_impl<T>
+        //
+        // deduce_target_char<T> and deduce_source_char<T> functions combine 
+        // both stages
+
+        template < class T >
+        struct deduce_target_char
+        {
+            typedef BOOST_DEDUCED_TYPENAME stream_char_common< T >::type stage1_type;
+            typedef BOOST_DEDUCED_TYPENAME deduce_target_char_impl< stage1_type >::type stage2_type;
+
+            typedef stage2_type type;
+        };
+
+        template < class T >
+        struct deduce_source_char
+        {
+            typedef BOOST_DEDUCED_TYPENAME stream_char_common< T >::type stage1_type;
+            typedef BOOST_DEDUCED_TYPENAME deduce_source_char_impl< stage1_type >::type stage2_type;
+
+            typedef stage2_type type;
+        };
+    }
+
+    namespace detail // extract_char_traits template
+    {
+        // We are attempting to get char_traits<> from T
+        // template parameter. Otherwise we'll be using std::char_traits<Char>
+        template < class Char, class T >
+        struct extract_char_traits
+                : boost::false_type
+        {
+            typedef std::char_traits< Char > trait_t;
+        };
+
+        template < class Char, class Traits, class Alloc >
+        struct extract_char_traits< Char, std::basic_string< Char, Traits, Alloc > >
+            : boost::true_type
+        {
+            typedef Traits trait_t;
+        };
+
+        template < class Char, class Traits, class Alloc>
+        struct extract_char_traits< Char, boost::container::basic_string< Char, Traits, Alloc > >
+            : boost::true_type
+        {
+            typedef Traits trait_t;
+        };
+    }
+
+    namespace detail // array_to_pointer_decay<T>
+    {
+        template<class T>
+        struct array_to_pointer_decay
+        {
+            typedef T type;
+        };
+
+        template<class T, std::size_t N>
+        struct array_to_pointer_decay<T[N]>
+        {
+            typedef const T * type;
+        };
+    }
+    
+    namespace detail // lcast_src_length
+    {
+        // Return max. length of string representation of Source;
+        template< class Source,         // Source type of lexical_cast.
+                  class Enable = void   // helper type
+                >
+        struct lcast_src_length
+        {
+            BOOST_STATIC_CONSTANT(std::size_t, value = 1);
+        };
+
+        // Helper for integral types.
+        // Notes on length calculation:
+        // Max length for 32bit int with grouping "\1" and thousands_sep ',':
+        // "-2,1,4,7,4,8,3,6,4,7"
+        //  ^                    - is_signed
+        //   ^                   - 1 digit not counted by digits10
+        //    ^^^^^^^^^^^^^^^^^^ - digits10 * 2
+        //
+        // Constant is_specialized is used instead of constant 1
+        // to prevent buffer overflow in a rare case when
+        // <boost/limits.hpp> doesn't add missing specialization for
+        // numeric_limits<T> for some integral type T.
+        // When is_specialized is false, the whole expression is 0.
+        template <class Source>
+        struct lcast_src_length<
+                    Source, BOOST_DEDUCED_TYPENAME boost::enable_if<boost::is_integral<Source> >::type
+                >
+        {
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+            BOOST_STATIC_CONSTANT(std::size_t, value =
+                  std::numeric_limits<Source>::is_signed +
+                  std::numeric_limits<Source>::is_specialized + /* == 1 */
+                  std::numeric_limits<Source>::digits10 * 2
+              );
+#else
+            BOOST_STATIC_CONSTANT(std::size_t, value = 156);
+            BOOST_STATIC_ASSERT(sizeof(Source) * CHAR_BIT <= 256);
+#endif
+        };
+
+#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+        // Helper for floating point types.
+        // -1.23456789e-123456
+        // ^                   sign
+        //  ^                  leading digit
+        //   ^                 decimal point 
+        //    ^^^^^^^^         lcast_precision<Source>::value
+        //            ^        "e"
+        //             ^       exponent sign
+        //              ^^^^^^ exponent (assumed 6 or less digits)
+        // sign + leading digit + decimal point + "e" + exponent sign == 5
+        template<class Source>
+        struct lcast_src_length<
+                Source, BOOST_DEDUCED_TYPENAME boost::enable_if<boost::is_float<Source> >::type
+            >
+        {
+            BOOST_STATIC_ASSERT(
+                    std::numeric_limits<Source>::max_exponent10 <=  999999L &&
+                    std::numeric_limits<Source>::min_exponent10 >= -999999L
+                );
+
+            BOOST_STATIC_CONSTANT(std::size_t, value =
+                    5 + lcast_precision<Source>::value + 6
+                );
+        };
+#endif // #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+    }
+
+    namespace detail // lexical_cast_stream_traits<Source, Target>
+    {
+        template <class Source, class Target>
+        struct lexical_cast_stream_traits {
+            typedef BOOST_DEDUCED_TYPENAME boost::detail::array_to_pointer_decay<Source>::type src;
+            typedef BOOST_DEDUCED_TYPENAME boost::remove_cv<src>::type            no_cv_src;
+                
+            typedef boost::detail::deduce_source_char<no_cv_src>                           deduce_src_char_metafunc;
+            typedef BOOST_DEDUCED_TYPENAME deduce_src_char_metafunc::type           src_char_t;
+            typedef BOOST_DEDUCED_TYPENAME boost::detail::deduce_target_char<Target>::type target_char_t;
+                
+            typedef BOOST_DEDUCED_TYPENAME boost::detail::widest_char<
+                target_char_t, src_char_t
+            >::type char_type;
+
+#if !defined(BOOST_NO_CXX11_CHAR16_T) && defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            BOOST_STATIC_ASSERT_MSG(( !boost::is_same<char16_t, src_char_t>::value
+                                        && !boost::is_same<char16_t, target_char_t>::value),
+                "Your compiler does not have full support for char16_t" );
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T) && defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            BOOST_STATIC_ASSERT_MSG(( !boost::is_same<char32_t, src_char_t>::value
+                                        && !boost::is_same<char32_t, target_char_t>::value),
+                "Your compiler does not have full support for char32_t" );
+#endif
+
+            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                boost::detail::extract_char_traits<char_type, Target>::value,
+                BOOST_DEDUCED_TYPENAME boost::detail::extract_char_traits<char_type, Target>,
+                BOOST_DEDUCED_TYPENAME boost::detail::extract_char_traits<char_type, no_cv_src>
+            >::type::trait_t traits;
+
+            typedef boost::type_traits::ice_and<
+                boost::is_same<char, src_char_t>::value,                                  // source is not a wide character based type
+                boost::type_traits::ice_ne<sizeof(char), sizeof(target_char_t) >::value,  // target type is based on wide character
+                boost::type_traits::ice_not<
+                    boost::detail::is_character<no_cv_src>::value                     // single character widening is optimized
+                >::value                                                                  // and does not requires stringbuffer
+            >   is_string_widening_required_t;
+
+            typedef boost::type_traits::ice_not< boost::type_traits::ice_or<
+                boost::is_integral<no_cv_src>::value,
+                boost::detail::is_character<
+                    BOOST_DEDUCED_TYPENAME deduce_src_char_metafunc::stage1_type          // if we did not get character type at stage1
+                >::value                                                                  // then we have no optimization for that type
+            >::value >   is_source_input_not_optimized_t;
+
+            // If we have an optimized conversion for
+            // Source, we do not need to construct stringbuf.
+            BOOST_STATIC_CONSTANT(bool, requires_stringbuf = 
+                (boost::type_traits::ice_or<
+                    is_string_widening_required_t::value, is_source_input_not_optimized_t::value
+                >::value)
+            );
+            
+            typedef boost::detail::lcast_src_length<no_cv_src> len_t;
+        };
+    }
+ 
+    namespace detail
+    {
+        template<typename Target, typename Source>
+        struct lexical_converter_impl
+        {
+            typedef lexical_cast_stream_traits<Source, Target>  stream_trait;
+
+            typedef detail::lexical_istream_limited_src<
+                BOOST_DEDUCED_TYPENAME stream_trait::char_type,
+                BOOST_DEDUCED_TYPENAME stream_trait::traits,
+                stream_trait::requires_stringbuf,
+                stream_trait::len_t::value + 1
+            > i_interpreter_type;
+
+            typedef detail::lexical_ostream_limited_src<
+                BOOST_DEDUCED_TYPENAME stream_trait::char_type,
+                BOOST_DEDUCED_TYPENAME stream_trait::traits
+            > o_interpreter_type;
+
+            static inline bool try_convert(const Source& arg, Target& result) {
+                i_interpreter_type i_interpreter;
+
+                // Disabling ADL, by directly specifying operators.
+                if (!(i_interpreter.operator <<(arg)))
+                    return false;
+
+                o_interpreter_type out(i_interpreter.cbegin(), i_interpreter.cend());
+
+                // Disabling ADL, by directly specifying operators.
+                if(!(out.operator >>(result)))
+                    return false;
+
+                return true;
+            }
+        };
+    }
+
+} // namespace boost
+
+#undef BOOST_LCAST_NO_WCHAR_T
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_lexical_streams.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,788 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_STREAMS_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_STREAMS_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
+#define BOOST_LCAST_NO_WCHAR_T
+#endif
+
+#include <cstddef>
+#include <string>
+#include <cstring>
+#include <cstdio>
+#include <boost/limits.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/workaround.hpp>
+
+
+#ifndef BOOST_NO_STD_LOCALE
+#   include <locale>
+#else
+#   ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+        // Getting error at this point means, that your STL library is old/lame/misconfigured.
+        // If nothing can be done with STL library, define BOOST_LEXICAL_CAST_ASSUME_C_LOCALE,
+        // but beware: lexical_cast will understand only 'C' locale delimeters and thousands
+        // separators.
+#       error "Unable to use <locale> header. Define BOOST_LEXICAL_CAST_ASSUME_C_LOCALE to force "
+#       error "boost::lexical_cast to use only 'C' locale during conversions."
+#   endif
+#endif
+
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#else
+#include <sstream>
+#endif
+
+#include <boost/lexical_cast/detail/lcast_char_constants.hpp>
+#include <boost/lexical_cast/detail/lcast_unsigned_converters.hpp>
+#include <boost/lexical_cast/detail/inf_nan.hpp>
+
+#include <istream>
+
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+#include <array>
+#endif
+
+#include <boost/array.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/integer.hpp>
+#include <boost/detail/basic_pointerbuf.hpp>
+#include <boost/noncopyable.hpp>
+#ifndef BOOST_NO_CWCHAR
+#   include <cwchar>
+#endif
+
+namespace boost {
+
+    namespace detail // basic_unlockedbuf
+    {
+        // acts as a stream buffer which wraps around a pair of pointers
+        // and gives acces to internals
+        template <class BufferType, class CharT>
+        class basic_unlockedbuf : public basic_pointerbuf<CharT, BufferType> {
+        public:
+           typedef basic_pointerbuf<CharT, BufferType> base_type;
+           typedef BOOST_DEDUCED_TYPENAME base_type::streamsize streamsize;
+
+#ifndef BOOST_NO_USING_TEMPLATE
+            using base_type::pptr;
+            using base_type::pbase;
+            using base_type::setbuf;
+#else
+            charT* pptr() const { return base_type::pptr(); }
+            charT* pbase() const { return base_type::pbase(); }
+            BufferType* setbuf(char_type* s, streamsize n) { return base_type::setbuf(s, n); }
+#endif
+        };
+    }
+
+    namespace detail
+    {
+        struct do_not_construct_out_stream_t{};
+        
+        template <class CharT, class Traits>
+        struct out_stream_helper_trait {
+#if defined(BOOST_NO_STRINGSTREAM)
+            typedef std::ostrstream                                 out_stream_t;
+            typedef void                                            buffer_t;
+#elif defined(BOOST_NO_STD_LOCALE)
+            typedef std::ostringstream                              out_stream_t;
+            typedef basic_unlockedbuf<std::streambuf, char>         buffer_t;
+#else
+            typedef std::basic_ostringstream<CharT, Traits> 
+                out_stream_t;
+            typedef basic_unlockedbuf<std::basic_streambuf<CharT, Traits>, CharT>  
+                buffer_t;
+#endif
+        };   
+    }
+
+    namespace detail // optimized stream wrappers
+    {
+        template< class CharT // a result of widest_char transformation
+                , class Traits
+                , bool RequiresStringbuffer
+                , std::size_t CharacterBufferSize
+                >
+        class lexical_istream_limited_src: boost::noncopyable {
+            typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::buffer_t
+                buffer_t;
+
+            typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::out_stream_t
+                out_stream_t;
+    
+            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                RequiresStringbuffer,
+                out_stream_t,
+                do_not_construct_out_stream_t
+            >::type deduced_out_stream_t;
+
+            // A string representation of Source is written to `buffer`.
+            deduced_out_stream_t out_stream;
+            CharT   buffer[CharacterBufferSize];
+
+            // After the `operator <<`  finishes, `[start, finish)` is
+            // the range to output by `operator >>` 
+            const CharT*  start;
+            const CharT*  finish;
+
+        public:
+            lexical_istream_limited_src() BOOST_NOEXCEPT
+              : start(buffer)
+              , finish(buffer + CharacterBufferSize)
+            {}
+    
+            const CharT* cbegin() const BOOST_NOEXCEPT {
+                return start;
+            }
+
+            const CharT* cend() const BOOST_NOEXCEPT {
+                return finish;
+            }
+
+        private:
+            // Undefined:
+            lexical_istream_limited_src(lexical_istream_limited_src const&);
+            void operator=(lexical_istream_limited_src const&);
+
+/************************************ HELPER FUNCTIONS FOR OPERATORS << ( ... ) ********************************/
+            bool shl_char(CharT ch) BOOST_NOEXCEPT {
+                Traits::assign(buffer[0], ch);
+                finish = start + 1;
+                return true;
+            }
+
+#ifndef BOOST_LCAST_NO_WCHAR_T
+            template <class T>
+            bool shl_char(T ch) {
+                BOOST_STATIC_ASSERT_MSG(( sizeof(T) <= sizeof(CharT)) ,
+                    "boost::lexical_cast does not support narrowing of char types."
+                    "Use boost::locale instead" );
+#ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+                std::locale loc;
+                CharT const w = BOOST_USE_FACET(std::ctype<CharT>, loc).widen(ch);
+#else
+                CharT const w = static_cast<CharT>(ch);
+#endif
+                Traits::assign(buffer[0], w);
+                finish = start + 1;
+                return true;
+            }
+#endif
+
+            bool shl_char_array(CharT const* str) BOOST_NOEXCEPT {
+                start = str;
+                finish = start + Traits::length(str);
+                return true;
+            }
+
+            template <class T>
+            bool shl_char_array(T const* str) {
+                BOOST_STATIC_ASSERT_MSG(( sizeof(T) <= sizeof(CharT)),
+                    "boost::lexical_cast does not support narrowing of char types."
+                    "Use boost::locale instead" );
+                return shl_input_streamable(str);
+            }
+            
+            bool shl_char_array_limited(CharT const* str, std::size_t max_size) BOOST_NOEXCEPT {
+                start = str;
+                finish = std::find(start, start + max_size, Traits::to_char_type(0));
+                return true;
+            }
+
+            template<typename InputStreamable>
+            bool shl_input_streamable(InputStreamable& input) {
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_LOCALE)
+                // If you have compilation error at this point, than your STL library
+                // does not support such conversions. Try updating it.
+                BOOST_STATIC_ASSERT((boost::is_same<char, CharT>::value));
+#endif
+
+#ifndef BOOST_NO_EXCEPTIONS
+                out_stream.exceptions(std::ios::badbit);
+                try {
+#endif
+                bool const result = !(out_stream << input).fail();
+                const buffer_t* const p = static_cast<buffer_t*>(
+                    static_cast<std::basic_streambuf<CharT, Traits>*>(out_stream.rdbuf())
+                );
+                start = p->pbase();
+                finish = p->pptr();
+                return result;
+#ifndef BOOST_NO_EXCEPTIONS
+                } catch (const ::std::ios_base::failure& /*f*/) {
+                    return false;
+                }
+#endif
+            }
+
+            template <class T>
+            inline bool shl_unsigned(const T n) {
+                CharT* tmp_finish = buffer + CharacterBufferSize;
+                start = lcast_put_unsigned<Traits, T, CharT>(n, tmp_finish).convert();
+                finish = tmp_finish;
+                return true;
+            }
+
+            template <class T>
+            inline bool shl_signed(const T n) {
+                CharT* tmp_finish = buffer + CharacterBufferSize;
+                typedef BOOST_DEDUCED_TYPENAME boost::make_unsigned<T>::type utype;
+                CharT* tmp_start = lcast_put_unsigned<Traits, utype, CharT>(lcast_to_unsigned(n), tmp_finish).convert();
+                if (n < 0) {
+                    --tmp_start;
+                    CharT const minus = lcast_char_constants<CharT>::minus;
+                    Traits::assign(*tmp_start, minus);
+                }
+                start = tmp_start;
+                finish = tmp_finish;
+                return true;
+            }
+
+            template <class T, class SomeCharT>
+            bool shl_real_type(const T& val, SomeCharT* /*begin*/) {
+                lcast_set_precision(out_stream, &val);
+                return shl_input_streamable(val);
+            }
+
+            bool shl_real_type(float val, char* begin) {
+                using namespace std;
+                const double val_as_double = val;
+                finish = start +
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+                    sprintf_s(begin, CharacterBufferSize,
+#else
+                    sprintf(begin, 
+#endif
+                    "%.*g", static_cast<int>(boost::detail::lcast_get_precision<float>()), val_as_double);
+                return finish > start;
+            }
+
+            bool shl_real_type(double val, char* begin) {
+                using namespace std;
+                finish = start +
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+                    sprintf_s(begin, CharacterBufferSize,
+#else
+                    sprintf(begin, 
+#endif
+                    "%.*g", static_cast<int>(boost::detail::lcast_get_precision<double>()), val);
+                return finish > start;
+            }
+
+#ifndef __MINGW32__
+            bool shl_real_type(long double val, char* begin) {
+                using namespace std;
+                finish = start +
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+                    sprintf_s(begin, CharacterBufferSize,
+#else
+                    sprintf(begin, 
+#endif
+                    "%.*Lg", static_cast<int>(boost::detail::lcast_get_precision<long double>()), val );
+                return finish > start;
+            }
+#endif
+
+
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_SWPRINTF) && !defined(__MINGW32__)
+            bool shl_real_type(float val, wchar_t* begin) {
+                using namespace std;
+                const double val_as_double = val;
+                finish = start + swprintf(begin, CharacterBufferSize,
+                                       L"%.*g",
+                                       static_cast<int>(boost::detail::lcast_get_precision<float >()),
+                                       val_as_double );
+                return finish > start;
+            }
+
+            bool shl_real_type(double val, wchar_t* begin) {
+                using namespace std;
+                finish = start + swprintf(begin, CharacterBufferSize,
+                                          L"%.*g", static_cast<int>(boost::detail::lcast_get_precision<double >()), val );
+                return finish > start;
+            }
+
+            bool shl_real_type(long double val, wchar_t* begin) {
+                using namespace std;
+                finish = start + swprintf(begin, CharacterBufferSize,
+                                          L"%.*Lg", static_cast<int>(boost::detail::lcast_get_precision<long double >()), val );
+                return finish > start;
+            }
+#endif
+            template <class T>
+            bool shl_real(T val) {
+                CharT* tmp_finish = buffer + CharacterBufferSize;
+                if (put_inf_nan(buffer, tmp_finish, val)) {
+                    finish = tmp_finish;
+                    return true;
+                }
+
+                return shl_real_type(val, static_cast<CharT*>(buffer));
+            }
+
+/************************************ OPERATORS << ( ... ) ********************************/
+        public:
+            template<class Alloc>
+            bool operator<<(std::basic_string<CharT,Traits,Alloc> const& str) BOOST_NOEXCEPT {
+                start = str.data();
+                finish = start + str.length();
+                return true;
+            }
+
+            template<class Alloc>
+            bool operator<<(boost::container::basic_string<CharT,Traits,Alloc> const& str) BOOST_NOEXCEPT {
+                start = str.data();
+                finish = start + str.length();
+                return true;
+            }
+
+            bool operator<<(bool value) BOOST_NOEXCEPT {
+                CharT const czero = lcast_char_constants<CharT>::zero;
+                Traits::assign(buffer[0], Traits::to_char_type(czero + value));
+                finish = start + 1;
+                return true;
+            }
+
+            template <class C>
+            BOOST_DEDUCED_TYPENAME boost::disable_if<boost::is_const<C>, bool>::type 
+            operator<<(const iterator_range<C*>& rng) BOOST_NOEXCEPT {
+                return (*this) << iterator_range<const C*>(rng.begin(), rng.end());
+            }
+            
+            bool operator<<(const iterator_range<const CharT*>& rng) BOOST_NOEXCEPT {
+                start = rng.begin();
+                finish = rng.end();
+                return true; 
+            }
+
+            bool operator<<(const iterator_range<const signed char*>& rng) BOOST_NOEXCEPT {
+                return (*this) << iterator_range<const char*>(
+                    reinterpret_cast<const char*>(rng.begin()),
+                    reinterpret_cast<const char*>(rng.end())
+                );
+            }
+
+            bool operator<<(const iterator_range<const unsigned char*>& rng) BOOST_NOEXCEPT {
+                return (*this) << iterator_range<const char*>(
+                    reinterpret_cast<const char*>(rng.begin()),
+                    reinterpret_cast<const char*>(rng.end())
+                );
+            }
+
+            bool operator<<(char ch)                    { return shl_char(ch); }
+            bool operator<<(unsigned char ch)           { return ((*this) << static_cast<char>(ch)); }
+            bool operator<<(signed char ch)             { return ((*this) << static_cast<char>(ch)); }
+#if !defined(BOOST_LCAST_NO_WCHAR_T)
+            bool operator<<(wchar_t const* str)         { return shl_char_array(str); }
+            bool operator<<(wchar_t * str)              { return shl_char_array(str); }
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+            bool operator<<(wchar_t ch)                 { return shl_char(ch); }
+#endif
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            bool operator<<(char16_t ch)                { return shl_char(ch); }
+            bool operator<<(char16_t * str)             { return shl_char_array(str); }
+            bool operator<<(char16_t const * str)       { return shl_char_array(str); }
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            bool operator<<(char32_t ch)                { return shl_char(ch); }
+            bool operator<<(char32_t * str)             { return shl_char_array(str); }
+            bool operator<<(char32_t const * str)       { return shl_char_array(str); }
+#endif
+            bool operator<<(unsigned char const* ch)    { return ((*this) << reinterpret_cast<char const*>(ch)); }
+            bool operator<<(unsigned char * ch)         { return ((*this) << reinterpret_cast<char *>(ch)); }
+            bool operator<<(signed char const* ch)      { return ((*this) << reinterpret_cast<char const*>(ch)); }
+            bool operator<<(signed char * ch)           { return ((*this) << reinterpret_cast<char *>(ch)); }
+            bool operator<<(char const* str)            { return shl_char_array(str); }
+            bool operator<<(char* str)                  { return shl_char_array(str); }
+            bool operator<<(short n)                    { return shl_signed(n); }
+            bool operator<<(int n)                      { return shl_signed(n); }
+            bool operator<<(long n)                     { return shl_signed(n); }
+            bool operator<<(unsigned short n)           { return shl_unsigned(n); }
+            bool operator<<(unsigned int n)             { return shl_unsigned(n); }
+            bool operator<<(unsigned long n)            { return shl_unsigned(n); }
+
+#if defined(BOOST_HAS_LONG_LONG)
+            bool operator<<(boost::ulong_long_type n)   { return shl_unsigned(n); }
+            bool operator<<(boost::long_long_type n)    { return shl_signed(n); }
+#elif defined(BOOST_HAS_MS_INT64)
+            bool operator<<(unsigned __int64 n)         { return shl_unsigned(n); }
+            bool operator<<(         __int64 n)         { return shl_signed(n); }
+#endif
+
+#ifdef BOOST_HAS_INT128
+            bool operator<<(const boost::uint128_type& n)   { return shl_unsigned(n); }
+            bool operator<<(const boost::int128_type& n)    { return shl_signed(n); }
+#endif
+            bool operator<<(float val)                  { return shl_real(val); }
+            bool operator<<(double val)                 { return shl_real(val); }
+            bool operator<<(long double val)            {
+#ifndef __MINGW32__
+                return shl_real(val);
+#else
+                return shl_real(static_cast<double>(val));
+#endif
+            }
+            
+            // Adding constness to characters. Constness does not change layout
+            template <class C, std::size_t N>
+            BOOST_DEDUCED_TYPENAME boost::disable_if<boost::is_const<C>, bool>::type
+            operator<<(boost::array<C, N> const& input) BOOST_NOEXCEPT { 
+                BOOST_STATIC_ASSERT_MSG(
+                    (sizeof(boost::array<const C, N>) == sizeof(boost::array<C, N>)),
+                    "boost::array<C, N> and boost::array<const C, N> must have exactly the same layout."
+                );
+                return ((*this) << reinterpret_cast<boost::array<const C, N> const& >(input)); 
+            }
+
+            template <std::size_t N>
+            bool operator<<(boost::array<const CharT, N> const& input) BOOST_NOEXCEPT { 
+                return shl_char_array_limited(input.begin(), N); 
+            }
+
+            template <std::size_t N>
+            bool operator<<(boost::array<const unsigned char, N> const& input) BOOST_NOEXCEPT { 
+                return ((*this) << reinterpret_cast<boost::array<const char, N> const& >(input)); 
+            }
+
+            template <std::size_t N>
+            bool operator<<(boost::array<const signed char, N> const& input) BOOST_NOEXCEPT { 
+                return ((*this) << reinterpret_cast<boost::array<const char, N> const& >(input)); 
+            }
+ 
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+            // Making a Boost.Array from std::array
+            template <class C, std::size_t N>
+            bool operator<<(std::array<C, N> const& input) BOOST_NOEXCEPT { 
+                BOOST_STATIC_ASSERT_MSG(
+                    (sizeof(std::array<C, N>) == sizeof(boost::array<C, N>)),
+                    "std::array and boost::array must have exactly the same layout. "
+                    "Bug in implementation of std::array or boost::array."
+                );
+                return ((*this) << reinterpret_cast<boost::array<C, N> const& >(input)); 
+            }
+#endif
+            template <class InStreamable>
+            bool operator<<(const InStreamable& input)  { return shl_input_streamable(input); }
+        };
+
+
+        template <class CharT, class Traits>
+        class lexical_ostream_limited_src: boost::noncopyable {
+            //`[start, finish)` is the range to output by `operator >>` 
+            const CharT*        start;
+            const CharT* const  finish;
+
+        public:
+            lexical_ostream_limited_src(const CharT* begin, const CharT* end) BOOST_NOEXCEPT
+              : start(begin)
+              , finish(end)
+            {}
+
+/************************************ HELPER FUNCTIONS FOR OPERATORS >> ( ... ) ********************************/
+        private:
+            template <typename Type>
+            bool shr_unsigned(Type& output) {
+                if (start == finish) return false;
+                CharT const minus = lcast_char_constants<CharT>::minus;
+                CharT const plus = lcast_char_constants<CharT>::plus;
+                bool const has_minus = Traits::eq(minus, *start);
+
+                /* We won`t use `start' any more, so no need in decrementing it after */
+                if (has_minus || Traits::eq(plus, *start)) {
+                    ++start;
+                }
+
+                bool const succeed = lcast_ret_unsigned<Traits, Type, CharT>(output, start, finish).convert();
+
+                if (has_minus) {
+                    output = static_cast<Type>(0u - output);
+                }
+
+                return succeed;
+            }
+
+            template <typename Type>
+            bool shr_signed(Type& output) {
+                if (start == finish) return false;
+                CharT const minus = lcast_char_constants<CharT>::minus;
+                CharT const plus = lcast_char_constants<CharT>::plus;
+                typedef BOOST_DEDUCED_TYPENAME make_unsigned<Type>::type utype;
+                utype out_tmp = 0;
+                bool const has_minus = Traits::eq(minus, *start);
+
+                /* We won`t use `start' any more, so no need in decrementing it after */
+                if (has_minus || Traits::eq(plus, *start)) {
+                    ++start;
+                }
+
+                bool succeed = lcast_ret_unsigned<Traits, utype, CharT>(out_tmp, start, finish).convert();
+                if (has_minus) {
+                    utype const comp_val = (static_cast<utype>(1) << std::numeric_limits<Type>::digits);
+                    succeed = succeed && out_tmp<=comp_val;
+                    output = static_cast<Type>(0u - out_tmp);
+                } else {
+                    utype const comp_val = static_cast<utype>((std::numeric_limits<Type>::max)());
+                    succeed = succeed && out_tmp<=comp_val;
+                    output = static_cast<Type>(out_tmp);
+                }
+                return succeed;
+            }
+
+            template<typename InputStreamable>
+            bool shr_using_base_class(InputStreamable& output)
+            {
+                BOOST_STATIC_ASSERT_MSG(
+                    (!boost::is_pointer<InputStreamable>::value),
+                    "boost::lexical_cast can not convert to pointers"
+                );
+
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_LOCALE)
+                BOOST_STATIC_ASSERT_MSG((boost::is_same<char, CharT>::value),
+                    "boost::lexical_cast can not convert, because your STL library does not "
+                    "support such conversions. Try updating it."
+                );
+#endif
+                typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::buffer_t
+                    buffer_t;
+
+#if defined(BOOST_NO_STRINGSTREAM)
+                std::istrstream stream(start, finish - start);
+#else
+
+                buffer_t buf;
+                // Usually `istream` and `basic_istream` do not modify 
+                // content of buffer; `buffer_t` assures that this is true
+                buf.setbuf(const_cast<CharT*>(start), finish - start);
+#if defined(BOOST_NO_STD_LOCALE)
+                std::istream stream(&buf);
+#else
+                std::basic_istream<CharT, Traits> stream(&buf);
+#endif // BOOST_NO_STD_LOCALE
+#endif // BOOST_NO_STRINGSTREAM
+
+#ifndef BOOST_NO_EXCEPTIONS
+                stream.exceptions(std::ios::badbit);
+                try {
+#endif
+                stream.unsetf(std::ios::skipws);
+                lcast_set_precision(stream, static_cast<InputStreamable*>(0));
+
+                return (stream >> output) 
+                    && (stream.get() == Traits::eof());
+
+#ifndef BOOST_NO_EXCEPTIONS
+                } catch (const ::std::ios_base::failure& /*f*/) {
+                    return false;
+                }
+#endif
+            }
+
+            template<class T>
+            inline bool shr_xchar(T& output) BOOST_NOEXCEPT {
+                BOOST_STATIC_ASSERT_MSG(( sizeof(CharT) == sizeof(T) ),
+                    "boost::lexical_cast does not support narrowing of character types."
+                    "Use boost::locale instead" );
+                bool const ok = (finish - start == 1);
+                if (ok) {
+                    CharT out;
+                    Traits::assign(out, *start);
+                    output = static_cast<T>(out);
+                }
+                return ok;
+            }
+
+            template <std::size_t N, class ArrayT>
+            bool shr_std_array(ArrayT& output) BOOST_NOEXCEPT {
+                using namespace std;
+                const std::size_t size = static_cast<std::size_t>(finish - start);
+                if (size > N - 1) { // `-1` because we need to store \0 at the end 
+                    return false;
+                }
+
+                memcpy(&output[0], start, size * sizeof(CharT));
+                output[size] = Traits::to_char_type(0);
+                return true;
+            }
+
+/************************************ OPERATORS >> ( ... ) ********************************/
+        public:
+            bool operator>>(unsigned short& output)             { return shr_unsigned(output); }
+            bool operator>>(unsigned int& output)               { return shr_unsigned(output); }
+            bool operator>>(unsigned long int& output)          { return shr_unsigned(output); }
+            bool operator>>(short& output)                      { return shr_signed(output); }
+            bool operator>>(int& output)                        { return shr_signed(output); }
+            bool operator>>(long int& output)                   { return shr_signed(output); }
+#if defined(BOOST_HAS_LONG_LONG)
+            bool operator>>(boost::ulong_long_type& output)     { return shr_unsigned(output); }
+            bool operator>>(boost::long_long_type& output)      { return shr_signed(output); }
+#elif defined(BOOST_HAS_MS_INT64)
+            bool operator>>(unsigned __int64& output)           { return shr_unsigned(output); }
+            bool operator>>(__int64& output)                    { return shr_signed(output); }
+#endif
+
+#ifdef BOOST_HAS_INT128
+            bool operator>>(boost::uint128_type& output)        { return shr_unsigned(output); }
+            bool operator>>(boost::int128_type& output)         { return shr_signed(output); }
+#endif
+
+            bool operator>>(char& output)                       { return shr_xchar(output); }
+            bool operator>>(unsigned char& output)              { return shr_xchar(output); }
+            bool operator>>(signed char& output)                { return shr_xchar(output); }
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+            bool operator>>(wchar_t& output)                    { return shr_xchar(output); }
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            bool operator>>(char16_t& output)                   { return shr_xchar(output); }
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+            bool operator>>(char32_t& output)                   { return shr_xchar(output); }
+#endif
+            template<class Alloc>
+            bool operator>>(std::basic_string<CharT,Traits,Alloc>& str) { 
+                str.assign(start, finish); return true; 
+            }
+
+            template<class Alloc>
+            bool operator>>(boost::container::basic_string<CharT,Traits,Alloc>& str) { 
+                str.assign(start, finish); return true; 
+            }
+
+            template <std::size_t N>
+            bool operator>>(boost::array<CharT, N>& output) BOOST_NOEXCEPT { 
+                return shr_std_array<N>(output); 
+            }
+
+            template <std::size_t N>
+            bool operator>>(boost::array<unsigned char, N>& output) BOOST_NOEXCEPT { 
+                return ((*this) >> reinterpret_cast<boost::array<char, N>& >(output)); 
+            }
+
+            template <std::size_t N>
+            bool operator>>(boost::array<signed char, N>& output) BOOST_NOEXCEPT { 
+                return ((*this) >> reinterpret_cast<boost::array<char, N>& >(output)); 
+            }
+ 
+#ifndef BOOST_NO_CXX11_HDR_ARRAY
+            template <class C, std::size_t N>
+            bool operator>>(std::array<C, N>& output) BOOST_NOEXCEPT { 
+                BOOST_STATIC_ASSERT_MSG(
+                    (sizeof(boost::array<C, N>) == sizeof(boost::array<C, N>)),
+                    "std::array<C, N> and boost::array<C, N> must have exactly the same layout."
+                );
+                return ((*this) >> reinterpret_cast<boost::array<C, N>& >(output));
+            }
+#endif
+
+            bool operator>>(bool& output) BOOST_NOEXCEPT {
+                output = false; // Suppress warning about uninitalized variable
+
+                if (start == finish) return false;
+                CharT const zero = lcast_char_constants<CharT>::zero;
+                CharT const plus = lcast_char_constants<CharT>::plus;
+                CharT const minus = lcast_char_constants<CharT>::minus;
+
+                const CharT* const dec_finish = finish - 1;
+                output = Traits::eq(*dec_finish, zero + 1);
+                if (!output && !Traits::eq(*dec_finish, zero)) {
+                    return false; // Does not ends on '0' or '1'
+                }
+
+                if (start == dec_finish) return true;
+
+                // We may have sign at the beginning
+                if (Traits::eq(plus, *start) || (Traits::eq(minus, *start) && !output)) {
+                    ++ start;
+                }
+
+                // Skipping zeros
+                while (start != dec_finish) {
+                    if (!Traits::eq(zero, *start)) {
+                        return false; // Not a zero => error
+                    }
+
+                    ++ start;
+                }
+
+                return true;
+            }
+
+        private:
+            // Not optimised converter
+            template <class T>
+            bool float_types_converter_internal(T& output) {
+                if (parse_inf_nan(start, finish, output)) return true;
+                bool const return_value = shr_using_base_class(output);
+
+                /* Some compilers and libraries successfully
+                 * parse 'inf', 'INFINITY', '1.0E', '1.0E-'...
+                 * We are trying to provide a unified behaviour,
+                 * so we just forbid such conversions (as some
+                 * of the most popular compilers/libraries do)
+                 * */
+                CharT const minus = lcast_char_constants<CharT>::minus;
+                CharT const plus = lcast_char_constants<CharT>::plus;
+                CharT const capital_e = lcast_char_constants<CharT>::capital_e;
+                CharT const lowercase_e = lcast_char_constants<CharT>::lowercase_e;
+                if ( return_value &&
+                     (
+                        Traits::eq(*(finish-1), lowercase_e)                   // 1.0e
+                        || Traits::eq(*(finish-1), capital_e)                  // 1.0E
+                        || Traits::eq(*(finish-1), minus)                      // 1.0e- or 1.0E-
+                        || Traits::eq(*(finish-1), plus)                       // 1.0e+ or 1.0E+
+                     )
+                ) return false;
+
+                return return_value;
+            }
+
+        public:
+            bool operator>>(float& output) { return float_types_converter_internal(output); }
+            bool operator>>(double& output) { return float_types_converter_internal(output); }
+            bool operator>>(long double& output) { return float_types_converter_internal(output); }
+
+            // Generic istream-based algorithm.
+            // lcast_streambuf_for_target<InputStreamable>::value is true.
+            template <typename InputStreamable>
+            bool operator>>(InputStreamable& output) { 
+                return shr_using_base_class(output); 
+            }
+        };
+    }
+} // namespace boost
+
+#undef BOOST_LCAST_NO_WCHAR_T
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/converter_numeric.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,180 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_CONVERTER_NUMERIC_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_CONVERTER_NUMERIC_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_float.hpp>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+namespace boost { namespace detail {
+
+template <class Source >
+struct detect_precision_loss
+{
+    typedef Source source_type;
+    typedef boost::numeric::Trunc<Source> Rounder;
+    typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+        boost::is_arithmetic<Source>, Source, Source const&
+    >::type argument_type ;
+
+    static inline source_type nearbyint(argument_type s, bool& is_ok) BOOST_NOEXCEPT {
+        const source_type near_int = Rounder::nearbyint(s);
+        if (near_int && is_ok) {
+            const source_type orig_div_round = s / near_int;
+            const source_type eps = std::numeric_limits<source_type>::epsilon();
+
+            is_ok = !((orig_div_round > 1 ? orig_div_round - 1 : 1 - orig_div_round) > eps);
+        }
+
+        return s;
+    }
+
+    typedef typename Rounder::round_style round_style;
+};
+
+template <typename Base, class Source>
+struct fake_precision_loss: public Base
+{
+    typedef Source source_type ;
+    typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+        boost::is_arithmetic<Source>, Source, Source const&
+    >::type argument_type ;
+
+    static inline source_type nearbyint(argument_type s, bool& /*is_ok*/) BOOST_NOEXCEPT {
+        return s;
+    }
+};
+
+struct nothrow_overflow_handler
+{
+    inline bool operator() ( boost::numeric::range_check_result r ) const BOOST_NOEXCEPT {
+        return (r == boost::numeric::cInRange);
+    }
+};
+
+template <typename Target, typename Source>
+inline bool noexcept_numeric_convert(const Source& arg, Target& result) BOOST_NOEXCEPT {
+    typedef boost::numeric::converter<
+            Target,
+            Source,
+            boost::numeric::conversion_traits<Target, Source >,
+            nothrow_overflow_handler,
+            detect_precision_loss<Source >
+    > converter_orig_t;
+
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+        boost::is_base_of< detect_precision_loss<Source >, converter_orig_t >::value,
+        converter_orig_t,
+        fake_precision_loss<converter_orig_t, Source>
+    >::type converter_t;
+
+    bool res = nothrow_overflow_handler()(converter_t::out_of_range(arg));
+    result = converter_t::low_level_convert(converter_t::nearbyint(arg, res));
+    return res;
+}
+
+template <typename Target, typename Source>
+struct lexical_cast_dynamic_num_not_ignoring_minus
+{
+    static inline bool try_convert(const Source &arg, Target& result) BOOST_NOEXCEPT {
+        return noexcept_numeric_convert<Target, Source >(arg, result);
+    }
+};
+
+template <typename Target, typename Source>
+struct lexical_cast_dynamic_num_ignoring_minus
+{
+    static inline bool try_convert(const Source &arg, Target& result) BOOST_NOEXCEPT {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::eval_if_c<
+                boost::is_float<Source>::value,
+                boost::mpl::identity<Source>,
+                boost::make_unsigned<Source>
+        >::type usource_t;
+
+        if (arg < 0) {
+            const bool res = noexcept_numeric_convert<Target, usource_t>(0u - arg, result);
+            result = static_cast<Target>(0u - result);
+            return res;
+        } else {
+            return noexcept_numeric_convert<Target, usource_t>(arg, result);
+        }
+    }
+};
+
+/*
+ * lexical_cast_dynamic_num follows the rules:
+ * 1) If Source can be converted to Target without precision loss and
+ * without overflows, then assign Source to Target and return
+ *
+ * 2) If Source is less than 0 and Target is an unsigned integer,
+ * then negate Source, check the requirements of rule 1) and if
+ * successful, assign static_casted Source to Target and return
+ *
+ * 3) Otherwise throw a bad_lexical_cast exception
+ *
+ *
+ * Rule 2) required because boost::lexical_cast has the behavior of
+ * stringstream, which uses the rules of scanf for conversions. And
+ * in the C99 standard for unsigned input value minus sign is
+ * optional, so if a negative number is read, no errors will arise
+ * and the result will be the two's complement.
+ */
+template <typename Target, typename Source>
+struct dynamic_num_converter_impl
+{
+    static inline bool try_convert(const Source &arg, Target& result) BOOST_NOEXCEPT {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+            boost::type_traits::ice_and<
+                boost::is_unsigned<Target>::value,
+                boost::type_traits::ice_or<
+                    boost::is_signed<Source>::value,
+                    boost::is_float<Source>::value
+                >::value,
+                boost::type_traits::ice_not<
+                    boost::is_same<Source, bool>::value
+                >::value,
+                boost::type_traits::ice_not<
+                    boost::is_same<Target, bool>::value
+                >::value
+            >::value,
+            lexical_cast_dynamic_num_ignoring_minus<Target, Source>,
+            lexical_cast_dynamic_num_not_ignoring_minus<Target, Source>
+        >::type caster_type;
+
+        return caster_type::try_convert(arg, result);
+    }
+};
+
+}} // namespace boost::detail
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_CONVERTER_NUMERIC_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/inf_nan.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,197 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_INF_NAN_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_INF_NAN_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
+#define BOOST_LCAST_NO_WCHAR_T
+#endif
+
+#include <cstddef>
+#include <cstring>
+#include <boost/limits.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <boost/lexical_cast/detail/lcast_char_constants.hpp>
+
+namespace boost {
+    namespace detail
+    {
+        template <class CharT>
+        bool lc_iequal(const CharT* val, const CharT* lcase, const CharT* ucase, unsigned int len) BOOST_NOEXCEPT {
+            for( unsigned int i=0; i < len; ++i ) {
+                if ( val[i] != lcase[i] && val[i] != ucase[i] ) return false;
+            }
+
+            return true;
+        }
+
+        /* Returns true and sets the correct value if found NaN or Inf. */
+        template <class CharT, class T>
+        inline bool parse_inf_nan_impl(const CharT* begin, const CharT* end, T& value
+            , const CharT* lc_NAN, const CharT* lc_nan
+            , const CharT* lc_INFINITY, const CharT* lc_infinity
+            , const CharT opening_brace, const CharT closing_brace) BOOST_NOEXCEPT
+        {
+            using namespace std;
+            if (begin == end) return false;
+            const CharT minus = lcast_char_constants<CharT>::minus;
+            const CharT plus = lcast_char_constants<CharT>::plus;
+            const int inifinity_size = 8; // == sizeof("infinity") - 1
+
+            /* Parsing +/- */
+            bool const has_minus = (*begin == minus);
+            if (has_minus || *begin == plus) {
+                ++ begin;
+            }
+
+            if (end - begin < 3) return false;
+            if (lc_iequal(begin, lc_nan, lc_NAN, 3)) {
+                begin += 3;
+                if (end != begin) {
+                    /* It is 'nan(...)' or some bad input*/
+                    
+                    if (end - begin < 2) return false; // bad input
+                    -- end;
+                    if (*begin != opening_brace || *end != closing_brace) return false; // bad input
+                }
+
+                if( !has_minus ) value = std::numeric_limits<T>::quiet_NaN();
+                else value = (boost::math::changesign) (std::numeric_limits<T>::quiet_NaN());
+                return true;
+            } else if (
+                ( /* 'INF' or 'inf' */
+                  end - begin == 3      // 3 == sizeof('inf') - 1
+                  && lc_iequal(begin, lc_infinity, lc_INFINITY, 3)
+                )
+                ||
+                ( /* 'INFINITY' or 'infinity' */
+                  end - begin == inifinity_size
+                  && lc_iequal(begin, lc_infinity, lc_INFINITY, inifinity_size)
+                )
+             )
+            {
+                if( !has_minus ) value = std::numeric_limits<T>::infinity();
+                else value = (boost::math::changesign) (std::numeric_limits<T>::infinity());
+                return true;
+            }
+
+            return false;
+        }
+
+        template <class CharT, class T>
+        bool put_inf_nan_impl(CharT* begin, CharT*& end, const T& value
+                         , const CharT* lc_nan
+                         , const CharT* lc_infinity) BOOST_NOEXCEPT
+        {
+            using namespace std;
+            const CharT minus = lcast_char_constants<CharT>::minus;
+            if ((boost::math::isnan)(value)) {
+                if ((boost::math::signbit)(value)) {
+                    *begin = minus;
+                    ++ begin;
+                }
+
+                memcpy(begin, lc_nan, 3 * sizeof(CharT));
+                end = begin + 3;
+                return true;
+            } else if ((boost::math::isinf)(value)) {
+                if ((boost::math::signbit)(value)) {
+                    *begin = minus;
+                    ++ begin;
+                }
+
+                memcpy(begin, lc_infinity, 3 * sizeof(CharT));
+                end = begin + 3;
+                return true;
+            }
+
+            return false;
+        }
+
+
+#ifndef BOOST_LCAST_NO_WCHAR_T
+        template <class T>
+        bool parse_inf_nan(const wchar_t* begin, const wchar_t* end, T& value) BOOST_NOEXCEPT {
+            return parse_inf_nan_impl(begin, end, value
+                               , L"NAN", L"nan"
+                               , L"INFINITY", L"infinity"
+                               , L'(', L')');
+        }
+
+        template <class T>
+        bool put_inf_nan(wchar_t* begin, wchar_t*& end, const T& value) BOOST_NOEXCEPT {
+            return put_inf_nan_impl(begin, end, value, L"nan", L"infinity");
+        }
+
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+        template <class T>
+        bool parse_inf_nan(const char16_t* begin, const char16_t* end, T& value) BOOST_NOEXCEPT {
+            return parse_inf_nan_impl(begin, end, value
+                               , u"NAN", u"nan"
+                               , u"INFINITY", u"infinity"
+                               , u'(', u')');
+        }
+
+        template <class T>
+        bool put_inf_nan(char16_t* begin, char16_t*& end, const T& value) BOOST_NOEXCEPT {
+            return put_inf_nan_impl(begin, end, value, u"nan", u"infinity");
+        }
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS)
+        template <class T>
+        bool parse_inf_nan(const char32_t* begin, const char32_t* end, T& value) BOOST_NOEXCEPT {
+            return parse_inf_nan_impl(begin, end, value
+                               , U"NAN", U"nan"
+                               , U"INFINITY", U"infinity"
+                               , U'(', U')');
+        }
+
+        template <class T>
+        bool put_inf_nan(char32_t* begin, char32_t*& end, const T& value) BOOST_NOEXCEPT {
+            return put_inf_nan_impl(begin, end, value, U"nan", U"infinity");
+        }
+#endif
+
+        template <class CharT, class T>
+        bool parse_inf_nan(const CharT* begin, const CharT* end, T& value) BOOST_NOEXCEPT {
+            return parse_inf_nan_impl(begin, end, value
+                               , "NAN", "nan"
+                               , "INFINITY", "infinity"
+                               , '(', ')');
+        }
+
+        template <class CharT, class T>
+        bool put_inf_nan(CharT* begin, CharT*& end, const T& value) BOOST_NOEXCEPT {
+            return put_inf_nan_impl(begin, end, value, "nan", "infinity");
+        }
+    }
+} // namespace boost
+
+#undef BOOST_LCAST_NO_WCHAR_T
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_INF_NAN_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/is_character.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,57 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_IS_CHARACTER_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_IS_CHARACTER_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost {
+
+    namespace detail // is_character<...>
+    {
+        // returns true, if T is one of the character types
+        template < typename T >
+        struct is_character
+        {
+            typedef boost::type_traits::ice_or<
+                    boost::is_same< T, char >::value,
+                    #if !defined(BOOST_NO_STRINGSTREAM) && !defined(BOOST_NO_STD_WSTRING)
+                        boost::is_same< T, wchar_t >::value,
+                    #endif
+                    #ifndef BOOST_NO_CXX11_CHAR16_T
+                        boost::is_same< T, char16_t >::value,
+                    #endif
+                    #ifndef BOOST_NO_CXX11_CHAR32_T
+                        boost::is_same< T, char32_t >::value,
+                    #endif
+                    boost::is_same< T, unsigned char >::value,
+                    boost::is_same< T, signed char >::value
+            > result_type;
+
+            BOOST_STATIC_CONSTANT(bool, value = (result_type::value) );
+        };
+    }
+}
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_IS_CHARACTER_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/lcast_char_constants.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_LCAST_CHAR_CONSTANTS_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_LCAST_CHAR_CONSTANTS_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+namespace boost 
+{
+    namespace detail // '0', '-', '+', 'e', 'E' and '.' constants
+    {
+        template < typename Char >
+        struct lcast_char_constants {
+            // We check in tests assumption that static casted character is
+            // equal to correctly written C++ literal: U'0' == static_cast<char32_t>('0')
+            BOOST_STATIC_CONSTANT(Char, zero  = static_cast<Char>('0'));
+            BOOST_STATIC_CONSTANT(Char, minus = static_cast<Char>('-'));
+            BOOST_STATIC_CONSTANT(Char, plus = static_cast<Char>('+'));
+            BOOST_STATIC_CONSTANT(Char, lowercase_e = static_cast<Char>('e'));
+            BOOST_STATIC_CONSTANT(Char, capital_e = static_cast<Char>('E'));
+            BOOST_STATIC_CONSTANT(Char, c_decimal_separator = static_cast<Char>('.'));
+        };
+    }
+} // namespace boost
+
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_LCAST_CHAR_CONSTANTS_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/lcast_unsigned_converters.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,295 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_LCAST_UNSIGNED_CONVERTERS_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_LCAST_UNSIGNED_CONVERTERS_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#include <climits>
+#include <cstddef>
+#include <string>
+#include <cstring>
+#include <cstdio>
+#include <boost/limits.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/workaround.hpp>
+
+
+#ifndef BOOST_NO_STD_LOCALE
+#   include <locale>
+#else
+#   ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+        // Getting error at this point means, that your STL library is old/lame/misconfigured.
+        // If nothing can be done with STL library, define BOOST_LEXICAL_CAST_ASSUME_C_LOCALE,
+        // but beware: lexical_cast will understand only 'C' locale delimeters and thousands
+        // separators.
+#       error "Unable to use <locale> header. Define BOOST_LEXICAL_CAST_ASSUME_C_LOCALE to force "
+#       error "boost::lexical_cast to use only 'C' locale during conversions."
+#   endif
+#endif
+
+#include <boost/lexical_cast/detail/lcast_char_constants.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/noncopyable.hpp>
+
+namespace boost 
+{
+    namespace detail // lcast_to_unsigned
+    {
+        template<class T>
+        inline
+        BOOST_DEDUCED_TYPENAME boost::make_unsigned<T>::type lcast_to_unsigned(const T value) BOOST_NOEXCEPT {
+            typedef BOOST_DEDUCED_TYPENAME boost::make_unsigned<T>::type result_type;
+            return value < 0 
+                ? static_cast<result_type>(0u - static_cast<result_type>(value)) 
+                : static_cast<result_type>(value);
+        }
+    }
+
+    namespace detail // lcast_put_unsigned
+    {
+        template <class Traits, class T, class CharT>
+        class lcast_put_unsigned: boost::noncopyable {
+            typedef BOOST_DEDUCED_TYPENAME Traits::int_type int_type;
+            BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                    (sizeof(int_type) > sizeof(T))
+                    , int_type
+                    , T
+            >::type         m_value;
+            CharT*          m_finish;
+            CharT    const  m_czero;
+            int_type const  m_zero;
+
+        public:
+            lcast_put_unsigned(const T n_param, CharT* finish) BOOST_NOEXCEPT 
+                : m_value(n_param), m_finish(finish)
+                , m_czero(lcast_char_constants<CharT>::zero), m_zero(Traits::to_int_type(m_czero))
+            {
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+                BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
+#endif
+            }
+
+            CharT* convert() {
+#ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+                std::locale loc;
+                if (loc == std::locale::classic()) {
+                    return main_convert_loop();
+                }
+
+                typedef std::numpunct<CharT> numpunct;
+                numpunct const& np = BOOST_USE_FACET(numpunct, loc);
+                std::string const grouping = np.grouping();
+                std::string::size_type const grouping_size = grouping.size();
+
+                if (!grouping_size || grouping[0] <= 0) {
+                    return main_convert_loop();
+                }
+
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+                // Check that ulimited group is unreachable:
+                BOOST_STATIC_ASSERT(std::numeric_limits<T>::digits10 < CHAR_MAX);
+#endif
+                CharT const thousands_sep = np.thousands_sep();
+                std::string::size_type group = 0; // current group number
+                char last_grp_size = grouping[0];
+                char left = last_grp_size;
+
+                do {
+                    if (left == 0) {
+                        ++group;
+                        if (group < grouping_size) {
+                            char const grp_size = grouping[group];
+                            last_grp_size = (grp_size <= 0 ? static_cast<char>(CHAR_MAX) : grp_size);
+                        }
+
+                        left = last_grp_size;
+                        --m_finish;
+                        Traits::assign(*m_finish, thousands_sep);
+                    }
+
+                    --left;
+                } while (main_convert_iteration());
+
+                return m_finish;
+#else
+                return main_convert_loop();
+#endif
+            }
+
+        private:
+            inline bool main_convert_iteration() BOOST_NOEXCEPT {
+                --m_finish;
+                int_type const digit = static_cast<int_type>(m_value % 10U);
+                Traits::assign(*m_finish, Traits::to_char_type(m_zero + digit));
+                m_value /= 10;
+                return !!m_value; // suppressing warnings
+            }
+
+            inline CharT* main_convert_loop() BOOST_NOEXCEPT {
+                while (main_convert_iteration());
+                return m_finish;
+            }
+        };
+    }
+
+    namespace detail // lcast_ret_unsigned
+    {
+        template <class Traits, class T, class CharT>
+        class lcast_ret_unsigned: boost::noncopyable {
+            bool m_multiplier_overflowed;
+            T m_multiplier;
+            T& m_value;
+            const CharT* const m_begin;
+            const CharT* m_end;
+    
+        public:
+            lcast_ret_unsigned(T& value, const CharT* const begin, const CharT* end) BOOST_NOEXCEPT
+                : m_multiplier_overflowed(false), m_multiplier(1), m_value(value), m_begin(begin), m_end(end)
+            {
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+                BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
+
+                // GCC when used with flag -std=c++0x may not have std::numeric_limits
+                // specializations for __int128 and unsigned __int128 types.
+                // Try compilation with -std=gnu++0x or -std=gnu++11.
+                //
+                // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40856
+                BOOST_STATIC_ASSERT_MSG(std::numeric_limits<T>::is_specialized,
+                    "std::numeric_limits are not specialized for integral type passed to boost::lexical_cast"
+                );
+#endif
+            }
+
+            inline bool convert() {
+                CharT const czero = lcast_char_constants<CharT>::zero;
+                --m_end;
+                m_value = static_cast<T>(0);
+
+                if (m_begin > m_end || *m_end < czero || *m_end >= czero + 10)
+                    return false;
+                m_value = static_cast<T>(*m_end - czero);
+                --m_end;
+
+#ifdef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+                return main_convert_loop();
+#else
+                std::locale loc;
+                if (loc == std::locale::classic()) {
+                    return main_convert_loop();
+                }
+
+                typedef std::numpunct<CharT> numpunct;
+                numpunct const& np = BOOST_USE_FACET(numpunct, loc);
+                std::string const& grouping = np.grouping();
+                std::string::size_type const grouping_size = grouping.size();
+
+                /* According to Programming languages - C++
+                 * we MUST check for correct grouping
+                 */
+                if (!grouping_size || grouping[0] <= 0) {
+                    return main_convert_loop();
+                }
+
+                unsigned char current_grouping = 0;
+                CharT const thousands_sep = np.thousands_sep();
+                char remained = static_cast<char>(grouping[current_grouping] - 1);
+
+                for (;m_end >= m_begin; --m_end)
+                {
+                    if (remained) {
+                        if (!main_convert_iteration()) {
+                            return false;
+                        }
+                        --remained;
+                    } else {
+                        if ( !Traits::eq(*m_end, thousands_sep) ) //|| begin == end ) return false;
+                        {
+                            /*
+                             * According to Programming languages - C++
+                             * Digit grouping is checked. That is, the positions of discarded
+                             * separators is examined for consistency with
+                             * use_facet<numpunct<charT> >(loc ).grouping()
+                             *
+                             * BUT what if there is no separators at all and grouping()
+                             * is not empty? Well, we have no extraced separators, so we
+                             * won`t check them for consistency. This will allow us to
+                             * work with "C" locale from other locales
+                             */
+                            return main_convert_loop();
+                        } else {
+                            if (m_begin == m_end) return false;
+                            if (current_grouping < grouping_size - 1) ++current_grouping;
+                            remained = grouping[current_grouping];
+                        }
+                    }
+                } /*for*/
+
+                return true;
+#endif
+            }
+
+        private:
+            // Iteration that does not care about grouping/separators and assumes that all 
+            // input characters are digits
+            inline bool main_convert_iteration() BOOST_NOEXCEPT {
+                CharT const czero = lcast_char_constants<CharT>::zero;
+                T const maxv = (std::numeric_limits<T>::max)();
+
+                m_multiplier_overflowed = m_multiplier_overflowed || (maxv/10 < m_multiplier);
+                m_multiplier = static_cast<T>(m_multiplier * 10);
+
+                T const dig_value = static_cast<T>(*m_end - czero);
+                T const new_sub_value = static_cast<T>(m_multiplier * dig_value);
+
+                // We must correctly handle situations like `000000000000000000000000000001`.
+                // So we take care of overflow only if `dig_value` is not '0'.
+                if (*m_end < czero || *m_end >= czero + 10  // checking for correct digit
+                    || (dig_value && (                      // checking for overflow of ... 
+                        m_multiplier_overflowed                             // ... multiplier
+                        || static_cast<T>(maxv / dig_value) < m_multiplier  // ... subvalue
+                        || static_cast<T>(maxv - new_sub_value) < m_value   // ... whole expression
+                    ))
+                ) return false;
+
+                m_value = static_cast<T>(m_value + new_sub_value);
+                
+                return true;
+            }
+
+            bool main_convert_loop() BOOST_NOEXCEPT {
+                for ( ; m_end >= m_begin; --m_end) {
+                    if (!main_convert_iteration()) {
+                        return false;
+                    }
+                }
+            
+                return true;
+            }
+        };
+    }
+} // namespace boost
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_LCAST_UNSIGNED_CONVERTERS_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/detail/widest_char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_DETAIL_WIDEST_CHAR_HPP
+#define BOOST_LEXICAL_CAST_DETAIL_WIDEST_CHAR_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+namespace boost { namespace detail {
+
+    template <typename TargetChar, typename SourceChar>
+    struct widest_char {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+            (sizeof(TargetChar) > sizeof(SourceChar))
+            , TargetChar
+            , SourceChar
+        >::type type;
+    };
+
+}} // namespace boost::detail
+
+#endif // BOOST_LEXICAL_CAST_DETAIL_WIDEST_CHAR_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/lexical_cast_old.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,177 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP
+#define BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
+#define BOOST_LCAST_NO_WCHAR_T
+#endif
+
+#include <climits>
+#include <cstddef>
+#include <string>
+#include <cstring>
+#include <cstdio>
+#include <boost/limits.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/lcast_precision.hpp>
+#include <boost/detail/workaround.hpp>
+
+#ifdef BOOST_NO_STRINGSTREAM
+#include <strstream>
+#else
+#include <sstream>
+#endif
+
+#include <boost/lexical_cast/bad_lexical_cast.hpp>
+#include <boost/lexical_cast/detail/widest_char.hpp>
+
+namespace boost {
+    namespace detail
+    {
+
+        // selectors for choosing stream character type
+        template<typename Type>
+        struct stream_char
+        {
+            typedef char type;
+        };
+
+#ifndef BOOST_LCAST_NO_WCHAR_T
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+        template<>
+        struct stream_char<wchar_t>
+        {
+            typedef wchar_t type;
+        };
+#endif
+
+        template<>
+        struct stream_char<wchar_t *>
+        {
+            typedef wchar_t type;
+        };
+
+        template<>
+        struct stream_char<const wchar_t *>
+        {
+            typedef wchar_t type;
+        };
+
+        template<>
+        struct stream_char<std::wstring>
+        {
+            typedef wchar_t type;
+        };
+#endif
+
+        // stream wrapper for handling lexical conversions
+        template<typename Target, typename Source, typename Traits>
+        class lexical_stream
+        {
+        private:
+            typedef typename widest_char<
+                typename stream_char<Target>::type,
+                typename stream_char<Source>::type>::type char_type;
+
+            typedef Traits traits_type;
+
+        public:
+            lexical_stream(char_type* = 0, char_type* = 0)
+            {
+                stream.unsetf(std::ios::skipws);
+                lcast_set_precision(stream, static_cast<Source*>(0), static_cast<Target*>(0) );
+            }
+            ~lexical_stream()
+            {
+                #if defined(BOOST_NO_STRINGSTREAM)
+                stream.freeze(false);
+                #endif
+            }
+            bool operator<<(const Source &input)
+            {
+                return !(stream << input).fail();
+            }
+            template<typename InputStreamable>
+            bool operator>>(InputStreamable &output)
+            {
+                return !is_pointer<InputStreamable>::value &&
+                       stream >> output &&
+                       stream.get() == traits_type::eof();
+            }
+
+            bool operator>>(std::string &output)
+            {
+                #if defined(BOOST_NO_STRINGSTREAM)
+                stream << '\0';
+                #endif
+                stream.str().swap(output);
+                return true;
+            }
+            #ifndef BOOST_LCAST_NO_WCHAR_T
+            bool operator>>(std::wstring &output)
+            {
+                stream.str().swap(output);
+                return true;
+            }
+            #endif
+
+        private:
+            #if defined(BOOST_NO_STRINGSTREAM)
+            std::strstream stream;
+            #elif defined(BOOST_NO_STD_LOCALE)
+            std::stringstream stream;
+            #else
+            std::basic_stringstream<char_type,traits_type> stream;
+            #endif
+        };
+    }
+
+    // call-by-value fallback version (deprecated)
+
+    template<typename Target, typename Source>
+    Target lexical_cast(Source arg)
+    {
+        typedef typename detail::widest_char< 
+            BOOST_DEDUCED_TYPENAME detail::stream_char<Target>::type 
+          , BOOST_DEDUCED_TYPENAME detail::stream_char<Source>::type 
+        >::type char_type; 
+
+        typedef std::char_traits<char_type> traits;
+        detail::lexical_stream<Target, Source, traits> interpreter;
+        Target result;
+
+        if(!(interpreter << arg && interpreter >> result))
+            boost::conversion::detail::throw_bad_cast<Source, Target>();
+        return result;
+    }
+
+} // namespace boost
+
+#undef BOOST_LCAST_NO_WCHAR_T
+
+#endif // BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/lexical_cast/try_lexical_convert.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,198 @@
+// Copyright Kevlin Henney, 2000-2005.
+// Copyright Alexander Nasonov, 2006-2010.
+// Copyright Antony Polukhin, 2011-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// what:  lexical_cast custom keyword cast
+// who:   contributed by Kevlin Henney,
+//        enhanced with contributions from Terje Slettebo,
+//        with additional fixes and suggestions from Gennaro Prota,
+//        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
+//        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
+//        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
+// when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+
+#ifndef BOOST_LEXICAL_CAST_TRY_LEXICAL_CONVERT_HPP
+#define BOOST_LEXICAL_CAST_TRY_LEXICAL_CONVERT_HPP
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+#include <string>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+
+#include <boost/lexical_cast/detail/is_character.hpp>
+#include <boost/lexical_cast/detail/converter_numeric.hpp>
+#include <boost/lexical_cast/detail/converter_lexical.hpp>
+
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/container/container_fwd.hpp>
+
+namespace boost {
+    namespace detail
+    {
+        template<typename T>
+        struct is_stdstring
+            : boost::false_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_stdstring< std::basic_string<CharT, Traits, Alloc> >
+            : boost::true_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_stdstring< boost::container::basic_string<CharT, Traits, Alloc> >
+            : boost::true_type
+        {};
+
+        template<typename Target, typename Source>
+        struct is_arithmetic_and_not_xchars
+        {
+            BOOST_STATIC_CONSTANT(bool, value = (
+                boost::type_traits::ice_and<
+                    boost::type_traits::ice_not<
+                        boost::detail::is_character<Target>::value
+                    >::value,
+                    boost::type_traits::ice_not<
+                        boost::detail::is_character<Source>::value
+                    >::value,
+                    boost::is_arithmetic<Source>::value,
+                    boost::is_arithmetic<Target>::value       
+                >::value
+            ));
+        };
+
+        /*
+         * is_xchar_to_xchar<Target, Source>::value is true, 
+         * Target and Souce are char types of the same size 1 (char, signed char, unsigned char).
+         */
+        template<typename Target, typename Source>
+        struct is_xchar_to_xchar 
+        {
+            BOOST_STATIC_CONSTANT(bool, value = (
+                boost::type_traits::ice_and<
+                     boost::type_traits::ice_eq<sizeof(Source), sizeof(Target)>::value,
+                     boost::type_traits::ice_eq<sizeof(Source), sizeof(char)>::value,
+                     boost::detail::is_character<Target>::value,
+                     boost::detail::is_character<Source>::value
+                >::value
+            ));
+        };
+
+        template<typename Target, typename Source>
+        struct is_char_array_to_stdstring
+            : boost::false_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_char_array_to_stdstring< std::basic_string<CharT, Traits, Alloc>, CharT* >
+            : boost::true_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_char_array_to_stdstring< std::basic_string<CharT, Traits, Alloc>, const CharT* >
+            : boost::true_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_char_array_to_stdstring< boost::container::basic_string<CharT, Traits, Alloc>, CharT* >
+            : boost::true_type
+        {};
+
+        template<typename CharT, typename Traits, typename Alloc>
+        struct is_char_array_to_stdstring< boost::container::basic_string<CharT, Traits, Alloc>, const CharT* >
+            : boost::true_type
+        {};
+
+        template <typename Target, typename Source>
+        struct copy_converter_impl
+        {
+// MSVC fail to forward an array (DevDiv#555157 "SILENT BAD CODEGEN triggered by perfect forwarding",
+// fixed in 2013 RTM).
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined(BOOST_MSVC) || BOOST_MSVC >= 1800)
+            template <class T>
+            static inline bool try_convert(T&& arg, Target& result) {
+                result = static_cast<T&&>(arg); // eqaul to `result = std::forward<T>(arg);`
+                return true;
+            }
+#else
+            static inline bool try_convert(const Source& arg, Target& result) {
+                result = arg;
+                return true;
+            }
+#endif
+        };
+    }
+
+    namespace conversion { namespace detail {
+
+        template <typename Target, typename Source>
+        inline bool try_lexical_convert(const Source& arg, Target& result)
+        {
+            typedef BOOST_DEDUCED_TYPENAME boost::detail::array_to_pointer_decay<Source>::type src;
+
+            typedef BOOST_DEDUCED_TYPENAME boost::type_traits::ice_or<
+                boost::detail::is_xchar_to_xchar<Target, src >::value,
+                boost::detail::is_char_array_to_stdstring<Target, src >::value,
+                boost::type_traits::ice_and<
+                     boost::is_same<Target, src >::value,
+                     boost::detail::is_stdstring<Target >::value
+                >::value,
+                boost::type_traits::ice_and<
+                     boost::is_same<Target, src >::value,
+                     boost::detail::is_character<Target >::value
+                >::value
+            > shall_we_copy_t;
+
+            typedef boost::detail::is_arithmetic_and_not_xchars<Target, src >
+                shall_we_copy_with_dynamic_check_t;
+
+            // We do evaluate second `if_` lazily to avoid unnecessary instantiations
+            // of `shall_we_copy_with_dynamic_check_t` and improve compilation times.
+            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                shall_we_copy_t::value,
+                boost::mpl::identity<boost::detail::copy_converter_impl<Target, src > >,
+                boost::mpl::if_<
+                     shall_we_copy_with_dynamic_check_t,
+                     boost::detail::dynamic_num_converter_impl<Target, src >,
+                     boost::detail::lexical_converter_impl<Target, src >
+                >
+            >::type caster_type_lazy;
+
+            typedef BOOST_DEDUCED_TYPENAME caster_type_lazy::type caster_type;
+
+            return caster_type::try_convert(arg, result);
+        }
+
+        template <typename Target, typename CharacterT>
+        inline bool try_lexical_convert(const CharacterT* chars, std::size_t count, Target& result)
+        {
+            BOOST_STATIC_ASSERT_MSG(
+                boost::detail::is_character<CharacterT>::value,
+                "This overload of try_lexical_convert is meant to be used only with arrays of characters."
+            );
+            return ::boost::conversion::detail::try_lexical_convert(
+                ::boost::iterator_range<const CharacterT*>(chars, chars + count), result
+            );
+        }
+
+    }} // namespace conversion::detail
+
+    namespace conversion {
+        // ADL barrier
+        using ::boost::conversion::detail::try_lexical_convert;
+    }
+
+} // namespace boost
+
+#endif // BOOST_LEXICAL_CAST_TRY_LEXICAL_CONVERT_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/log/detail/copy_cv.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2015.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   copy_cv.hpp
+ * \author Andrey Semashev
+ * \date   16.03.2014
+ *
+ * The header defines \c copy_cv type trait which copies const/volatile qualifiers from one type to another
+ */
+
+#ifndef BOOST_LOG_DETAIL_COPY_CV_HPP_INCLUDED_
+#define BOOST_LOG_DETAIL_COPY_CV_HPP_INCLUDED_
+
+#include <boost/log/detail/config.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace aux {
+
+//! The type trait copies top level const/volatile qualifiers from \c FromT to \c ToT
+template< typename FromT, typename ToT >
+struct copy_cv
+{
+    typedef ToT type;
+};
+
+template< typename FromT, typename ToT >
+struct copy_cv< const FromT, ToT >
+{
+    typedef const ToT type;
+};
+
+template< typename FromT, typename ToT >
+struct copy_cv< volatile FromT, ToT >
+{
+    typedef volatile ToT type;
+};
+
+template< typename FromT, typename ToT >
+struct copy_cv< const volatile FromT, ToT >
+{
+    typedef const volatile ToT type;
+};
+
+} // namespace aux
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_DETAIL_COPY_CV_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/log/detail/enqueued_record.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,103 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2015.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   enqueued_record.hpp
+ * \author Andrey Semashev
+ * \date   01.04.2014
+ *
+ * \brief  This header is the Boost.Log library implementation, see the library documentation
+ *         at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. In this file
+ *         internal configuration macros are defined.
+ */
+
+#ifndef BOOST_LOG_DETAIL_ENQUEUED_RECORD_HPP_INCLUDED_
+#define BOOST_LOG_DETAIL_ENQUEUED_RECORD_HPP_INCLUDED_
+
+#include <boost/move/core.hpp>
+#include <boost/move/utility.hpp>
+#include <boost/log/detail/config.hpp>
+#include <boost/log/detail/timestamp.hpp>
+#include <boost/log/core/record_view.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace sinks {
+
+namespace aux {
+
+//! Log record with enqueueing timestamp
+class enqueued_record
+{
+    BOOST_COPYABLE_AND_MOVABLE(enqueued_record)
+
+public:
+    //! Ordering predicate
+    template< typename OrderT >
+    struct order :
+        public OrderT
+    {
+        typedef typename OrderT::result_type result_type;
+
+        order() {}
+        order(order const& that) : OrderT(static_cast< OrderT const& >(that)) {}
+        order(OrderT const& that) : OrderT(that) {}
+
+        result_type operator() (enqueued_record const& left, enqueued_record const& right) const
+        {
+            // std::priority_queue requires ordering with semantics of std::greater, so we swap arguments
+            return OrderT::operator() (right.m_record, left.m_record);
+        }
+    };
+
+    boost::log::aux::timestamp m_timestamp;
+    record_view m_record;
+
+    enqueued_record(enqueued_record const& that) : m_timestamp(that.m_timestamp), m_record(that.m_record)
+    {
+    }
+    enqueued_record(BOOST_RV_REF(enqueued_record) that) :
+        m_timestamp(that.m_timestamp),
+        m_record(boost::move(that.m_record))
+    {
+    }
+    explicit enqueued_record(record_view const& rec) :
+        m_timestamp(boost::log::aux::get_timestamp()),
+        m_record(rec)
+    {
+    }
+    enqueued_record& operator= (BOOST_COPY_ASSIGN_REF(enqueued_record) that)
+    {
+        m_timestamp = that.m_timestamp;
+        m_record = that.m_record;
+        return *this;
+    }
+    enqueued_record& operator= (BOOST_RV_REF(enqueued_record) that)
+    {
+        m_timestamp = that.m_timestamp;
+        m_record = boost::move(that.m_record);
+        return *this;
+    }
+};
+
+} // namespace aux
+
+} // namespace sinks
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_DETAIL_ENQUEUED_RECORD_HPP_INCLUDED_
--- a/DEPENDENCIES/generic/include/boost/log/detail/malloc_aligned.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/*
- *          Copyright Andrey Semashev 2007 - 2013.
- * Distributed under the Boost Software License, Version 1.0.
- *    (See accompanying file LICENSE_1_0.txt or copy at
- *          http://www.boost.org/LICENSE_1_0.txt)
- */
-/*!
- * \file   malloc_aligned.hpp
- * \author Andrey Semashev
- * \date   12.07.2013
- *
- * \brief  This header is the Boost.Log library implementation, see the library documentation
- *         at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
- */
-
-#ifndef BOOST_LOG_DETAIL_MALLOC_ALIGNED_HPP_INCLUDED_
-#define BOOST_LOG_DETAIL_MALLOC_ALIGNED_HPP_INCLUDED_
-
-#include <cstddef>
-#include <cstdlib>
-#include <boost/assert.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/log/detail/config.hpp>
-
-// MSVC has its own _aligned_malloc and _aligned_free functions.
-// But MinGW doesn't declare these aligned memory allocation routines for MSVC 6 runtime.
-#if defined(BOOST_WINDOWS) && !(defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x0700)
-#include <malloc.h>
-#define BOOST_LOG_HAS_MSVC_ALIGNED_MALLOC 1
-#endif
-
-#if defined(BOOST_HAS_UNISTD_H)
-#include <unistd.h> // _POSIX_VERSION
-#endif
-
-#if defined(__APPLE__) || defined(__APPLE_CC__) || defined(macintosh)
-#include <AvailabilityMacros.h>
-#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060)
-// Mac OS X 10.6 and later have posix_memalign
-#define BOOST_LOG_HAS_POSIX_MEMALIGN 1
-#endif
-#elif defined(__ANDROID__)
-// Android NDK (up to release 8e, at least) doesn't have posix_memalign despite it defines POSIX macros as if it does.
-// But we can use memalign() with free() on this platform.
-#include <malloc.h>
-#define BOOST_LOG_HAS_FREEABLE_MEMALIGN 1
-#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L)) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 600))
-// Solaris 10 does not have posix_memalign. Solaris 11 and later seem to have it.
-#if !(defined(sun) || defined(__sun)) || defined(__SunOS_5_11) || defined(__SunOS_5_12)
-#define BOOST_LOG_HAS_POSIX_MEMALIGN 1
-#endif
-#endif
-
-#include <boost/log/detail/header.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-#ifndef BOOST_LOG_CPU_CACHE_LINE_SIZE
-//! The macro defines the CPU cache line size for the target architecture. This is mostly used for optimization.
-#define BOOST_LOG_CPU_CACHE_LINE_SIZE 64
-#endif
-
-namespace boost {
-
-BOOST_LOG_OPEN_NAMESPACE
-
-namespace aux {
-
-/*!
- * Allocates uninitialized aligned memory. Memory alignment must be a power of 2 and a multiple of sizeof(void*).
- * The implementation may impose an upper bound of the alignment as well.
- */
-inline void* malloc_aligned(std::size_t size, uint32_t alignment)
-{
-#if defined(BOOST_LOG_HAS_POSIX_MEMALIGN)
-    void* p = NULL;
-    if (posix_memalign(&p, alignment, size) != 0)
-        return NULL;
-    return p;
-#elif defined(BOOST_LOG_HAS_FREEABLE_MEMALIGN)
-    return memalign(alignment, size);
-#elif defined(BOOST_LOG_HAS_MSVC_ALIGNED_MALLOC)
-    return _aligned_malloc(size, alignment);
-#else
-    BOOST_ASSERT(alignment >= sizeof(void*));
-    void* p = std::malloc(size + alignment);
-    if (p)
-    {
-        unsigned char* q = static_cast< unsigned char* >(p) + alignment;
-#if defined(BOOST_HAS_INTPTR_T)
-        q = (unsigned char*)((uintptr_t)q & (~(uintptr_t)(alignment - 1u)));
-#else
-        q -= ((std::size_t)q & (std::size_t)(alignment - 1u));
-#endif
-        // Here we assume that the system allocator aligns to 4 bytes at the very least.
-        // Therefore we will always have at least 4 bytes before the aligned pointer.
-        const uint32_t diff = q - static_cast< unsigned char* >(p);
-        p = q;
-        *reinterpret_cast< uint32_t* >(q - 4u) = diff;
-    }
-    return p;
-#endif
-}
-
-/*!
- * Frees memory allocated with \c malloc_aligned.
- */
-inline void free_aligned(void* p)
-{
-#if defined(BOOST_LOG_HAS_POSIX_MEMALIGN) || defined(BOOST_LOG_HAS_FREEABLE_MEMALIGN)
-    free(p);
-#elif defined(BOOST_LOG_HAS_MSVC_ALIGNED_MALLOC)
-    _aligned_free(p);
-#else
-    if (p)
-    {
-        unsigned char* const q = static_cast< unsigned char* >(p);
-        const uint32_t diff = *reinterpret_cast< uint32_t* >(q - 4u);
-        std::free(q - diff);
-    }
-#endif
-}
-
-} // namespace aux
-
-BOOST_LOG_CLOSE_NAMESPACE // namespace log
-
-} // namespace boost
-
-#include <boost/log/detail/footer.hpp>
-
-#endif // BOOST_LOG_DETAIL_MALLOC_ALIGNED_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/log/keywords/empty_marker.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2015.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   keywords/empty_marker.hpp
+ * \author Andrey Semashev
+ * \date   15.03.2014
+ *
+ * The header contains the \c empty_marker keyword declaration.
+ */
+
+#ifndef BOOST_LOG_KEYWORDS_EMPTY_MARKER_HPP_INCLUDED_
+#define BOOST_LOG_KEYWORDS_EMPTY_MARKER_HPP_INCLUDED_
+
+#include <boost/parameter/keyword.hpp>
+#include <boost/log/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace keywords {
+
+//! The keyword for passing the marker for the empty list of scopes to the \c named_scope formatter
+BOOST_PARAMETER_KEYWORD(tag, empty_marker)
+
+} // namespace keywords
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#endif // BOOST_LOG_KEYWORDS_EMPTY_MARKER_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/log/keywords/incomplete_marker.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2015.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   keywords/incomplete_marker.hpp
+ * \author Andrey Semashev
+ * \date   15.03.2014
+ *
+ * The header contains the \c incomplete_marker keyword declaration.
+ */
+
+#ifndef BOOST_LOG_KEYWORDS_INCOMPLETE_MARKER_HPP_INCLUDED_
+#define BOOST_LOG_KEYWORDS_INCOMPLETE_MARKER_HPP_INCLUDED_
+
+#include <boost/parameter/keyword.hpp>
+#include <boost/log/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace keywords {
+
+//! The keyword for passing incomplete marker for the list of scopes to the \c named_scope formatter
+BOOST_PARAMETER_KEYWORD(tag, incomplete_marker)
+
+} // namespace keywords
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#endif // BOOST_LOG_KEYWORDS_INCOMPLETE_MARKER_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/log/support/std_regex.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,86 @@
+/*
+ *          Copyright Andrey Semashev 2007 - 2015.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   support/std_regex.hpp
+ * \author Andrey Semashev
+ * \date   19.03.2014
+ *
+ * This header enables \c std::regex support for Boost.Log.
+ */
+
+#ifndef BOOST_LOG_SUPPORT_STD_REGEX_HPP_INCLUDED_
+#define BOOST_LOG_SUPPORT_STD_REGEX_HPP_INCLUDED_
+
+#include <boost/log/detail/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if defined(BOOST_NO_CXX11_HDR_REGEX)
+
+#if defined(__GNUC__)
+#pragma message "Boost.Log: This header requires support for std::regex in the standard library."
+#elif defined(_MSC_VER)
+#pragma message("Boost.Log: This header requires support for std::regex in the standard library.")
+#endif
+
+#else // defined(BOOST_NO_CXX11_HDR_REGEX)
+
+#include <regex>
+#include <string>
+#include <boost/log/utility/functional/matches.hpp>
+#include <boost/log/detail/header.hpp>
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace aux {
+
+//! This tag type is used if an expression is recognized as \c std::regex
+struct std_regex_expression_tag;
+
+//! The metafunction detects the matching expression kind and returns a tag that is used to specialize \c match_traits
+template< typename CharT, typename ReTraitsT >
+struct matching_expression_kind< std::basic_regex< CharT, ReTraitsT > >
+{
+    typedef std_regex_expression_tag type;
+};
+
+//! The matching function implementation
+template< typename ExpressionT >
+struct match_traits< ExpressionT, std_regex_expression_tag >
+{
+    typedef ExpressionT compiled_type;
+    static compiled_type compile(ExpressionT const& expr) { return expr; }
+
+    template< typename StringT, typename CharT, typename ReTraitsT >
+    static bool matches(StringT const& str, std::basic_regex< CharT, ReTraitsT > const& expr, std::regex_constants::match_flag_type flags = std::regex_constants::match_default)
+    {
+        return std::regex_match(str.begin(), str.end(), expr, flags);
+    }
+
+    template< typename CharT, typename StringTraitsT, typename AllocatorT, typename ReTraitsT >
+    static bool matches(std::basic_string< CharT, StringTraitsT, AllocatorT > const& str, std::basic_regex< CharT, ReTraitsT > const& expr, std::regex_constants::match_flag_type flags = std::regex_constants::match_default)
+    {
+        const CharT* p = str.c_str();
+        return std::regex_match(p, p + str.size(), expr, flags);
+    }
+};
+
+} // namespace aux
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // defined(BOOST_NO_CXX11_HDR_REGEX)
+
+#endif // BOOST_LOG_SUPPORT_STD_REGEX_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/make_unique.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License,
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_MAKE_UNIQUE_HPP_INCLUDED
+#define BOOST_MAKE_UNIQUE_HPP_INCLUDED
+
+#include <boost/smart_ptr/make_unique.hpp>
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/math/constants/generate.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-//  Copyright John Maddock 2010.
-//  Use, modification and distribution are subject to the
-//  Boost Software License, Version 1.0. (See accompanying file
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_MATH_CONSTANTS_GENERATE_INCLUDED
-#define BOOST_MATH_CONSTANTS_GENERATE_INCLUDED
-
-#include <boost/math/constants/constants.hpp>
-#include <boost/regex.hpp>
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-
-#ifdef USE_MPFR
-#include <boost/math/bindings/mpfr.hpp>
-#elif defined(USE_MPREAL)
-#include <boost/math/bindings/mpreal.hpp>
-#elif defined(USE_CPP_FLOAT)
-#include <boost/multiprecision/cpp_dec_float.hpp>
-#else
-#include <boost/math/bindings/rr.hpp>
-#endif
-
-namespace boost{ namespace math{ namespace constants{ 
-
-#ifdef USE_MPFR
-typedef mpfr_class generator_type;
-#elif defined(USE_MPREAL)
-typedef mpfr::mpreal generator_type;
-#elif defined(USE_CPP_FLOAT)
-typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<500> > generator_type;
-#else
-typedef ntl::RR generator_type;
-#endif
-
-inline void print_constant(const char* name, generator_type(*f)(const mpl::int_<0>&))
-{
-#ifdef USE_MPFR
-   mpfr_class::set_dprec(((200 + 1) * 1000L) / 301L);
-#elif defined(USE_MPREAL)
-   mpfr::mpreal::set_default_prec(((200 + 1) * 1000L) / 301L);
-#elif defined(USE_CPP_FLOAT)
-   // Nothing to do, precision is already set.
-#else
-   ntl::RR::SetPrecision(((200 + 1) * 1000L) / 301L);
-   ntl::RR::SetOutputPrecision(102);
-#endif
-   generator_type value = f(boost::mpl::int_<0>());
-   std::stringstream os;
-   os << std::setprecision(110) << std::scientific;
-   os << value;
-   std::string s = os.str();
-   static const regex e("([+-]?\\d+(?:\\.\\d{0,36})?)(\\d*)(?:e([+-]?\\d+))?");
-   smatch what;
-   if(regex_match(s, what, e))
-   {
-      std::cout << 
-         "BOOST_DEFINE_MATH_CONSTANT(" << name << ", " 
-         << what[1] << "e" << (what[3].length() ? what[3].str() : std::string("0")) << ", " 
-         << "\"" << what[1] << what[2] << "e" << (what[3].length() ? what[3].str() : std::string("0")) 
-         << "\");" << std::endl;
-   }
-   else
-   {
-      std::cout << "Format of numeric constant was not recognised!!" << std::endl;
-   }
-}
-
-#define BOOST_CONSTANTS_GENERATE(name) \
-   boost::math::constants::print_constant(#name, \
-   & boost::math::constants::detail::BOOST_JOIN(constant_, name)<boost::math::constants::generator_type>::get)
-
-}}} // namespaces
-
-#endif // BOOST_MATH_CONSTANTS_GENERATE_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_cmath.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,600 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision <cmath> support.
+
+#ifndef _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #include <cmath>
+  #include <stdexcept>
+  #include <boost/cstdint.hpp>
+  #include <boost/static_assert.hpp>
+  #include <boost/throw_exception.hpp>
+
+  #if defined(_WIN32) && defined(__GNUC__)
+    // Several versions of Mingw and probably cygwin too have broken
+    // libquadmath implementations that segfault as soon as you call
+    // expq or any function that depends on it.
+    #define BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+  #endif
+
+  // Here is a helper function used for raising the value of a given
+  // floating-point type to the power of n, where n has integral type.
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+
+  template<class float_type, class integer_type>
+  inline float_type pown(const float_type& x, const integer_type p)
+  {
+    const bool isneg  = (x < 0);
+    const bool isnan  = (x != x);
+    const bool isinf  = ((!isneg) ? bool(+x > (std::numeric_limits<float_type>::max)())
+                                  : bool(-x > (std::numeric_limits<float_type>::max)()));
+
+    if(isnan) { return x; }
+
+    if(isinf) { return std::numeric_limits<float_type>::quiet_NaN(); }
+
+    const bool       x_is_neg = (x < 0);
+    const float_type abs_x    = (x_is_neg ? -x : x);
+
+    if(p < static_cast<integer_type>(0))
+    {
+      if(abs_x < (std::numeric_limits<float_type>::min)())
+      {
+        return (x_is_neg ? -std::numeric_limits<float_type>::infinity()
+                         : +std::numeric_limits<float_type>::infinity());
+      }
+      else
+      {
+        return float_type(1) / pown(x, static_cast<integer_type>(-p));
+      }
+    }
+
+    if(p == static_cast<integer_type>(0))
+    {
+      return float_type(1);
+    }
+    else
+    {
+      if(p == static_cast<integer_type>(1)) { return x; }
+
+      if(abs_x > (std::numeric_limits<float_type>::max)())
+      {
+        return (x_is_neg ? -std::numeric_limits<float_type>::infinity()
+                         : +std::numeric_limits<float_type>::infinity());
+      }
+
+      if     (p == static_cast<integer_type>(2)) { return  (x * x); }
+      else if(p == static_cast<integer_type>(3)) { return ((x * x) * x); }
+      else if(p == static_cast<integer_type>(4)) { const float_type x2 = (x * x); return (x2 * x2); }
+      else
+      {
+        // The variable xn stores the binary powers of x.
+        float_type result(((p % integer_type(2)) != integer_type(0)) ? x : float_type(1));
+        float_type xn    (x);
+
+        integer_type p2 = p;
+
+        while(integer_type(p2 /= 2) != integer_type(0))
+        {
+          // Square xn for each binary power.
+          xn *= xn;
+
+          const bool has_binary_power = (integer_type(p2 % integer_type(2)) != integer_type(0));
+
+          if(has_binary_power)
+          {
+            // Multiply the result with each binary power contained in the exponent.
+            result *= xn;
+          }
+        }
+
+        return result;
+      }
+    }
+  }
+
+  } } } } // boost::math::cstdfloat::detail
+
+  // We will now define preprocessor symbols representing quadruple-precision <cmath> functions.
+  #if defined(BOOST_INTEL)
+    #define BOOST_CSTDFLOAT_FLOAT128_LDEXP  __ldexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FREXP  __frexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FABS   __fabsq
+    #define BOOST_CSTDFLOAT_FLOAT128_FLOOR  __floorq
+    #define BOOST_CSTDFLOAT_FLOAT128_CEIL   __ceilq
+    #if !defined(BOOST_CSTDFLOAT_FLOAT128_SQRT)
+    #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
+    #endif
+    #define BOOST_CSTDFLOAT_FLOAT128_TRUNC  __truncq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    __expq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXPM1  __expm1q
+    #define BOOST_CSTDFLOAT_FLOAT128_POW    __powq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG    __logq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG10  __log10q
+    #define BOOST_CSTDFLOAT_FLOAT128_SIN    __sinq
+    #define BOOST_CSTDFLOAT_FLOAT128_COS    __cosq
+    #define BOOST_CSTDFLOAT_FLOAT128_TAN    __tanq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASIN   __asinq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOS   __acosq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN   __atanq
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   __sinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   __coshq
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   __tanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  __asinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  __acoshq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  __atanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_FMOD   __fmodq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN2  __atan2q
+    #define BOOST_CSTDFLOAT_FLOAT128_LGAMMA __lgammaq
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA __tgammaq
+  #elif defined(__GNUC__)
+    #define BOOST_CSTDFLOAT_FLOAT128_LDEXP  ldexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FREXP  frexpq
+    #define BOOST_CSTDFLOAT_FLOAT128_FABS   fabsq
+    #define BOOST_CSTDFLOAT_FLOAT128_FLOOR  floorq
+    #define BOOST_CSTDFLOAT_FLOAT128_CEIL   ceilq
+    #if !defined(BOOST_CSTDFLOAT_FLOAT128_SQRT)
+    #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
+    #endif
+    #define BOOST_CSTDFLOAT_FLOAT128_TRUNC  truncq
+    #define BOOST_CSTDFLOAT_FLOAT128_POW    powq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG    logq
+    #define BOOST_CSTDFLOAT_FLOAT128_LOG10  log10q
+    #define BOOST_CSTDFLOAT_FLOAT128_SIN    sinq
+    #define BOOST_CSTDFLOAT_FLOAT128_COS    cosq
+    #define BOOST_CSTDFLOAT_FLOAT128_TAN    tanq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASIN   asinq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOS   acosq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN   atanq
+    #define BOOST_CSTDFLOAT_FLOAT128_FMOD   fmodq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATAN2  atan2q
+    #define BOOST_CSTDFLOAT_FLOAT128_LGAMMA lgammaq
+    #if !defined(BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS)
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    expq
+    #define BOOST_CSTDFLOAT_FLOAT128_EXPM1  expm1q_internal
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   sinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   coshq
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   tanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  asinhq
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  acoshq
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  atanhq
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA tgammaq
+    #else // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+    #define BOOST_CSTDFLOAT_FLOAT128_EXP    expq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_SINH   sinhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_COSH   coshq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_TANH   tanhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ASINH  asinhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ACOSH  acoshq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_ATANH  atanhq_patch
+    #define BOOST_CSTDFLOAT_FLOAT128_TGAMMA tgammaq_patch
+    #endif // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+  #endif 
+
+  // Implement quadruple-precision <cmath> functions in the namespace
+  // boost::math::cstdfloat::detail. Subsequently inject these into the
+  // std namespace via *using* directive.
+
+  // Begin with some forward function declarations. Also implement patches
+  // for compilers that have broken float128 exponential functions.
+
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LDEXP (boost::math::cstdfloat::detail::float_internal128_t, int)  throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FREXP (boost::math::cstdfloat::detail::float_internal128_t, int*) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FABS  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FLOOR (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_CEIL  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TRUNC (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_POW   (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LOG   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LOG10 (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SIN   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COS   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TAN   (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASIN  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOS  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATAN  (boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_FMOD  (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATAN2 (boost::math::cstdfloat::detail::float_internal128_t, boost::math::cstdfloat::detail::float_internal128_t) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_LGAMMA(boost::math::cstdfloat::detail::float_internal128_t) throw();
+
+  #if !defined(BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS)
+
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SINH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COSH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TANH  (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASINH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOSH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATANH (boost::math::cstdfloat::detail::float_internal128_t x) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TGAMMA(boost::math::cstdfloat::detail::float_internal128_t x) throw();
+
+  #else // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+
+  // Forward declaration of the patched exponent function, exp(x).
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x);
+
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXPM1 (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Compute exp(x) - 1 for x small.
+
+    // Use an order-36 polynomial approximation of the exponential function
+    // in the range of (-ln2 < x < ln2). Scale the argument to this range
+    // and subsequently multiply the result by 2^n accordingly.
+
+    // Derive the polynomial coefficients with Mathematica(R) by generating
+    // a table of high-precision values of exp(x) in the range (-ln2 < x < ln2)
+    // and subsequently applying the built-in *Fit* function.
+
+    // Table[{x, Exp[x] - 1}, {x, -Log[2], Log[2], 1/180}]
+    // N[%, 120]
+    // Fit[%, {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10, x^11, x^12,
+    //         x^13, x^14, x^15, x^16, x^17, x^18, x^19, x^20, x^21, x^22,
+    //         x^23, x^24, x^25, x^26, x^27, x^28, x^29, x^30, x^31, x^32,
+    //         x^33, x^34, x^35, x^36}, x]
+
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    float_type sum;
+
+    if(x > BOOST_FLOAT128_C(0.693147180559945309417232121458176568075500134360255))
+    {
+      sum = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x) - float_type(1);
+    }
+    else
+    {
+      // Compute the polynomial approximation of exp(alpha).
+      sum = ((((((((((((((((((((((((((((((((((((  float_type(BOOST_FLOAT128_C(2.69291698127774166063293705964720493864630783729857438187365E-42))  * x
+                                                + float_type(BOOST_FLOAT128_C(9.70937085471487654794114679403710456028986572118859594614033E-41))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.38715585158055097155585505318085512156885389014410753080500E-39))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.15162718532861050809222658798662695267019717760563645440433E-37))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.80039074689434663295873584133017767349635602413675471702393E-36))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.21612504934087520075905434734158045947460467096773246215239E-34))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.76998762883139753126119821241037824830069851253295480396224E-33))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.13099628863830344684998293828608215735777107850991029729440E-31))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.27988923706982293204067897468714277771890104022419696770352E-30))) * x
+                                                + float_type(BOOST_FLOAT128_C(9.18368986379558482800593745627556950089950023355628325088207E-29))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.47959626322479746949155352659617642905315302382639380521497E-27))) * x
+                                                + float_type(BOOST_FLOAT128_C(6.44695028438447337900255966737803112935639344283098705091949E-26))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.61173757109611834904452725462599961406036904573072897122957E-24))) * x
+                                                + float_type(BOOST_FLOAT128_C(3.86817017063068403772269360016918092488847584660382953555804E-23))) * x
+                                                + float_type(BOOST_FLOAT128_C(8.89679139245057328674891109315654704307721758924206107351744E-22))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.95729410633912612308475595397946731738088422488032228717097E-20))) * x
+                                                + float_type(BOOST_FLOAT128_C(4.11031762331216485847799061511674191805055663711439605760231E-19))) * x
+                                                + float_type(BOOST_FLOAT128_C(8.22063524662432971695598123977873600603370758794431071426640E-18))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.56192069685862264622163643500633782667263448653185159383285E-16))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.81145725434552076319894558300988749849555291507956994126835E-15))) * x
+                                                + float_type(BOOST_FLOAT128_C(4.77947733238738529743820749111754320727153728139716409114011E-14))) * x
+                                                + float_type(BOOST_FLOAT128_C(7.64716373181981647590113198578807092707697416852226691068627E-13))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.14707455977297247138516979786821056670509688396295740818677E-11))) * x
+                                                + float_type(BOOST_FLOAT128_C(1.60590438368216145993923771701549479323291461578567184216302E-10))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.08767569878680989792100903212014323125428376052986408239620E-09))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.50521083854417187750521083854417187750523408006206780016659E-08))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.75573192239858906525573192239858906525573195144226062684604E-07))) * x
+                                                + float_type(BOOST_FLOAT128_C(2.75573192239858906525573192239858906525573191310049321957902E-06))) * x
+                                                + float_type(BOOST_FLOAT128_C(0.00002480158730158730158730158730158730158730158730149317774)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00019841269841269841269841269841269841269841269841293575920)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00138888888888888888888888888888888888888888888888889071045)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.00833333333333333333333333333333333333333333333333332986595)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.04166666666666666666666666666666666666666666666666666664876)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.16666666666666666666666666666666666666666666666666666669048)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.50000000000000000000000000000000000000000000000000000000006)))     * x
+                                                + float_type(BOOST_FLOAT128_C(0.99999999999999999999999999999999999999999999999999999999995)))     * x);
+    }
+
+    return sum;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_EXP   (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the expq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+
+    // Use an order-36 polynomial approximation of the exponential function
+    // in the range of (-ln2 < x < ln2). Scale the argument to this range
+    // and subsequently multiply the result by 2^n accordingly.
+
+    // Derive the polynomial coefficients with Mathematica(R) by generating
+    // a table of high-precision values of exp(x) in the range (-ln2 < x < ln2)
+    // and subsequently applying the built-in *Fit* function.
+
+    // Table[{x, Exp[x] - 1}, {x, -Log[2], Log[2], 1/180}]
+    // N[%, 120]
+    // Fit[%, {x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10, x^11, x^12,
+    //         x^13, x^14, x^15, x^16, x^17, x^18, x^19, x^20, x^21, x^22,
+    //         x^23, x^24, x^25, x^26, x^27, x^28, x^29, x^30, x^31, x^32,
+    //         x^33, x^34, x^35, x^36}, x]
+
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    // Scale the argument x to the range (-ln2 < x < ln2).
+    BOOST_CONSTEXPR_OR_CONST float_type one_over_ln2 = float_type(BOOST_FLOAT128_C(1.44269504088896340735992468100189213742664595415299));
+    const float_type x_over_ln2   = x * one_over_ln2;
+
+    boost::int_fast32_t n;
+
+    if(x != x)
+    {
+      // The argument is NaN.
+      return std::numeric_limits<float_type>::quiet_NaN();
+    }
+    else if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) > BOOST_FLOAT128_C(+0.693147180559945309417232121458176568075500134360255))
+    {
+      // The absolute value of the argument exceeds ln2.
+      n = static_cast<boost::int_fast32_t>(::BOOST_CSTDFLOAT_FLOAT128_FLOOR(x_over_ln2));
+    }
+    else if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) < BOOST_FLOAT128_C(+0.693147180559945309417232121458176568075500134360255))
+    {
+      // The absolute value of the argument is less than ln2.
+      n = static_cast<boost::int_fast32_t>(0);
+    }
+    else
+    {
+      // The absolute value of the argument is exactly equal to ln2 (in the sense of floating-point equality).
+      return float_type(2);
+    }
+
+    // Check if the argument is very near an integer.
+    const float_type floor_of_x = ::BOOST_CSTDFLOAT_FLOAT128_FLOOR(x);
+
+    if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x - floor_of_x) < float_type(BOOST_CSTDFLOAT_FLOAT128_EPS))
+    {
+      // Return e^n for arguments very near an integer.
+      return boost::math::cstdfloat::detail::pown(BOOST_FLOAT128_C(2.71828182845904523536028747135266249775724709369996), static_cast<boost::int_fast32_t>(floor_of_x));
+    }
+
+    // Compute the scaled argument alpha.
+    const float_type alpha = x - (n * BOOST_FLOAT128_C(0.693147180559945309417232121458176568075500134360255));
+
+    // Compute the polynomial approximation of expm1(alpha) and add to it
+    // in order to obtain the scaled result.
+    const float_type scaled_result = ::BOOST_CSTDFLOAT_FLOAT128_EXPM1(alpha) + float_type(1);
+
+    // Rescale the result and return it.
+    return scaled_result * boost::math::cstdfloat::detail::pown(float_type(2), n);
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SINH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the sinhq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    // Here, we use the following:
+    // Set: ex  = exp(x)
+    // Set: em1 = expm1(x)
+    // Then
+    // sinh(x) = (ex - 1/ex) / 2         ; for |x| >= 1
+    // sinh(x) = (2em1 + em1^2) / (2ex)  ; for |x| < 1
+
+    const float_type ex = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+
+    if(::BOOST_CSTDFLOAT_FLOAT128_FABS(x) < float_type(+1))
+    {
+      const float_type em1 = ::BOOST_CSTDFLOAT_FLOAT128_EXPM1(x);
+
+      return ((em1 * 2) + (em1 * em1)) / (ex * 2);
+    }
+    else
+    {
+      return (ex - (float_type(1) / ex)) / 2;
+    }
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_COSH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the coshq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type ex = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+    return (ex + (float_type(1) / ex)) / 2;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TANH  (boost::math::cstdfloat::detail::float_internal128_t x)
+  {
+    // Patch the tanhq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type ex_plus  = ::BOOST_CSTDFLOAT_FLOAT128_EXP(x);
+    const float_type ex_minus = (float_type(1) / ex_plus);
+    return (ex_plus - ex_minus) / (ex_plus + ex_minus);
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ASINH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the asinh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    return ::BOOST_CSTDFLOAT_FLOAT128_LOG(x + ::BOOST_CSTDFLOAT_FLOAT128_SQRT((x * x) + float_type(1)));
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ACOSH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the acosh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    const float_type zp(x + float_type(1));
+    const float_type zm(x - float_type(1));
+
+    return ::BOOST_CSTDFLOAT_FLOAT128_LOG(x + (zp * ::BOOST_CSTDFLOAT_FLOAT128_SQRT(zm / zp)));
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_ATANH(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the atanh() function since quadmath does not have it.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+    return (  ::BOOST_CSTDFLOAT_FLOAT128_LOG(float_type(1) + x)
+            - ::BOOST_CSTDFLOAT_FLOAT128_LOG(float_type(1) - x)) / 2;
+  }
+  inline     boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_TGAMMA(boost::math::cstdfloat::detail::float_internal128_t x) throw()
+  {
+    // Patch the tgammaq() function for a subset of broken GCC compilers
+    // like GCC 4.7, 4.8 on MinGW.
+    typedef boost::math::cstdfloat::detail::float_internal128_t float_type;
+
+    if(x > float_type(0))
+    {
+      return ::BOOST_CSTDFLOAT_FLOAT128_EXP(::BOOST_CSTDFLOAT_FLOAT128_LGAMMA(x));
+    }
+    else if(x < float_type(0))
+    {
+      // For x < 0, compute tgamma(-x) and use the reflection formula.
+      const float_type positive_x          = -x;
+            float_type gamma_value         = ::BOOST_CSTDFLOAT_FLOAT128_TGAMMA(positive_x);
+      const float_type floor_of_positive_x = ::BOOST_CSTDFLOAT_FLOAT128_FLOOR (positive_x);
+
+      // Take the reflection checks (slightly adapted) from <boost/math/gamma.hpp>.
+      const bool floor_of_z_is_equal_to_z = (positive_x == ::BOOST_CSTDFLOAT_FLOAT128_FLOOR(positive_x));
+
+      BOOST_CONSTEXPR_OR_CONST float_type my_pi = BOOST_FLOAT128_C(3.14159265358979323846264338327950288419716939937511);
+
+      if(floor_of_z_is_equal_to_z)
+      {
+        const bool is_odd = ((boost::int32_t(floor_of_positive_x) % boost::int32_t(2)) != boost::int32_t(0));
+
+        return (is_odd ? -std::numeric_limits<float_type>::infinity()
+                       : +std::numeric_limits<float_type>::infinity());
+      }
+
+      const float_type sinpx_value = x * ::BOOST_CSTDFLOAT_FLOAT128_SIN(my_pi * x);
+
+      gamma_value *= sinpx_value;
+
+      const bool result_is_too_large_to_represent = (   (::BOOST_CSTDFLOAT_FLOAT128_FABS(gamma_value) < float_type(1))
+                                                     && (((std::numeric_limits<float_type>::max)() * ::BOOST_CSTDFLOAT_FLOAT128_FABS(gamma_value)) < my_pi));
+
+      if(result_is_too_large_to_represent)
+      {
+        const bool is_odd = ((boost::int32_t(floor_of_positive_x) % boost::int32_t(2)) != boost::int32_t(0));
+
+        return (is_odd ? -std::numeric_limits<float_type>::infinity()
+                       : +std::numeric_limits<float_type>::infinity());
+      }
+
+      gamma_value = -my_pi / gamma_value;
+
+      if((gamma_value > float_type(0)) || (gamma_value < float_type(0)))
+      {
+        return gamma_value;
+      }
+      else
+      {
+        // The value of gamma is too small to represent. Return 0.0 here.
+        return float_type(0);
+      }
+    }
+    else
+    {
+      // Gamma of zero is complex infinity. Return NaN here.
+      return std::numeric_limits<float_type>::quiet_NaN();
+    }
+  }
+  #endif // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
+
+  // Define the quadruple-precision <cmath> functions in the namespace boost::math::cstdfloat::detail.
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+  inline   boost::math::cstdfloat::detail::float_internal128_t ldexp (boost::math::cstdfloat::detail::float_internal128_t x, int n)                                                 { return ::BOOST_CSTDFLOAT_FLOAT128_LDEXP (x, n); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t frexp (boost::math::cstdfloat::detail::float_internal128_t x, int* pn)                                               { return ::BOOST_CSTDFLOAT_FLOAT128_FREXP (x, pn); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t fabs  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FABS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t abs   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FABS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t floor (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_FLOOR (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t ceil  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_CEIL  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sqrt  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SQRT  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t trunc (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TRUNC (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t exp   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_EXP   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t pow   (boost::math::cstdfloat::detail::float_internal128_t x, boost::math::cstdfloat::detail::float_internal128_t a) { return ::BOOST_CSTDFLOAT_FLOAT128_POW   (x, a); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t pow   (boost::math::cstdfloat::detail::float_internal128_t x, int a)                                                 { return ::BOOST_CSTDFLOAT_FLOAT128_POW   (x, boost::math::cstdfloat::detail::float_internal128_t(a)); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t log   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LOG   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t log10 (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LOG10 (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sin   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SIN   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t cos   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_COS   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tan   (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TAN   (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t asin  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ASIN  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t acos  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ACOS  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atan  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ATAN  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t sinh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_SINH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t cosh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_COSH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tanh  (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TANH  (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t asinh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ASINH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t acosh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ACOSH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atanh (boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_ATANH (x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t fmod  (boost::math::cstdfloat::detail::float_internal128_t a, boost::math::cstdfloat::detail::float_internal128_t b) { return ::BOOST_CSTDFLOAT_FLOAT128_FMOD  (a, b); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t atan2 (boost::math::cstdfloat::detail::float_internal128_t y, boost::math::cstdfloat::detail::float_internal128_t x) { return ::BOOST_CSTDFLOAT_FLOAT128_ATAN2 (y, x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t lgamma(boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_LGAMMA(x); }
+  inline   boost::math::cstdfloat::detail::float_internal128_t tgamma(boost::math::cstdfloat::detail::float_internal128_t x)                                                        { return ::BOOST_CSTDFLOAT_FLOAT128_TGAMMA(x); }
+  } } } } // boost::math::cstdfloat::detail
+
+  // We will now inject the quadruple-precision <cmath> functions
+  // into the std namespace. This is done via *using* directive.
+  namespace std
+  {
+    using boost::math::cstdfloat::detail::ldexp;
+    using boost::math::cstdfloat::detail::frexp;
+    using boost::math::cstdfloat::detail::fabs;
+    using boost::math::cstdfloat::detail::abs;
+    using boost::math::cstdfloat::detail::floor;
+    using boost::math::cstdfloat::detail::ceil;
+    using boost::math::cstdfloat::detail::sqrt;
+    using boost::math::cstdfloat::detail::trunc;
+    using boost::math::cstdfloat::detail::exp;
+    using boost::math::cstdfloat::detail::pow;
+    using boost::math::cstdfloat::detail::log;
+    using boost::math::cstdfloat::detail::log10;
+    using boost::math::cstdfloat::detail::sin;
+    using boost::math::cstdfloat::detail::cos;
+    using boost::math::cstdfloat::detail::tan;
+    using boost::math::cstdfloat::detail::asin;
+    using boost::math::cstdfloat::detail::acos;
+    using boost::math::cstdfloat::detail::atan;
+    using boost::math::cstdfloat::detail::sinh;
+    using boost::math::cstdfloat::detail::cosh;
+    using boost::math::cstdfloat::detail::tanh;
+    using boost::math::cstdfloat::detail::asinh;
+    using boost::math::cstdfloat::detail::acosh;
+    using boost::math::cstdfloat::detail::atanh;
+    using boost::math::cstdfloat::detail::fmod;
+    using boost::math::cstdfloat::detail::atan2;
+    using boost::math::cstdfloat::detail::lgamma;
+    using boost::math::cstdfloat::detail::tgamma;
+  } // namespace std
+
+  // We will now remove the preprocessor symbols representing quadruple-precision <cmath>
+  // functions from the preprocessor.
+
+  #undef BOOST_CSTDFLOAT_FLOAT128_LDEXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_FREXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_FABS
+  #undef BOOST_CSTDFLOAT_FLOAT128_FLOOR
+  #undef BOOST_CSTDFLOAT_FLOAT128_CEIL
+  #undef BOOST_CSTDFLOAT_FLOAT128_SQRT
+  #undef BOOST_CSTDFLOAT_FLOAT128_TRUNC
+  #undef BOOST_CSTDFLOAT_FLOAT128_EXP
+  #undef BOOST_CSTDFLOAT_FLOAT128_EXPM1
+  #undef BOOST_CSTDFLOAT_FLOAT128_POW
+  #undef BOOST_CSTDFLOAT_FLOAT128_LOG
+  #undef BOOST_CSTDFLOAT_FLOAT128_LOG10
+  #undef BOOST_CSTDFLOAT_FLOAT128_SIN
+  #undef BOOST_CSTDFLOAT_FLOAT128_COS
+  #undef BOOST_CSTDFLOAT_FLOAT128_TAN
+  #undef BOOST_CSTDFLOAT_FLOAT128_ASIN
+  #undef BOOST_CSTDFLOAT_FLOAT128_ACOS
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATAN
+  #undef BOOST_CSTDFLOAT_FLOAT128_SINH
+  #undef BOOST_CSTDFLOAT_FLOAT128_COSH
+  #undef BOOST_CSTDFLOAT_FLOAT128_TANH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ASINH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ACOSH
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATANH
+  #undef BOOST_CSTDFLOAT_FLOAT128_FMOD
+  #undef BOOST_CSTDFLOAT_FLOAT128_ATAN2
+  #undef BOOST_CSTDFLOAT_FLOAT128_LGAMMA
+  #undef BOOST_CSTDFLOAT_FLOAT128_TGAMMA
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_CMATH_2014_02_15_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_complex.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision (and extended) support for <complex>.
+
+#ifndef _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_iostream.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_LIMITS defined.
+  #endif
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+  #endif
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_complex.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_IOSTREAM defined.
+  #endif
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #define BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE boost::math::cstdfloat::detail::float_internal128_t
+  #include <boost/math/cstdfloat/cstdfloat_complex_std.hpp>
+  #undef BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_COMPLEX_2014_02_15_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_complex_std.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,641 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement a specialization of std::complex<> for *anything* that
+// is defined as BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE.
+
+#ifndef _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
+
+  #if defined(__GNUC__)
+  #pragma GCC system_header
+  #endif
+
+  #include <complex>
+  #include <boost/math/constants/constants.hpp>
+
+  namespace std
+  {
+    // Forward declarations.
+    template<class float_type>
+    class complex;
+
+    template<>
+    class complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>;
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE real(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE imag(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE abs (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE arg (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE norm(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> conj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> proj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> polar(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& = 0);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sqrt (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sin  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cos  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tan  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asin (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acos (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atan (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> exp  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log10(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      int);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&,
+                                                                      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow  (const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&,
+                                                                      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sinh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cosh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tanh (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    template<class char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>&, const std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    template<class char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>&, std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>&);
+
+    // Template specialization of the complex class.
+    template<>
+    class complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>
+    {
+    public:
+      typedef BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE value_type;
+
+      explicit complex(const complex<float>&);
+      explicit complex(const complex<double>&);
+      explicit complex(const complex<long double>&);
+
+      #if defined(BOOST_NO_CXX11_CONSTEXPR)
+      complex(const value_type& r = value_type(),
+              const value_type& i = value_type()) : re(r),
+                                                    im(i) { }
+
+      template<typename X>
+      complex(const complex<X>& x) : re(x.real()),
+                                     im(x.imag()) { }
+
+      const value_type& real() const { return re; }
+      const value_type& imag() const { return im; }
+
+      value_type& real() { return re; }
+      value_type& imag() { return im; }
+      #else
+      BOOST_CONSTEXPR complex(const value_type& r = value_type(),
+                              const value_type& i = value_type()) : re(r),
+                                                                    im(i) { }
+
+      template<typename X>
+      BOOST_CONSTEXPR complex(const complex<X>& x) : re(x.real()),
+                                                     im(x.imag()) { }
+
+      value_type real() const { return re; }
+      value_type imag() const { return im; }
+      #endif
+
+      void real(value_type r) { re = r; }
+      void imag(value_type i) { im = i; }
+
+      complex<value_type>& operator=(const value_type& v)
+      {
+        re = v;
+        im = value_type(0);
+        return *this;
+      }
+
+      complex<value_type>& operator+=(const value_type& v)
+      {
+        re += v;
+        return *this;
+      }
+
+      complex<value_type>& operator-=(const value_type& v)
+      {
+        re -= v;
+        return *this;
+      }
+
+      complex<value_type>& operator*=(const value_type& v)
+      {
+        re *= v;
+        im *= v;
+        return *this;
+      }
+
+      complex<value_type>& operator/=(const value_type& v)
+      {
+        re /= v;
+        im /= v;
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator=(const complex<X>& x)
+      {
+        re = x.real();
+        im = x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator+=(const complex<X>& x)
+      {
+        re += x.real();
+        im += x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator-=(const complex<X>& x)
+      {
+        re -= x.real();
+        im -= x.imag();
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator*=(const complex<X>& x)
+      {
+        const value_type tmp_real = (re * x.real()) - (im * x.imag());
+        im = (re * x.imag()) + (im * x.real());
+        re = tmp_real;
+        return *this;
+      }
+
+      template<typename X>
+      complex<value_type>& operator/=(const complex<X>& x)
+      {
+        const value_type tmp_real = (re * x.real()) + (im * x.imag());
+        const value_type the_norm = std::norm(x);
+        im = ((im * x.real()) - (re * x.imag())) / the_norm;
+        re = tmp_real / the_norm;
+        return *this;
+      }
+
+      private:
+        value_type re;
+        value_type im;
+    };
+
+    // Constructors from built-in complex representation of floating-point types.
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<float>& f)        : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( f.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( f.imag())) { }
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<double>& d)       : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( d.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE( d.imag())) { }
+    complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::complex(const complex<long double>& ld) : re(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(ld.real())), im(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(ld.imag())) { }
+  } // namespace std
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+  template<class float_type> std::complex<float_type> multiply_by_i(const std::complex<float_type>& x)
+  {
+    // Multiply x (in C) by I (the imaginary component), and return the result.
+    return std::complex<float_type>(-x.imag(), x.real());
+  }
+  } } } } // boost::math::cstdfloat::detail
+
+  namespace std
+  {
+    // ISO/IEC 14882:2011, Section 26.4.7, specific values.
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE real(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return x.real(); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE imag(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return x.imag(); }
+
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE abs (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { using std::sqrt;  return sqrt ((real(x) * real(x)) + (imag(x) * imag(x))); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE arg (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { using std::atan2; return atan2(x.imag(), x.real()); }
+    inline BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE norm(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return (real(x) * real(x)) + (imag(x) * imag(x)); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> conj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(x.real(), -x.imag()); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> proj (const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE m = (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)();
+      if ((x.real() > m)
+        || (x.real() < -m)
+        || (x.imag() > m)
+        || (x.imag() < -m))
+      {
+        // We have an infinity, return a normalized infinity, respecting the sign of the imaginary part:
+         return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity(), x.imag() < 0 ? -0 : 0);
+      }
+      return x;
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> polar(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& rho,
+                                                                      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& theta)
+    {
+      using std::sin;
+      using std::cos;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(rho * cos(theta), rho * sin(theta));
+    }
+
+    // Global add, sub, mul, div.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() + v.real(), u.imag() + v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() - v.real(), u.imag() - v.imag()); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v)
+    {
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>((u.real() * v.real()) - (u.imag() * v.imag()),
+                                                                  (u.real() * v.imag()) + (u.imag() * v.real()));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE the_norm = std::norm(v);
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(((u.real() * v.real()) + (u.imag() * v.imag())) / the_norm,
+                                                                  ((u.imag() * v.real()) - (u.real() * v.imag())) / the_norm);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() + v, u.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() - v, u.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() * v, u.imag() * v); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u, const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u.real() / v, u.imag() / v); }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u + v.real(),     v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u - v.real(),    -v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator*(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(u * v.real(), u * v.imag()); }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator/(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& u, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& v) { const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE v_norm = norm(v); return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>((u * v.real()) / v_norm, (-u * v.imag()) / v_norm); }
+
+    // Unary plus / minus.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator+(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u) { return u; }
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> operator-(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& u) { return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(-u.real(), -u.imag()); }
+
+    // Equality and inequality.
+    inline bool operator==(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x.real() == y.real()) && (x.imag() == y.imag())); }
+    inline bool operator==(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  y) { return ((x.real() == y)        && (x.imag() == BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator==(const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x        == y.real()) && (y.imag() == BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator!=(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x.real() != y.real()) || (x.imag() != y.imag())); }
+    inline bool operator!=(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x, const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  y) { return ((x.real() != y)        || (x.imag() != BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+    inline bool operator!=(const         BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE&  x, const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& y) { return ((x        != y.real()) || (y.imag() != BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(0))); }
+
+    // ISO/IEC 14882:2011, Section 26.4.8, transcendentals.
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sqrt(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::fabs;
+      using std::sqrt;
+
+      // Compute sqrt(x) for x in C:
+      // sqrt(x) = (s       , xi / 2s) : for xr > 0,
+      //           (|xi| / 2s, +-s)    : for xr < 0,
+      //           (sqrt(xi), sqrt(xi) : for xr = 0,
+      // where s = sqrt{ [ |xr| + sqrt(xr^2 + xi^2) ] / 2 },
+      // and the +- sign is the same as the sign of xi.
+
+      if(x.real() > 0)
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE s = sqrt((fabs(x.real()) + std::abs(x)) / 2);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(s, x.imag() / (s * 2));
+      }
+      else if(x.real() < 0)
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE s = sqrt((fabs(x.real()) + std::abs(x)) / 2);
+
+        const bool imag_is_neg = (x.imag() < 0);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(fabs(x.imag()) / (s * 2), (imag_is_neg ? -s : s));
+      }
+      else
+      {
+        const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sqrt_xi_half = sqrt(x.imag() / 2);
+
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sqrt_xi_half, sqrt_xi_half);
+      }
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sin(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sin_x * cosh_y, cos_x * sinh_y);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cos(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_x * cosh_y, -(sin_x * sinh_y));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tan(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_x  = sin (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_x  = cos (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_yp = exp (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_ym = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_yp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_y = (exp_yp - exp_ym) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_y = (exp_yp + exp_ym) / 2;
+
+      return (  complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(sin_x * cosh_y,  cos_x * sinh_y)
+              / complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_x * cosh_y, -sin_x * sinh_y));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asin(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return -boost::math::cstdfloat::detail::multiply_by_i(std::log(boost::math::cstdfloat::detail::multiply_by_i(x) + std::sqrt(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - (x * x))));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acos(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return boost::math::constants::half_pi<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>() - std::asin(x);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atan(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> izz = boost::math::cstdfloat::detail::multiply_by_i(x);
+
+      return boost::math::cstdfloat::detail::multiply_by_i(std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - izz) - std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) + izz)) / 2;
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> exp(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::exp;
+
+      return std::polar(exp(x.real()), x.imag());
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::atan2;
+      using std::log;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(log(std::norm(x)) / 2, atan2(x.imag(), x.real()));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> log10(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return std::log(x) / boost::math::constants::ln_ten<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>();
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    int p)
+    {
+      const bool re_isneg  = (x.real() < 0);
+      const bool re_isnan  = (x.real() != x.real());
+      const bool re_isinf  = ((!re_isneg) ? bool(+x.real() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+                                          : bool(-x.real() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)()));
+
+      const bool im_isneg  = (x.imag() < 0);
+      const bool im_isnan  = (x.imag() != x.imag());
+      const bool im_isinf  = ((!im_isneg) ? bool(+x.imag() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+                                          : bool(-x.imag() > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)()));
+
+      if(re_isnan || im_isnan) { return x; }
+
+      if(re_isinf || im_isinf)
+      {
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::quiet_NaN(),
+                                                                    std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::quiet_NaN());
+      }
+
+      if(p < 0)
+      {
+        if(std::abs(x) < (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::min)())
+        {
+          return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity(),
+                                                                      std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+        }
+        else
+        {
+          return BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / std::pow(x, -p);
+        }
+      }
+
+      if(p == 0)
+      {
+        return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1));
+      }
+      else
+      {
+        if(p == 1) { return x; }
+
+        if(std::abs(x) > (std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::max)())
+        {
+          const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE re = (re_isneg ? -std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity()
+                                                                           : +std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+
+          const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE im = (im_isneg ? -std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity()
+                                                                           : +std::numeric_limits<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>::infinity());
+
+          return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(re, im);
+        }
+
+        if     (p == 2) { return  (x * x); }
+        else if(p == 3) { return ((x * x) * x); }
+        else if(p == 4) { const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> x2 = (x * x); return (x2 * x2); }
+        else
+        {
+          // The variable xn stores the binary powers of x.
+          complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> result(((p % 2) != 0) ? x : complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1)));
+          complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> xn    (x);
+
+          int p2 = p;
+
+          while((p2 /= 2) != 0)
+          {
+            // Square xn for each binary power.
+            xn *= xn;
+
+            const bool has_binary_power = ((p2 % 2) != 0);
+
+            if(has_binary_power)
+            {
+              // Multiply the result with each binary power contained in the exponent.
+              result *= xn;
+            }
+          }
+
+          return result;
+        }
+      }
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x,
+                                                                    const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> pow(const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE& x,
+                                                                    const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& a)
+    {
+      return std::exp(a * std::log(x));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> sinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_y  = sin (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_y  = cos (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xp = exp (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xm = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_xp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_x = (exp_xp - exp_xm) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_x = (exp_xp + exp_xm) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_y * sinh_x, cosh_x * sin_y);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> cosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      using std::sin;
+      using std::cos;
+      using std::exp;
+
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sin_y  = sin (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cos_y  = cos (x.imag());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xp = exp (x.real());
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE exp_xm = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / exp_xp;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE sinh_x = (exp_xp - exp_xm) / 2;
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE cosh_x = (exp_xp + exp_xm) / 2;
+
+      return complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(cos_y * cosh_x, sin_y * sinh_x);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> tanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> ex_plus  = std::exp(x);
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> ex_minus = BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) / ex_plus;
+
+      return (ex_plus - ex_minus) / (ex_plus + ex_minus);
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> asinh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return std::log(x + std::sqrt((x * x) + BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1)));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> acosh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      const BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE my_one(1);
+
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> zp(x.real() + my_one, x.imag());
+      const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> zm(x.real() - my_one, x.imag());
+
+      return std::log(x + (zp * std::sqrt(zm / zp)));
+    }
+
+    inline complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE> atanh(const complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      return (std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) + x) - std::log(BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE(1) - x)) / 2.0;
+    }
+
+    template<class char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      std::basic_ostringstream<char_type, traits_type> ostr;
+
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      ostr << char_type('(')
+           << x.real()
+           << char_type(',')
+           << x.imag()
+           << char_type(')');
+
+      return (os << ostr.str());
+    }
+
+    template<class char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, std::complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>& x)
+    {
+      BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE rx;
+      BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE ix;
+
+      char_type the_char;
+
+      static_cast<void>(is >> the_char);
+
+      if(the_char == static_cast<char_type>('('))
+      {
+        static_cast<void>(is >> rx >> the_char);
+
+        if(the_char == static_cast<char_type>(','))
+        {
+          static_cast<void>(is >> ix >> the_char);
+
+          if(the_char == static_cast<char_type>(')'))
+          {
+            x = complex<BOOST_CSTDFLOAT_EXTENDED_COMPLEX_FLOAT_TYPE>(rx, ix);
+          }
+          else
+          {
+            is.setstate(ios_base::failbit);
+          }
+        }
+        else if(the_char == static_cast<char_type>(')'))
+        {
+          x = rx;
+        }
+        else
+        {
+          is.setstate(ios_base::failbit);
+        }
+      }
+      else
+      {
+        static_cast<void>(is.putback(the_char));
+
+        static_cast<void>(is >> rx);
+
+        x = rx;
+      }
+
+      return is;
+    }
+  } // namespace std
+
+#endif // _BOOST_CSTDFLOAT_COMPLEX_STD_2014_02_15_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_iostream.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,771 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision I/O stream operations.
+
+#ifndef _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
+  #define _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_limits.hpp>
+  #include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH)
+  #error You can not use <boost/math/cstdfloat/cstdfloat_iostream.hpp> with BOOST_CSTDFLOAT_NO_LIBQUADMATH_CMATH defined.
+  #endif
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+  #include <cstddef>
+  #include <istream>
+  #include <ostream>
+  #include <sstream>
+  #include <stdexcept>
+  #include <string>
+  #include <boost/static_assert.hpp>
+  #include <boost/throw_exception.hpp>
+
+//  #if (0)
+  #if defined(__GNUC__)
+
+  // Forward declarations of quadruple-precision string functions.
+  extern "C" int quadmath_snprintf(char *str, size_t size, const char *format, ...) throw();
+  extern "C" boost::math::cstdfloat::detail::float_internal128_t strtoflt128(const char*, char **) throw();
+
+  namespace std
+  {
+    template<typename char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::basic_ostringstream<char_type, traits_type> ostr;
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      char my_buffer[64U];
+
+      const int my_prec   = static_cast<int>(os.precision());
+      const int my_digits = ((my_prec == 0) ? 36 : my_prec);
+
+      const std::ios_base::fmtflags my_flags  = os.flags();
+
+      char my_format_string[8U];
+
+      std::size_t my_format_string_index = 0U;
+
+      my_format_string[my_format_string_index] = '%';
+      ++my_format_string_index;
+
+      if(my_flags & std::ios_base::showpos)   { my_format_string[my_format_string_index] = '+'; ++my_format_string_index; }
+      if(my_flags & std::ios_base::showpoint) { my_format_string[my_format_string_index] = '#'; ++my_format_string_index; }
+
+      my_format_string[my_format_string_index + 0U] = '.';
+      my_format_string[my_format_string_index + 1U] = '*';
+      my_format_string[my_format_string_index + 2U] = 'Q';
+
+      my_format_string_index += 3U;
+
+      char the_notation_char;
+
+      if     (my_flags & std::ios_base::scientific) { the_notation_char = 'e'; }
+      else if(my_flags & std::ios_base::fixed)      { the_notation_char = 'f'; }
+      else                                          { the_notation_char = 'g'; }
+
+      my_format_string[my_format_string_index + 0U] = the_notation_char;
+      my_format_string[my_format_string_index + 1U] = 0;
+
+      const int v = ::quadmath_snprintf(my_buffer,
+                                        static_cast<int>(sizeof(my_buffer)),
+                                        my_format_string,
+                                        my_digits,
+                                        x);
+
+      if(v < 0) { BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed internally in quadmath_snprintf().")); }
+
+      if(v >= static_cast<int>(sizeof(my_buffer) - 1U))
+      {
+        // Evidently there is a really long floating-point string here,
+        // such as a small decimal representation in non-scientific notation.
+        // So we have to use dynamic memory allocation for the output
+        // string buffer.
+
+        char* my_buffer2 = static_cast<char*>(0U);
+
+        try
+        {
+          my_buffer2 = new char[v + 3];
+        }
+        catch(const std::bad_alloc&)
+        {
+          BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed while allocating memory."));
+        }
+
+        const int v2 = ::quadmath_snprintf(my_buffer2,
+                                            v + 3,
+                                            my_format_string,
+                                            my_digits,
+                                            x);
+
+        if(v2 >= v + 3)
+        {
+          BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed."));
+        }
+
+        static_cast<void>(ostr << my_buffer2);
+
+        delete [] my_buffer2;
+      }
+      else
+      {
+        static_cast<void>(ostr << my_buffer);
+      }
+
+      return (os << ostr.str());
+    }
+
+    template<typename char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::string str;
+
+      static_cast<void>(is >> str);
+
+      char* p_end;
+
+      x = strtoflt128(str.c_str(), &p_end);
+
+      if(static_cast<std::ptrdiff_t>(p_end - str.c_str()) != static_cast<std::ptrdiff_t>(str.length()))
+      {
+        for(std::string::const_reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
+        {
+          static_cast<void>(is.putback(*it));
+        }
+
+        is.setstate(ios_base::failbit);
+
+        BOOST_THROW_EXCEPTION(std::runtime_error("Unable to interpret input string as a boost::float128_t"));
+      }
+
+      return is;
+    }
+  }
+
+//  #elif defined(__GNUC__)
+  #elif defined(BOOST_INTEL)
+
+  // The section for I/O stream support for the ICC compiler is particularly
+  // long, because these functions must be painstakingly synthesized from
+  // manually-written routines (ICC does not support I/O stream operations
+  // for its _Quad type).
+
+  // The following string-extraction routines are based on the methodology
+  // used in Boost.Multiprecision by John Maddock and Christopher Kormanyos.
+  // This methodology has been slightly modified here for boost::float128_t.
+
+  #include <cstring>
+  #include <cctype>
+  #include <boost/lexical_cast.hpp>
+
+  namespace boost { namespace math { namespace cstdfloat { namespace detail {
+
+  template<class string_type>
+  void format_float_string(string_type& str,
+                            int my_exp,
+                            int digits,
+                            const std::ios_base::fmtflags f,
+                            const bool iszero)
+  {
+    typedef typename string_type::size_type size_type;
+
+    const bool scientific = ((f & std::ios_base::scientific) == std::ios_base::scientific);
+    const bool fixed      = ((f & std::ios_base::fixed)      == std::ios_base::fixed);
+    const bool showpoint  = ((f & std::ios_base::showpoint)  == std::ios_base::showpoint);
+    const bool showpos    = ((f & std::ios_base::showpos)    == std::ios_base::showpos);
+
+    const bool b_neg = ((str.size() != 0U) && (str[0] == '-'));
+
+    if(b_neg)
+    {
+      str.erase(0, 1);
+    }
+
+    if(digits == 0)
+    {
+      digits = static_cast<int>((std::max)(str.size(), size_type(16)));
+    }
+
+    if(iszero || str.empty() || (str.find_first_not_of('0') == string_type::npos))
+    {
+      // We will be printing zero, even though the value might not
+      // actually be zero (it just may have been rounded to zero).
+      str = "0";
+
+      if(scientific || fixed)
+      {
+        str.append(1, '.');
+        str.append(size_type(digits), '0');
+
+        if(scientific)
+        {
+          str.append("e+00");
+        }
+      }
+      else
+      {
+        if(showpoint)
+        {
+          str.append(1, '.');
+          if(digits > 1)
+          {
+            str.append(size_type(digits - 1), '0');
+          }
+        }
+      }
+
+      if(b_neg)
+      {
+        str.insert(0U, 1U, '-');
+      }
+      else if(showpos)
+      {
+        str.insert(0U, 1U, '+');
+      }
+
+      return;
+    }
+
+    if(!fixed && !scientific && !showpoint)
+    {
+      // Suppress trailing zeros.
+      typename string_type::iterator pos = str.end();
+
+      while(pos != str.begin() && *--pos == '0') { ; }
+
+      if(pos != str.end())
+      {
+        ++pos;
+      }
+
+      str.erase(pos, str.end());
+
+      if(str.empty())
+      {
+        str = '0';
+      }
+    }
+    else if(!fixed || (my_exp >= 0))
+    {
+      // Pad out the end with zero's if we need to.
+
+      int chars = static_cast<int>(str.size());
+      chars = digits - chars;
+
+      if(scientific)
+      {
+        ++chars;
+      }
+
+      if(chars > 0)
+      {
+        str.append(static_cast<size_type>(chars), '0');
+      }
+    }
+
+    if(fixed || (!scientific && (my_exp >= -4) && (my_exp < digits)))
+    {
+      if((1 + my_exp) > static_cast<int>(str.size()))
+      {
+        // Just pad out the end with zeros.
+        str.append(static_cast<size_type>((1 + my_exp) - static_cast<int>(str.size())), '0');
+
+        if(showpoint || fixed)
+        {
+          str.append(".");
+        }
+      }
+      else if(my_exp + 1 < static_cast<int>(str.size()))
+      {
+        if(my_exp < 0)
+        {
+          str.insert(0U, static_cast<size_type>(-1 - my_exp), '0');
+          str.insert(0U, "0.");
+        }
+        else
+        {
+          // Insert the decimal point:
+          str.insert(static_cast<size_type>(my_exp + 1), 1, '.');
+        }
+      }
+      else if(showpoint || fixed) // we have exactly the digits we require to left of the point
+      {
+        str += ".";
+      }
+
+      if(fixed)
+      {
+        // We may need to add trailing zeros.
+        int l = static_cast<int>(str.find('.') + 1U);
+        l = digits - (static_cast<int>(str.size()) - l);
+
+        if(l > 0)
+        {
+          str.append(size_type(l), '0');
+        }
+      }
+    }
+    else
+    {
+      // Scientific format:
+      if(showpoint || (str.size() > 1))
+      {
+        str.insert(1U, 1U, '.');
+      }
+
+      str.append(1U, 'e');
+      string_type e = boost::lexical_cast<string_type>(std::abs(my_exp));
+
+      if(e.size() < 2U)
+      {
+        e.insert(0U, 2U - e.size(), '0');
+      }
+
+      if(my_exp < 0)
+      {
+        e.insert(0U, 1U, '-');
+      }
+      else
+      {
+        e.insert(0U, 1U, '+');
+      }
+
+      str.append(e);
+    }
+
+    if(b_neg)
+    {
+      str.insert(0U, 1U, '-');
+    }
+    else if(showpos)
+    {
+      str.insert(0U, 1U, '+');
+    }
+  }
+
+  template<class float_type, class type_a> inline void eval_convert_to(type_a* pa,    const float_type& cb)                        { *pa  = static_cast<type_a>(cb); }
+  template<class float_type, class type_a> inline void eval_add       (float_type& b, const type_a& a)                             { b   += a; }
+  template<class float_type, class type_a> inline void eval_subtract  (float_type& b, const type_a& a)                             { b   -= a; }
+  template<class float_type, class type_a> inline void eval_multiply  (float_type& b, const type_a& a)                             { b   *= a; }
+  template<class float_type>               inline void eval_multiply  (float_type& b, const float_type& cb, const float_type& cb2) { b    = (cb * cb2); }
+  template<class float_type, class type_a> inline void eval_divide    (float_type& b, const type_a& a)                             { b   /= a; }
+  template<class float_type>               inline void eval_log10     (float_type& b, const float_type& cb)                        { b    = std::log10(cb); }
+  template<class float_type>               inline void eval_floor     (float_type& b, const float_type& cb)                        { b    = std::floor(cb); }
+
+  inline void round_string_up_at(std::string& s, int pos, int& expon)
+  {
+    // This subroutine rounds up a string representation of a
+    // number at the given position pos.
+
+    if(pos < 0)
+    {
+      s.insert(0U, 1U, '1');
+      s.erase(s.size() - 1U);
+      ++expon;
+    }
+    else if(s[pos] == '9')
+    {
+      s[pos] = '0';
+      round_string_up_at(s, pos - 1, expon);
+    }
+    else
+    {
+      if((pos == 0) && (s[pos] == '0') && (s.size() == 1))
+      {
+        ++expon;
+      }
+
+      ++s[pos];
+    }
+  }
+
+  template<class float_type>
+  std::string convert_to_string(float_type& x,
+                                std::streamsize digits,
+                                const std::ios_base::fmtflags f)
+  {
+    const bool isneg  = (x < 0);
+    const bool iszero = ((!isneg) ? bool(+x < (std::numeric_limits<float_type>::min)())
+                                  : bool(-x < (std::numeric_limits<float_type>::min)()));
+    const bool isnan  = (x != x);
+    const bool isinf  = ((!isneg) ? bool(+x > (std::numeric_limits<float_type>::max)())
+                                  : bool(-x > (std::numeric_limits<float_type>::max)()));
+
+    int expon = 0;
+
+    if(digits <= 0) { digits = std::numeric_limits<float_type>::max_digits10; }
+
+    const int org_digits = static_cast<int>(digits);
+
+    std::string result;
+
+    if(iszero)
+    {
+      result = "0";
+    }
+    else if(isinf)
+    {
+      if(x < 0)
+      {
+        return "-inf";
+      }
+      else
+      {
+        return ((f & std::ios_base::showpos) == std::ios_base::showpos) ? "+inf" : "inf";
+      }
+    }
+    else if(isnan)
+    {
+      return "nan";
+    }
+    else
+    {
+      // Start by figuring out the base-10 exponent.
+      if(isneg) { x = -x; }
+
+      float_type t;
+      float_type ten = 10;
+
+      eval_log10(t, x);
+      eval_floor(t, t);
+      eval_convert_to(&expon, t);
+
+      if(-expon > std::numeric_limits<float_type>::max_exponent10 - 3)
+      {
+        int e = -expon / 2;
+
+        const float_type t2 = boost::math::cstdfloat::detail::pown(ten, e);
+
+        eval_multiply(t, t2, x);
+        eval_multiply(t, t2);
+
+        if((expon & 1) != 0)
+        {
+          eval_multiply(t, ten);
+        }
+      }
+      else
+      {
+        t = boost::math::cstdfloat::detail::pown(ten, -expon);
+        eval_multiply(t, x);
+      }
+
+      // Make sure that the value lies between [1, 10), and adjust if not.
+      if(t < 1)
+      {
+        eval_multiply(t, 10);
+
+        --expon;
+      }
+      else if(t >= 10)
+      {
+        eval_divide(t, 10);
+
+        ++expon;
+      }
+
+      float_type digit;
+      int        cdigit;
+
+      // Adjust the number of digits required based on formatting options.
+      if(((f & std::ios_base::fixed) == std::ios_base::fixed) && (expon != -1))
+      {
+        digits += (expon + 1);
+      }
+
+      if((f & std::ios_base::scientific) == std::ios_base::scientific)
+      {
+        ++digits;
+      }
+
+      // Extract the base-10 digits one at a time.
+      for(int i = 0; i < digits; ++i)
+      {
+        eval_floor(digit, t);
+        eval_convert_to(&cdigit, digit);
+
+        result += static_cast<char>('0' + cdigit);
+
+        eval_subtract(t, digit);
+        eval_multiply(t, ten);
+      }
+
+      // Possibly round the result.
+      if(digits >= 0)
+      {
+        eval_floor(digit, t);
+        eval_convert_to(&cdigit, digit);
+        eval_subtract(t, digit);
+
+        if((cdigit == 5) && (t == 0))
+        {
+          // Use simple bankers rounding.
+
+          if((static_cast<int>(*result.rbegin() - '0') & 1) != 0)
+          {
+            round_string_up_at(result, static_cast<int>(result.size() - 1U), expon);
+          }
+        }
+        else if(cdigit >= 5)
+        {
+          round_string_up_at(result, static_cast<int>(result.size() - 1), expon);
+        }
+      }
+    }
+
+    while((result.size() > static_cast<std::string::size_type>(digits)) && result.size())
+    {
+      // We may get here as a result of rounding.
+
+      if(result.size() > 1U)
+      {
+        result.erase(result.size() - 1U);
+      }
+      else
+      {
+        if(expon > 0)
+        {
+          --expon; // so we put less padding in the result.
+        }
+        else
+        {
+          ++expon;
+        }
+
+        ++digits;
+      }
+    }
+
+    if(isneg)
+    {
+      result.insert(0U, 1U, '-');
+    }
+
+    format_float_string(result, expon, org_digits, f, iszero);
+
+    return result;
+  }
+
+  template <class float_type>
+  bool convert_from_string(float_type& value, const char* p)
+  {
+    value = 0;
+
+    if((p == static_cast<const char*>(0U)) || (*p == static_cast<char>(0)))
+    {
+      return;
+    }
+
+    bool is_neg       = false;
+    bool is_neg_expon = false;
+
+    BOOST_CONSTEXPR_OR_CONST int ten = 10;
+
+    int expon       = 0;
+    int digits_seen = 0;
+
+    BOOST_CONSTEXPR_OR_CONST int max_digits = std::numeric_limits<float_type>::max_digits10 + 1;
+
+    if(*p == static_cast<char>('+'))
+    {
+      ++p;
+    }
+    else if(*p == static_cast<char>('-'))
+    {
+      is_neg = true;
+      ++p;
+    }
+
+    const bool isnan = ((std::strcmp(p, "nan") == 0) || (std::strcmp(p, "NaN") == 0) || (std::strcmp(p, "NAN") == 0));
+
+    if(isnan)
+    {
+      eval_divide(value, 0);
+
+      if(is_neg)
+      {
+        value = -value;
+      }
+
+      return true;
+    }
+
+    const bool isinf = ((std::strcmp(p, "inf") == 0) || (std::strcmp(p, "Inf") == 0) || (std::strcmp(p, "INF") == 0));
+
+    if(isinf)
+    {
+      value = 1;
+      eval_divide(value, 0);
+
+      if(is_neg)
+      {
+        value = -value;
+      }
+
+      return true;
+    }
+
+    // Grab all the leading digits before the decimal point.
+    while(std::isdigit(*p))
+    {
+      eval_multiply(value, ten);
+      eval_add(value, static_cast<int>(*p - '0'));
+      ++p;
+      ++digits_seen;
+    }
+
+    if(*p == static_cast<char>('.'))
+    {
+      // Grab everything after the point, stop when we've seen
+      // enough digits, even if there are actually more available.
+
+      ++p;
+
+      while(std::isdigit(*p))
+      {
+        eval_multiply(value, ten);
+        eval_add(value, static_cast<int>(*p - '0'));
+        ++p;
+        --expon;
+
+        if(++digits_seen > max_digits)
+        {
+          break;
+        }
+      }
+
+      while(std::isdigit(*p))
+      {
+        ++p;
+      }
+    }
+
+    // Parse the exponent.
+    if((*p == static_cast<char>('e')) || (*p == static_cast<char>('E')))
+    {
+      ++p;
+
+      if(*p == static_cast<char>('+'))
+      {
+        ++p;
+      }
+      else if(*p == static_cast<char>('-'))
+      {
+        is_neg_expon = true;
+        ++p;
+      }
+
+      int e2 = 0;
+
+      while(std::isdigit(*p))
+      {
+        e2 *= 10;
+        e2 += (*p - '0');
+        ++p;
+      }
+
+      if(is_neg_expon)
+      {
+        e2 = -e2;
+      }
+
+      expon += e2;
+    }
+
+    if(expon)
+    {
+      // Scale by 10^expon. Note that 10^expon can be outside the range
+      // of our number type, even though the result is within range.
+      // If that looks likely, then split the calculation in two parts.
+      float_type t;
+      t = ten;
+
+      if(expon > (std::numeric_limits<float_type>::min_exponent10 + 2))
+      {
+        t = boost::math::cstdfloat::detail::pown(t, expon);
+        eval_multiply(value, t);
+      }
+      else
+      {
+        t = boost::math::cstdfloat::detail::pown(t, (expon + digits_seen + 1));
+        eval_multiply(value, t);
+        t = ten;
+        t = boost::math::cstdfloat::detail::pown(t, (-digits_seen - 1));
+        eval_multiply(value, t);
+      }
+    }
+
+    if(is_neg)
+    {
+      value = -value;
+    }
+
+    return (*p == static_cast<char>(0));
+  }
+  } } } } // boost::math::cstdfloat::detail
+
+  namespace std
+  {
+    template<typename char_type, class traits_type>
+    inline std::basic_ostream<char_type, traits_type>& operator<<(std::basic_ostream<char_type, traits_type>& os, const boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      boost::math::cstdfloat::detail::float_internal128_t non_const_x = x;
+
+      const std::string str = boost::math::cstdfloat::detail::convert_to_string(non_const_x,
+                                                                                os.precision(),
+                                                                                os.flags());
+
+      std::basic_ostringstream<char_type, traits_type> ostr;
+      ostr.flags(os.flags());
+      ostr.imbue(os.getloc());
+      ostr.precision(os.precision());
+
+      static_cast<void>(ostr << str);
+
+      return (os << ostr.str());
+    }
+
+    template<typename char_type, class traits_type>
+    inline std::basic_istream<char_type, traits_type>& operator>>(std::basic_istream<char_type, traits_type>& is, boost::math::cstdfloat::detail::float_internal128_t& x)
+    {
+      std::string str;
+
+      static_cast<void>(is >> str);
+
+      const bool conversion_is_ok = boost::math::cstdfloat::detail::convert_from_string(x, str.c_str());
+
+      if(false == conversion_is_ok)
+      {
+        for(std::string::const_reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
+        {
+          static_cast<void>(is.putback(*it));
+        }
+
+        is.setstate(ios_base::failbit);
+
+        BOOST_THROW_EXCEPTION(std::runtime_error("Unable to interpret input string as a boost::float128_t"));
+      }
+
+      return is;
+    }
+  }
+
+  #endif // Use __GNUC__ or BOOST_INTEL libquadmath
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_IOSTREAM_2014_02_15_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_limits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement quadruple-precision std::numeric_limits<> support.
+
+#ifndef _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
+  #define _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
+
+  #include <boost/math/cstdfloat/cstdfloat_types.hpp>
+
+  #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+    #include <limits>
+
+    // Define the name of the global quadruple-precision function to be used for
+    // calculating quiet_NaN() in the specialization of std::numeric_limits<>.
+    #if defined(BOOST_INTEL)
+      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
+    #elif defined(__GNUC__)
+      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
+    #endif
+
+    // Forward declaration of the quadruple-precision square root function.
+    extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) throw();
+
+    namespace std
+    {
+      template<>
+      class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>
+      {
+      public:
+        BOOST_STATIC_CONSTEXPR bool                                                 is_specialized           = true;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  (min) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MIN; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  (max) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MAX; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  lowest() BOOST_NOEXCEPT  { return -(max)(); }
+        BOOST_STATIC_CONSTEXPR int                                                  digits                   = 113;
+        BOOST_STATIC_CONSTEXPR int                                                  digits10                 = 34;
+        BOOST_STATIC_CONSTEXPR int                                                  max_digits10             = 36;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_signed                = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_integer               = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_exact                 = false;
+        BOOST_STATIC_CONSTEXPR int                                                  radix                    = 2;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  epsilon    ()            { return BOOST_CSTDFLOAT_FLOAT128_EPS; }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  round_error()            { return BOOST_FLOAT128_C(0.5); }
+        BOOST_STATIC_CONSTEXPR int                                                  min_exponent             = -16381;
+        BOOST_STATIC_CONSTEXPR int                                                  min_exponent10           = static_cast<int>((min_exponent * 301L) / 1000L);
+        BOOST_STATIC_CONSTEXPR int                                                  max_exponent             = +16384;
+        BOOST_STATIC_CONSTEXPR int                                                  max_exponent10           = static_cast<int>((max_exponent * 301L) / 1000L);
+        BOOST_STATIC_CONSTEXPR bool                                                 has_infinity             = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_quiet_NaN            = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_signaling_NaN        = false;
+        BOOST_STATIC_CONSTEXPR float_denorm_style                                   has_denorm               = denorm_absent;
+        BOOST_STATIC_CONSTEXPR bool                                                 has_denorm_loss          = false;
+        static                 boost::math::cstdfloat::detail::float_internal128_t  infinity     ()          { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  quiet_NaN    ()          { return ::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0)); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  signaling_NaN()          { return BOOST_FLOAT128_C(0.0); }
+        static                 boost::math::cstdfloat::detail::float_internal128_t  denorm_min   ()          { return BOOST_FLOAT128_C(0.0); }
+        BOOST_STATIC_CONSTEXPR bool                                                 is_iec559                = true;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_bounded               = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 is_modulo                = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 traps                    = false;
+        BOOST_STATIC_CONSTEXPR bool                                                 tinyness_before          = false;
+        BOOST_STATIC_CONSTEXPR float_round_style                                    round_style              = round_to_nearest;
+      };
+    } // namespace std
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+#endif // _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/cstdfloat/cstdfloat_types.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,440 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2014.
+// Copyright John Maddock 2014.
+// Copyright Paul Bristow 2014.
+// Distributed under the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Implement the types for floating-point typedefs having specified widths.
+
+#ifndef _BOOST_CSTDFLOAT_TYPES_2014_01_09_HPP_
+  #define _BOOST_CSTDFLOAT_TYPES_2014_01_09_HPP_
+
+  #include <float.h>
+  #include <limits>
+  #include <boost/static_assert.hpp>
+  #include <boost/math/tools/config.hpp>
+
+  // This is the beginning of the preamble.
+
+  // In this preamble, the preprocessor is used to query certain
+  // preprocessor definitions from <float.h>. Based on the results
+  // of these queries, an attempt is made to automatically detect
+  // the presence of built-in floating-point types having specified
+  // widths. These are *thought* to be conformant with IEEE-754,
+  // whereby an unequivocal test based on std::numeric_limits<>
+  // follows below.
+
+  // In addition, various macros that are used for initializing
+  // floating-point literal values having specified widths and
+  // some basic min/max values are defined.
+
+  // First, we will pre-load certain preprocessor definitions
+  // with a dummy value.
+
+  #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH  0
+
+  #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  0
+  #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE 0
+
+  // Ensure that the compiler has a radix-2 floating-point representation.
+  #if (!defined(FLT_RADIX) || ((defined(FLT_RADIX) && (FLT_RADIX != 2))))
+    #error The compiler does not support any radix-2 floating-point types required for <boost/cstdfloat.hpp>.
+  #endif
+
+  // Check if built-in float is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+  #if(defined(FLT_MANT_DIG) && defined(FLT_MAX_EXP))
+    #if  ((FLT_MANT_DIG == 11) && (FLT_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+      #define BOOST_FLOAT16_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_16_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_16_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 24) && (FLT_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+      #define BOOST_FLOAT32_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_32_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_32_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 53) && (FLT_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+      #define BOOST_FLOAT64_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_64_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_64_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 64) && (FLT_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+      #define BOOST_FLOAT80_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_80_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_80_MAX  FLT_MAX
+    #elif((FLT_MANT_DIG == 113) && (FLT_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE float
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+      #define BOOST_FLOAT128_C(x)  (x ## F)
+      #define BOOST_CSTDFLOAT_FLOAT_128_MIN  FLT_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_128_MAX  FLT_MAX
+    #endif
+  #endif
+
+  // Check if built-in double is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+  #if(defined(DBL_MANT_DIG) && defined(DBL_MAX_EXP))
+    #if  ((DBL_MANT_DIG == 11) && (DBL_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+      #define BOOST_FLOAT16_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_16_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_16_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 24) && (DBL_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+      #define BOOST_FLOAT32_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_32_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_32_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 53) && (DBL_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+      #define BOOST_FLOAT64_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_64_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_64_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 64) && (DBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+      #define BOOST_FLOAT80_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_80_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_80_MAX  DBL_MAX
+    #elif((DBL_MANT_DIG == 113) && (DBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+      #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE double
+      #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+      #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+      #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+      #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+      #define BOOST_FLOAT128_C(x)  (x)
+      #define BOOST_CSTDFLOAT_FLOAT_128_MIN  DBL_MIN
+      #define BOOST_CSTDFLOAT_FLOAT_128_MAX  DBL_MAX
+    #endif
+  #endif
+
+  // Disable check long double capability even if supported by compiler since some math runtime
+  // implementations are broken for long double.
+  #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+    // Check if built-in long double is equivalent to float16_t, float32_t, float64_t, float80_t, or float128_t.
+    #if(defined(LDBL_MANT_DIG) && defined(LDBL_MAX_EXP))
+      #if  ((LDBL_MANT_DIG == 11) && (LDBL_MAX_EXP == 16) && (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 16
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  1
+        #define BOOST_FLOAT16_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_16_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_16_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 24) && (LDBL_MAX_EXP == 128) && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 32
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  1
+        #define BOOST_FLOAT32_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_32_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_32_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 53) && (LDBL_MAX_EXP == 1024) && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  1
+        #define BOOST_FLOAT64_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_64_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_64_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 64) && (LDBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 80
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  1
+        #define BOOST_FLOAT80_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_80_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_80_MAX  LDBL_MAX
+      #elif((LDBL_MANT_DIG == 113) && (LDBL_MAX_EXP == 16384) && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+        #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE long double
+        #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+        #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+        #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+        #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+        #define BOOST_FLOAT128_C(x)  (x ## L)
+        #define BOOST_CSTDFLOAT_FLOAT_128_MIN  LDBL_MIN
+        #define BOOST_CSTDFLOAT_FLOAT_128_MAX  LDBL_MAX
+      #endif
+    #endif
+  #endif
+
+  // Check if quadruple-precision is supported. Here, we are checking
+  // for the presence of __float128 from GCC's quadmath.h or _Quad
+  // from ICC's /Qlong-double flag). To query these, we use the
+  // BOOST_MATH_USE_FLOAT128 pre-processor definition from
+  // <boost/math/tools/config.hpp>.
+
+  #if (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+
+    // Specify the underlying name of the internal 128-bit floating-point type definition.
+    namespace boost { namespace math { namespace cstdfloat { namespace detail {
+    #if defined(BOOST_INTEL)
+      typedef _Quad      float_internal128_t;
+    #elif defined(__GNUC__)
+      typedef __float128 float_internal128_t;
+    #else
+      #error "Sorry, the compiler is neither GCC, nor Intel, I don't know how to configure <boost/cstdfloat.hpp>."
+    #endif
+    } } } } // boost::math::cstdfloat::detail
+
+    #define BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE boost::math::cstdfloat::detail::float_internal128_t
+    #undef  BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+    #define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 128
+    #undef  BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+    #define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE  1
+    #define BOOST_FLOAT128_C(x)  (x ## Q)
+    #define BOOST_CSTDFLOAT_FLOAT128_MIN  3.36210314311209350626267781732175260e-4932Q
+    #define BOOST_CSTDFLOAT_FLOAT128_MAX  1.18973149535723176508575932662800702e+4932Q
+    #define BOOST_CSTDFLOAT_FLOAT128_EPS  1.92592994438723585305597794258492732e-0034Q
+
+  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
+
+  // This is the end of the preamble, and also the end of the
+  // sections providing support for the C++ standard library
+  // for quadruple-precision.
+
+  // Now we use the results of the queries that have been obtained
+  // in the preamble (far above) for the final type definitions in
+  // the namespace boost.
+
+  // Make sure that the compiler has any floating-point type(s) whatsoever.
+  #if (   (BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE  == 0)  \
+       && (BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 0))
+    #error The compiler does not support any of the floating-point types required for <boost/cstdfloat.hpp>.
+  #endif
+
+  // The following section contains the various min/max macros
+  // for the *leastN and *fastN types.
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST16_MIN   BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOAT_LEAST16_MIN  BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOAT_FAST16_MAX   BOOST_CSTDFLOAT_FLOAT_16_MAX
+    #define BOOST_FLOAT_LEAST16_MAX  BOOST_CSTDFLOAT_FLOAT_16_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST32_MIN   BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOAT_LEAST32_MIN  BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOAT_FAST32_MAX   BOOST_CSTDFLOAT_FLOAT_32_MAX
+    #define BOOST_FLOAT_LEAST32_MAX  BOOST_CSTDFLOAT_FLOAT_32_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST64_MIN   BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOAT_LEAST64_MIN  BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOAT_FAST64_MAX   BOOST_CSTDFLOAT_FLOAT_64_MAX
+    #define BOOST_FLOAT_LEAST64_MAX  BOOST_CSTDFLOAT_FLOAT_64_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 1)
+    #define BOOST_FLOAT_FAST80_MIN   BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOAT_LEAST80_MIN  BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOAT_FAST80_MAX   BOOST_CSTDFLOAT_FLOAT_80_MAX
+    #define BOOST_FLOAT_LEAST80_MAX  BOOST_CSTDFLOAT_FLOAT_80_MAX
+  #endif
+
+  #if(BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 1)
+    #define BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T
+
+    #define BOOST_FLOAT_FAST128_MIN   BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOAT_LEAST128_MIN  BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOAT_FAST128_MAX   BOOST_CSTDFLOAT_FLOAT_128_MAX
+    #define BOOST_FLOAT_LEAST128_MAX  BOOST_CSTDFLOAT_FLOAT_128_MAX
+  #endif
+
+  // The following section contains the various min/max macros
+  // for the *floatmax types.
+
+  #if  (BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 16)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT16_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_16_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_16_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 32)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT32_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_32_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_32_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 64)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT64_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_64_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_64_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 80)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT80_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_80_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_80_MAX
+  #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 128)
+    #define BOOST_FLOATMAX_C(x) BOOST_FLOAT128_C(x)
+    #define BOOST_FLOATMAX_MIN  BOOST_CSTDFLOAT_FLOAT_128_MIN
+    #define BOOST_FLOATMAX_MAX  BOOST_CSTDFLOAT_FLOAT_128_MAX
+  #else
+    #error The maximum available floating-point width for <boost/cstdfloat.hpp> is undefined.
+  #endif
+
+  // And finally..., we define the floating-point typedefs having
+  // specified widths. The types are defined in the namespace boost.
+
+  // For simplicity, the least and fast types are type defined identically
+  // as the corresponding fixed-width type. This behavior may, however,
+  // be modified when being optimized for a given compiler implementation.
+
+  // In addition, a clear assessment of IEEE-754 comformance is carried out
+  // using compile-time assertion.
+
+  namespace boost
+  {
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT16_NATIVE_TYPE float16_t;
+      typedef boost::float16_t float_fast16_t;
+      typedef boost::float16_t float_least16_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::is_iec559    == true, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::radix        ==    2, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::digits       ==   11, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float16_t>::max_exponent ==   16, "boost::float16_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_16_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_16_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT32_NATIVE_TYPE float32_t;
+      typedef boost::float32_t float_fast32_t;
+      typedef boost::float32_t float_least32_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::is_iec559    == true, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::radix        ==    2, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::digits       ==   24, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float32_t>::max_exponent ==  128, "boost::float32_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_32_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_32_MAX
+    #endif
+
+#if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && defined(__SUNPRO_CC)
+#undef BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+#define BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE 0
+#undef BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+#define BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE 0
+#undef BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+#define BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH 64
+#endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT64_NATIVE_TYPE float64_t;
+      typedef boost::float64_t float_fast64_t;
+      typedef boost::float64_t float_least64_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::is_iec559    == true, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::radix        ==    2, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::digits       ==   53, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float64_t>::max_exponent == 1024, "boost::float64_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_64_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_64_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT80_NATIVE_TYPE float80_t;
+      typedef boost::float80_t float_fast80_t;
+      typedef boost::float80_t float_least80_t;
+
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::is_iec559    ==  true, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::radix        ==     2, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::digits       ==    64, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float80_t>::max_exponent == 16384, "boost::float80_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+
+      #undef BOOST_CSTDFLOAT_FLOAT_80_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_80_MAX
+    #endif
+
+    #if(BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE == 1)
+      typedef BOOST_CSTDFLOAT_FLOAT128_NATIVE_TYPE float128_t;
+      typedef boost::float128_t float_fast128_t;
+      typedef boost::float128_t float_least128_t;
+
+      #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
+      // This configuration does not *yet* support std::numeric_limits<boost::float128_t>.
+      // Support for std::numeric_limits<boost::float128_t> is added in the detail
+      // file <boost/math/cstdfloat/cstdfloat_limits.hpp>.
+      #else
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::is_iec559    ==  true, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::radix        ==     2, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::digits       ==   113, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      BOOST_STATIC_ASSERT_MSG(std::numeric_limits<boost::float128_t>::max_exponent == 16384, "boost::float128_t has been detected in <boost/cstdfloat>, but verification with std::numeric_limits fails");
+      #endif
+
+      #undef BOOST_CSTDFLOAT_FLOAT_128_MIN
+      #undef BOOST_CSTDFLOAT_FLOAT_128_MAX
+    #endif
+
+    #if  (BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  16)
+      typedef boost::float16_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  32)
+      typedef boost::float32_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  64)
+      typedef boost::float64_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH ==  80)
+      typedef boost::float80_t  floatmax_t;
+    #elif(BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH == 128)
+      typedef boost::float128_t floatmax_t;
+    #else
+      #error The maximum available floating-point width for <boost/cstdfloat.hpp> is undefined.
+    #endif
+
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT16_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT32_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT64_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT80_NATIVE_TYPE
+    #undef BOOST_CSTDFLOAT_HAS_FLOAT128_NATIVE_TYPE
+
+    #undef BOOST_CSTDFLOAT_MAXIMUM_AVAILABLE_WIDTH
+  }
+  // namespace boost
+
+#endif // _BOOST_CSTDFLOAT_BASE_TYPES_2014_01_09_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/distributions/arcsine.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,535 @@
+// boost/math/distributions/arcsine.hpp
+
+// Copyright John Maddock 2014.
+// Copyright Paul A. Bristow 2014.
+
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// http://en.wikipedia.org/wiki/arcsine_distribution
+
+// The arcsine Distribution is a continuous probability distribution.
+// http://en.wikipedia.org/wiki/Arcsine_distribution
+// http://www.wolframalpha.com/input/?i=ArcSinDistribution
+
+// Standard arcsine distribution is a special case of beta distribution with both a & b = one half,
+// and 0 <= x <= 1.
+
+// It is generalized to include any bounded support a <= x <= b from 0 <= x <= 1
+// by Wolfram and Wikipedia,
+// but using location and scale parameters by
+// Virtual Laboratories in Probability and Statistics http://www.math.uah.edu/stat/index.html
+// http://www.math.uah.edu/stat/special/Arcsine.html
+// The end-point version is simpler and more obvious, so we implement that.
+// TODO Perhaps provide location and scale functions?
+
+
+#ifndef BOOST_MATH_DIST_ARCSINE_HPP
+#define BOOST_MATH_DIST_ARCSINE_HPP
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/complement.hpp> // complements.
+#include <boost/math/distributions/detail/common_error_handling.hpp> // error checks.
+#include <boost/math/constants/constants.hpp>
+
+#include <boost/math/special_functions/fpclassify.hpp> // isnan.
+
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning(disable: 4702) // Unreachable code,
+// in domain_error_imp in error_handling.
+#endif
+
+#include <utility>
+#include <exception>  // For std::domain_error.
+
+namespace boost
+{
+  namespace math
+  {
+    namespace arcsine_detail
+    {
+      // Common error checking routines for arcsine distribution functions:
+      // Duplicating for x_min and x_max provides specific error messages.
+      template <class RealType, class Policy>
+      inline bool check_x_min(const char* function, const RealType& x, RealType* result, const Policy& pol)
+      {
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x_min argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        return true;
+      } // bool check_x_min
+
+      template <class RealType, class Policy>
+      inline bool check_x_max(const char* function, const RealType& x, RealType* result, const Policy& pol)
+      {
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x_max argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        return true;
+      } // bool check_x_max
+
+
+      template <class RealType, class Policy>
+      inline bool check_x_minmax(const char* function, const RealType& x_min, const RealType& x_max, RealType* result, const Policy& pol)
+      { // Check x_min < x_max
+        if (x_min >= x_max)
+        {
+          std::string msg = "x_max argument is %1%, but must be > x_min = " + lexical_cast<std::string>(x_min) + "!";
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            msg.c_str(), x_max, pol);
+           // "x_max argument is %1%, but must be > x_min !", x_max, pol);
+            //  "x_max argument is %1%, but must be > x_min %2!", x_max, x_min, pol); would be better. 
+          // But would require replication of all helpers functions in /policies/error_handling.hpp for two values,
+          // as well as two value versions of raise_error, raise_domain_error and do_format ...
+          // so use slightly hacky lexical_cast to string instead.
+          return false;
+        }
+        return true;
+      } // bool check_x_minmax
+
+      template <class RealType, class Policy>
+      inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
+      {
+        if ((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
+          return false;
+        }
+        return true;
+      } // bool check_prob
+
+      template <class RealType, class Policy>
+      inline bool check_x(const char* function, const RealType& x_min, const RealType& x_max, const RealType& x, RealType* result, const Policy& pol)
+      { // Check x finite and x_min < x < x_max.
+        if (!(boost::math::isfinite)(x))
+        {
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x argument is %1%, but must be finite !", x, pol);
+          return false;
+        }
+        if ((x < x_min) || (x > x_max))
+        {
+          // std::cout << x_min << ' ' << x << x_max << std::endl;
+          *result = policies::raise_domain_error<RealType>(
+            function,
+            "x argument is %1%, but must be x_min < x < x_max !", x, pol);
+          // For example:
+          // Error in function boost::math::pdf(arcsine_distribution<double> const&, double) : x argument is -1.01, but must be x_min < x < x_max !
+          // TODO Perhaps show values of x_min and x_max?
+          return false;
+        }
+        return true;
+      } // bool check_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist(const char* function, const RealType& x_min, const RealType& x_max, RealType* result, const Policy& pol)
+      { // Check both x_min and x_max finite, and x_min  < x_max.
+        return check_x_min(function, x_min, result, pol)
+            && check_x_max(function, x_max, result, pol)
+            && check_x_minmax(function, x_min, x_max, result, pol);
+      } // bool check_dist
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_x(const char* function, const RealType& x_min, const RealType& x_max, RealType x, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, x_min, x_max, result, pol)
+          && arcsine_detail::check_x(function, x_min, x_max, x, result, pol);
+      } // bool check_dist_and_x
+
+      template <class RealType, class Policy>
+      inline bool check_dist_and_prob(const char* function, const RealType& x_min, const RealType& x_max, RealType p, RealType* result, const Policy& pol)
+      {
+        return check_dist(function, x_min, x_max, result, pol)
+          && check_prob(function, p, result, pol);
+      } // bool check_dist_and_prob
+
+    } // namespace arcsine_detail
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class arcsine_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      arcsine_distribution(RealType x_min = 0, RealType x_max = 1) : m_x_min(x_min), m_x_max(x_max)
+      { // Default beta (alpha = beta = 0.5) is standard arcsine with x_min = 0, x_max = 1.
+        // Generalized to allow x_min and x_max to be specified.
+        RealType result;
+        arcsine_detail::check_dist(
+          "boost::math::arcsine_distribution<%1%>::arcsine_distribution",
+          m_x_min,
+          m_x_max,
+          &result, Policy());
+      } // arcsine_distribution constructor.
+      // Accessor functions:
+      RealType x_min() const
+      {
+        return m_x_min;
+      }
+      RealType x_max() const
+      {
+        return m_x_max;
+      }
+
+    private:
+      RealType m_x_min; // Two x min and x max parameters of the arcsine distribution.
+      RealType m_x_max;
+    }; // template <class RealType, class Policy> class arcsine_distribution
+
+    // Convenient typedef to construct double version.
+    typedef arcsine_distribution<double> arcsine;
+
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const arcsine_distribution<RealType, Policy>&  dist)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(static_cast<RealType>(dist.x_min()), static_cast<RealType>(dist.x_max()));
+    }
+
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const arcsine_distribution<RealType, Policy>&  dist)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      return std::pair<RealType, RealType>(static_cast<RealType>(dist.x_min()), static_cast<RealType>(dist.x_max()));
+    }
+
+    template <class RealType, class Policy>
+    inline RealType mean(const arcsine_distribution<RealType, Policy>& dist)
+    { // Mean of arcsine distribution .
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::mean(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_min + x_max) / 2;
+    } // mean
+
+    template <class RealType, class Policy>
+    inline RealType variance(const arcsine_distribution<RealType, Policy>& dist)
+    { // Variance of standard arcsine distribution = (1-0)/8 = 0.125.
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist(
+        "boost::math::variance(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_max - x_min) * (x_max - x_min) / 8;
+    } // variance
+
+    template <class RealType, class Policy>
+    inline RealType mode(const arcsine_distribution<RealType, Policy>& /* dist */)
+    { //There are always [*two] values for the mode, at ['x_min] and at ['x_max], default 0 and 1,
+      // so instead we raise the exception domain_error.
+      return policies::raise_domain_error<RealType>(
+        "boost::math::mode(arcsine_distribution<%1%>&)",
+        "The arcsine distribution has two modes at x_min and x_max: "
+        "so the return value is %1%.",
+        std::numeric_limits<RealType>::quiet_NaN(), Policy());
+    } // mode
+
+    template <class RealType, class Policy>
+    inline RealType median(const arcsine_distribution<RealType, Policy>& dist)
+    { // Median of arcsine distribution (a + b) / 2 == mean.
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      RealType result;
+      if (false == arcsine_detail::check_dist(
+        "boost::math::median(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return  (x_min + x_max) / 2;
+    }
+
+    template <class RealType, class Policy>
+    inline RealType skewness(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::skewness(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      return 0;
+    } // skewness
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::kurtosis_excess(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+      result = -3;
+      return  result / 2;
+    } // kurtosis_excess
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const arcsine_distribution<RealType, Policy>& dist)
+    {
+      RealType result;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      if (false == arcsine_detail::check_dist(
+        "boost::math::kurtosis(arcsine_distribution<%1%> const&, %1% )",
+        x_min,
+        x_max,
+        &result, Policy())
+        )
+      {
+        return result;
+      }
+
+      return 3 + kurtosis_excess(dist);
+    } // kurtosis
+
+    template <class RealType, class Policy>
+    inline RealType pdf(const arcsine_distribution<RealType, Policy>& dist, const RealType& xx)
+    { // Probability Density/Mass Function arcsine.
+      BOOST_FPU_EXCEPTION_GUARD
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      static const char* function = "boost::math::pdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType lo = dist.x_min();
+      RealType hi = dist.x_max();
+      RealType x = xx;
+
+      // Argument checks:
+      RealType result = 0; 
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        lo, hi, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      using boost::math::constants::pi;
+      result = static_cast<RealType>(1) / (pi<RealType>() * sqrt((x - lo) * (hi - x)));
+      return result;
+    } // pdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const arcsine_distribution<RealType, Policy>& dist, const RealType& x)
+    { // Cumulative Distribution Function arcsine.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      static const char* function = "boost::math::cdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      // Argument checks:
+      RealType result = 0;
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        x_min, x_max, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (x == x_min)
+      {
+        return 0;
+      }
+      else if (x == x_max)
+      {
+        return 1;
+      }
+      using boost::math::constants::pi;
+      result = static_cast<RealType>(2) * asin(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      return result;
+    } // arcsine cdf
+
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<arcsine_distribution<RealType, Policy>, RealType>& c)
+    { // Complemented Cumulative Distribution Function arcsine.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+      static const char* function = "boost::math::cdf(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType x = c.param;
+      arcsine_distribution<RealType, Policy> const& dist = c.dist;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+
+      // Argument checks:
+      RealType result = 0;
+      if (false == arcsine_detail::check_dist_and_x(
+        function,
+        x_min, x_max, x,
+        &result, Policy()))
+      {
+        return result;
+      }
+      if (x == x_min)
+      {
+        return 0;
+      }
+      else if (x == x_max)
+      {
+        return 1;
+      }
+      using boost::math::constants::pi;
+      // Naive version x = 1 - x;
+      // result = static_cast<RealType>(2) * asin(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      // is less accurate, so use acos instead of asin for complement.
+      result = static_cast<RealType>(2) * acos(sqrt((x - x_min) / (x_max - x_min))) / pi<RealType>();
+      return result;
+    } // arcine ccdf
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const arcsine_distribution<RealType, Policy>& dist, const RealType& p)
+    { 
+      // Quantile or Percent Point arcsine function or
+      // Inverse Cumulative probability distribution function CDF.
+      // Return x (0 <= x <= 1),
+      // for a given probability p (0 <= p <= 1).
+      // These functions take a probability as an argument
+      // and return a value such that the probability that a random variable x
+      // will be less than or equal to that value
+      // is whatever probability you supplied as an argument.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      using boost::math::constants::half_pi;
+
+      static const char* function = "boost::math::quantile(arcsine_distribution<%1%> const&, %1%)";
+
+      RealType result = 0; // of argument checks:
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist_and_prob(
+        function,
+        x_min, x_max, p,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (p == 0)
+      {
+        return 0;
+      }
+      if (p == 1)
+      {
+        return 1;
+      }
+
+      RealType sin2hpip = sin(half_pi<RealType>() * p);
+      RealType sin2hpip2 = sin2hpip * sin2hpip;
+      result = -x_min * sin2hpip2 + x_min + x_max * sin2hpip2;
+
+      return result;
+    } // quantile
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<arcsine_distribution<RealType, Policy>, RealType>& c)
+    { 
+      // Complement Quantile or Percent Point arcsine function.
+      // Return the number of expected x for a given
+      // complement of the probability q.
+      BOOST_MATH_STD_USING // For ADL of std functions.
+
+      using boost::math::constants::half_pi;
+      static const char* function = "boost::math::quantile(arcsine_distribution<%1%> const&, %1%)";
+
+      // Error checks:
+      RealType q = c.param;
+      const arcsine_distribution<RealType, Policy>& dist = c.dist;
+      RealType result = 0;
+      RealType x_min = dist.x_min();
+      RealType x_max = dist.x_max();
+      if (false == arcsine_detail::check_dist_and_prob(
+        function,
+        x_min,
+        x_max,
+        q,
+        &result, Policy()))
+      {
+        return result;
+      }
+      // Special cases:
+      if (q == 1)
+      {
+        return 0;
+      }
+      if (q == 0)
+      {
+        return 1;
+      }
+      // Naive RealType p = 1 - q; result = sin(half_pi<RealType>() * p); loses accuracy, so use a cos alternative instead.
+      //result = cos(half_pi<RealType>() * q); // for arcsine(0,1)
+      //result = result * result;
+      // For generalized arcsine:
+      RealType cos2hpip = cos(half_pi<RealType>() * q);
+      RealType cos2hpip2 = cos2hpip * cos2hpip;
+      result = -x_min * cos2hpip2 + x_min + x_max * cos2hpip2;
+
+      return result;
+    } // Quantile Complement
+
+  } // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#if defined (BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // BOOST_MATH_DIST_ARCSINE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/distributions/hyperexponential.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,634 @@
+//  Copyright 2014 Marco Guazzone (marco.guazzone@gmail.com)
+//
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This module implements the Hyper-Exponential distribution.
+//
+// References:
+// - "Queueing Theory in Manufacturing Systems Analysis and Design" by H.T. Papadopolous, C. Heavey and J. Browne (Chapman & Hall/CRC, 1993)
+// - http://reference.wolfram.com/language/ref/HyperexponentialDistribution.html
+// - http://en.wikipedia.org/wiki/Hyperexponential_distribution
+//
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL_HPP
+#define BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL_HPP
+
+
+#include <boost/config.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/exponential.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/roots.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/size.hpp>
+#include <boost/type_traits/has_pre_increment.hpp>
+#include <cstddef>
+#include <iterator>
+#include <limits>
+#include <numeric>
+#include <utility>
+#include <vector>
+
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+# include <initializer_list>
+#endif
+
+#ifdef _MSC_VER
+# pragma warning (push)
+# pragma warning(disable:4127) // conditional expression is constant
+# pragma warning(disable:4389) // '==' : signed/unsigned mismatch in test_tools
+#endif // _MSC_VER
+
+namespace boost { namespace math {
+
+namespace detail {
+
+template <typename Dist>
+typename Dist::value_type generic_quantile(const Dist& dist, const typename Dist::value_type& p, const typename Dist::value_type& guess, bool comp, const char* function);
+
+} // Namespace detail
+
+
+template <typename RealT, typename PolicyT>
+class hyperexponential_distribution;
+
+
+namespace /*<unnamed>*/ { namespace hyperexp_detail {
+
+template <typename T>
+void normalize(std::vector<T>& v)
+{
+   if(!v.size())
+      return;  // Our error handlers will get this later
+    const T sum = std::accumulate(v.begin(), v.end(), static_cast<T>(0));
+    T final_sum = 0;
+    const typename std::vector<T>::iterator end = --v.end();
+    for (typename std::vector<T>::iterator it = v.begin();
+         it != end;
+         ++it)
+    {
+        *it /= sum;
+        final_sum += *it;
+    }
+    *end = 1 - final_sum;  // avoids round off errors, ensures the probs really do sum to 1.
+}
+
+template <typename RealT, typename PolicyT>
+bool check_probabilities(char const* function, std::vector<RealT> const& probabilities, RealT* presult, PolicyT const& pol)
+{
+    BOOST_MATH_STD_USING
+    const std::size_t n = probabilities.size();
+    RealT sum = 0;
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        if (probabilities[i] < 0
+            || probabilities[i] > 1
+            || !(boost::math::isfinite)(probabilities[i]))
+        {
+            *presult = policies::raise_domain_error<RealT>(function,
+                                                           "The elements of parameter \"probabilities\" must be >= 0 and <= 1, but at least one of them was: %1%.",
+                                                           probabilities[i],
+                                                           pol);
+            return false;
+        }
+        sum += probabilities[i];
+    }
+
+    //
+    // We try to keep phase probabilities correctly normalized in the distribution constructors,
+    // however in practice we have to allow for a very slight divergence from a sum of exactly 1:
+    //
+    if (fabs(sum - 1) > tools::epsilon<RealT>() * 2)
+    {
+        *presult = policies::raise_domain_error<RealT>(function,
+                                                       "The elements of parameter \"probabilities\" must sum to 1, but their sum is: %1%.",
+                                                       sum,
+                                                       pol);
+        return false;
+    }
+
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_rates(char const* function, std::vector<RealT> const& rates, RealT* presult, PolicyT const& pol)
+{
+    const std::size_t n = rates.size();
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        if (rates[i] <= 0
+            || !(boost::math::isfinite)(rates[i]))
+        {
+            *presult = policies::raise_domain_error<RealT>(function,
+                                                           "The elements of parameter \"rates\" must be > 0, but at least one of them is: %1%.",
+                                                           rates[i],
+                                                           pol);
+            return false;
+        }
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_dist(char const* function, std::vector<RealT> const& probabilities, std::vector<RealT> const& rates, RealT* presult, PolicyT const& pol)
+{
+    BOOST_MATH_STD_USING
+    if (probabilities.size() != rates.size())
+    {
+        *presult = policies::raise_domain_error<RealT>(function,
+                                                       "The parameters \"probabilities\" and \"rates\" must have the same length, but their size differ by: %1%.",
+                                                       fabs(static_cast<RealT>(probabilities.size())-static_cast<RealT>(rates.size())),
+                                                       pol);
+        return false;
+    }
+
+    return check_probabilities(function, probabilities, presult, pol)
+           && check_rates(function, rates, presult, pol);
+}
+
+template <typename RealT, typename PolicyT>
+bool check_x(char const* function, RealT x, RealT* presult, PolicyT const& pol)
+{
+    if (x < 0 || (boost::math::isnan)(x))
+    {
+        *presult = policies::raise_domain_error<RealT>(function, "The random variable must be >= 0, but is: %1%.", x, pol);
+        return false;
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+bool check_probability(char const* function, RealT p, RealT* presult, PolicyT const& pol)
+{
+    if (p < 0 || p > 1 || (boost::math::isnan)(p))
+    {
+        *presult = policies::raise_domain_error<RealT>(function, "The probability be >= 0 and <= 1, but is: %1%.", p, pol);
+        return false;
+    }
+    return true;
+}
+
+template <typename RealT, typename PolicyT>
+RealT quantile_impl(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& p, bool comp)
+{
+    // Don't have a closed form so try to numerically solve the inverse CDF...
+
+    typedef typename policies::evaluation<RealT, PolicyT>::type value_type;
+    typedef typename policies::normalise<PolicyT,
+                                         policies::promote_float<false>,
+                                         policies::promote_double<false>,
+                                         policies::discrete_quantile<>,
+                                         policies::assert_undefined<> >::type forwarding_policy;
+
+    static const char* function = comp ? "boost::math::quantile(const boost::math::complemented2_type<boost::math::hyperexponential_distribution<%1%>, %1%>&)"
+                                       : "boost::math::quantile(const boost::math::hyperexponential_distribution<%1%>&, %1%)";
+
+    RealT result = 0;
+
+    if (!check_probability(function, p, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    // A possible (but inaccurate) approximation is given below, where the
+    // quantile is given by the weighted sum of exponential quantiles:
+    RealT guess = 0;
+    if (comp)
+    {
+        for (std::size_t i = 0; i < n; ++i)
+        {
+            const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+            guess += probs[i]*quantile(complement(exp, p));
+        }
+    }
+    else
+    {
+        for (std::size_t i = 0; i < n; ++i)
+        {
+            const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+            guess += probs[i]*quantile(exp, p);
+        }
+    }
+
+    // Fast return in case the Hyper-Exponential is essentially an Exponential
+    if (n == 1)
+    {
+        return guess;
+    }
+
+    value_type q;
+    q = detail::generic_quantile(hyperexponential_distribution<RealT,forwarding_policy>(probs, rates),
+                                 p,
+                                 guess,
+                                 comp,
+                                 function);
+
+    result = policies::checked_narrowing_cast<RealT,forwarding_policy>(q, function);
+
+    return result;
+}
+
+}} // Namespace <unnamed>::hyperexp_detail
+
+
+template <typename RealT = double, typename PolicyT = policies::policy<> >
+class hyperexponential_distribution
+{
+    public: typedef RealT value_type;
+    public: typedef PolicyT policy_type;
+
+
+    public: hyperexponential_distribution()
+    : probs_(1, 1),
+      rates_(1, 1)
+    {
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Four arg constructor: no ambiguity here, the arguments must be two pairs of iterators:
+    public: template <typename ProbIterT, typename RateIterT>
+            hyperexponential_distribution(ProbIterT prob_first, ProbIterT prob_last,
+                                          RateIterT rate_first, RateIterT rate_last)
+    : probs_(prob_first, prob_last),
+      rates_(rate_first, rate_last)
+    {
+        hyperexp_detail::normalize(probs_);
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Two arg constructor from 2 ranges, we SFINAE this out of existance if
+    // either argument type is incrementable as in that case the type is
+    // probably an iterator:
+    public: template <typename ProbRangeT, typename RateRangeT>
+            hyperexponential_distribution(ProbRangeT const& prob_range,
+                                          RateRangeT const& rate_range,
+                                          typename boost::disable_if_c<boost::has_pre_increment<ProbRangeT>::value || boost::has_pre_increment<RateRangeT>::value>::type* = 0)
+    : probs_(boost::begin(prob_range), boost::end(prob_range)),
+      rates_(boost::begin(rate_range), boost::end(rate_range))
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    // Two arg constructor for a pair of iterators: we SFINAE this out of
+    // existance if neither argument types are incrementable.
+    // Note that we allow different argument types here to allow for
+    // construction from an array plus a pointer into that array.
+    public: template <typename RateIterT, typename RateIterT2>
+            hyperexponential_distribution(RateIterT const& rate_first, 
+                                          RateIterT2 const& rate_last, 
+                                          typename boost::enable_if_c<boost::has_pre_increment<RateIterT>::value || boost::has_pre_increment<RateIterT2>::value>::type* = 0)
+    : probs_(std::distance(rate_first, rate_last), 1), // will be normalized below
+      rates_(rate_first, rate_last)
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+      // Initializer list constructor: allows for construction from array literals:
+public: hyperexponential_distribution(std::initializer_list<RealT> l1, std::initializer_list<RealT> l2)
+      : probs_(l1.begin(), l1.end()),
+        rates_(l2.begin(), l2.end())
+      {
+         hyperexp_detail::normalize(probs_);
+
+         RealT err;
+         hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+            probs_,
+            rates_,
+            &err,
+            PolicyT());
+      }
+
+public: hyperexponential_distribution(std::initializer_list<RealT> l1)
+      : probs_(l1.size(), 1),
+        rates_(l1.begin(), l1.end())
+      {
+         hyperexp_detail::normalize(probs_);
+
+         RealT err;
+         hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+            probs_,
+            rates_,
+            &err,
+            PolicyT());
+      }
+#endif // !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+
+    // Single argument constructor: argument must be a range.
+    public: template <typename RateRangeT>
+    hyperexponential_distribution(RateRangeT const& rate_range)
+    : probs_(boost::size(rate_range), 1), // will be normalized below
+      rates_(boost::begin(rate_range), boost::end(rate_range))
+    {
+        hyperexp_detail::normalize(probs_);
+
+        RealT err;
+        hyperexp_detail::check_dist("boost::math::hyperexponential_distribution<%1%>::hyperexponential_distribution",
+                                    probs_,
+                                    rates_,
+                                    &err,
+                                    PolicyT());
+    }
+
+    public: std::vector<RealT> probabilities() const
+    {
+        return probs_;
+    }
+
+    public: std::vector<RealT> rates() const
+    {
+        return rates_;
+    }
+
+    public: std::size_t num_phases() const
+    {
+        return rates_.size();
+    }
+
+
+    private: std::vector<RealT> probs_;
+    private: std::vector<RealT> rates_;
+}; // class hyperexponential_distribution
+
+
+// Convenient type synonym for double.
+typedef hyperexponential_distribution<double> hyperexponential;
+
+
+// Range of permissible values for random variable x
+template <typename RealT, typename PolicyT>
+std::pair<RealT,RealT> range(hyperexponential_distribution<RealT,PolicyT> const&)
+{
+    if (std::numeric_limits<RealT>::has_infinity)
+    {
+        return std::make_pair(static_cast<RealT>(0), std::numeric_limits<RealT>::infinity()); // 0 to +inf.
+    }
+
+    return std::make_pair(static_cast<RealT>(0), tools::max_value<RealT>()); // 0 to +<max value>
+}
+
+// Range of supported values for random variable x.
+// This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+template <typename RealT, typename PolicyT>
+std::pair<RealT,RealT> support(hyperexponential_distribution<RealT,PolicyT> const&)
+{
+    return std::make_pair(tools::min_value<RealT>(), tools::max_value<RealT>()); // <min value> to +<max value>.
+}
+
+template <typename RealT, typename PolicyT>
+RealT pdf(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& x)
+{
+    BOOST_MATH_STD_USING
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::pdf(const boost::math::hyperexponential_distribution<%1%>&, %1%)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*pdf(exp, x);
+        //result += probs[i]*rates[i]*exp(-rates[i]*x);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT cdf(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& x)
+{
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::cdf(const boost::math::hyperexponential_distribution<%1%>&, %1%)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*cdf(exp, x);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT quantile(hyperexponential_distribution<RealT, PolicyT> const& dist, RealT const& p)
+{
+    return hyperexp_detail::quantile_impl(dist, p , false);
+}
+
+template <typename RealT, typename PolicyT>
+RealT cdf(complemented2_type<hyperexponential_distribution<RealT,PolicyT>, RealT> const& c)
+{
+    RealT const& x = c.param;
+    hyperexponential_distribution<RealT,PolicyT> const& dist = c.dist;
+
+    RealT result = 0;
+
+    if (!hyperexp_detail::check_x("boost::math::cdf(boost::math::complemented2_type<const boost::math::hyperexponential_distribution<%1%>&, %1%>)", x, &result, PolicyT()))
+    {
+        return result;
+    }
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*cdf(complement(exp, x));
+    }
+
+    return result;
+}
+
+
+template <typename RealT, typename PolicyT>
+RealT quantile(complemented2_type<hyperexponential_distribution<RealT, PolicyT>, RealT> const& c)
+{
+    RealT const& p = c.param;
+    hyperexponential_distribution<RealT,PolicyT> const& dist = c.dist;
+
+    return hyperexp_detail::quantile_impl(dist, p , true);
+}
+
+template <typename RealT, typename PolicyT>
+RealT mean(hyperexponential_distribution<RealT, PolicyT> const& dist)
+{
+    RealT result = 0;
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const exponential_distribution<RealT,PolicyT> exp(rates[i]);
+
+        result += probs[i]*mean(exp);
+    }
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT variance(hyperexponential_distribution<RealT, PolicyT> const& dist)
+{
+    RealT result = 0;
+
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        result += probs[i]/(rates[i]*rates[i]);
+    }
+
+    const RealT mean = boost::math::mean(dist);
+
+    result = 2*result-mean*mean;
+
+    return result;
+}
+
+template <typename RealT, typename PolicyT>
+RealT skewness(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    BOOST_MATH_STD_USING
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    RealT s1 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i}
+    RealT s2 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^2}
+    RealT s3 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^3}
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const RealT p = probs[i];
+        const RealT r = rates[i];
+        const RealT r2 = r*r;
+        const RealT r3 = r2*r;
+
+        s1 += p/r;
+        s2 += p/r2;
+        s3 += p/r3;
+    }
+
+    const RealT s1s1 = s1*s1;
+
+    const RealT num = (6*s3 - (3*(2*s2 - s1s1) + s1s1)*s1);
+    const RealT den = (2*s2 - s1s1);
+
+    return num / pow(den, static_cast<RealT>(1.5));
+}
+
+template <typename RealT, typename PolicyT>
+RealT kurtosis(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    const std::size_t n = dist.num_phases();
+    const std::vector<RealT> probs = dist.probabilities();
+    const std::vector<RealT> rates = dist.rates();
+
+    RealT s1 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i}
+    RealT s2 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^2}
+    RealT s3 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^3}
+    RealT s4 = 0; // \sum_{i=1}^n \frac{p_i}{\lambda_i^4}
+    for (std::size_t i = 0; i < n; ++i)
+    {
+        const RealT p = probs[i];
+        const RealT r = rates[i];
+        const RealT r2 = r*r;
+        const RealT r3 = r2*r;
+        const RealT r4 = r3*r;
+
+        s1 += p/r;
+        s2 += p/r2;
+        s3 += p/r3;
+        s4 += p/r4;
+    }
+
+    const RealT s1s1 = s1*s1;
+
+    const RealT num = (24*s4 - 24*s3*s1 + 3*(2*(2*s2 - s1s1) + s1s1)*s1s1);
+    const RealT den = (2*s2 - s1s1);
+
+    return num/(den*den);
+}
+
+template <typename RealT, typename PolicyT>
+RealT kurtosis_excess(hyperexponential_distribution<RealT,PolicyT> const& dist)
+{
+    return kurtosis(dist) - 3;
+}
+
+template <typename RealT, typename PolicyT>
+RealT mode(hyperexponential_distribution<RealT,PolicyT> const& /*dist*/)
+{
+    return 0;
+}
+
+}} // namespace boost::math
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+#include <boost/math/distributions/detail/generic_quantile.hpp>
+
+#endif // BOOST_MATH_DISTRIBUTIONS_HYPEREXPONENTIAL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/bernoulli.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,143 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2013 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
+#define _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/unchecked_bernoulli.hpp>
+#include <boost/math/special_functions/detail/bernoulli_details.hpp>
+
+namespace boost { namespace math { 
+   
+namespace detail {
+
+template <class T, class OutputIterator, class Policy, int N>
+OutputIterator bernoulli_number_imp(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol, const mpl::int_<N>& tag)
+{
+   for(std::size_t i = start; (i <= max_bernoulli_b2n<T>::value) && (i < start + n); ++i)
+   {
+      *out = unchecked_bernoulli_imp<T>(i, tag);
+      ++out;
+   }
+   
+   for(std::size_t i = (std::max)(static_cast<std::size_t>(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
+   {
+      // We must overflow:
+      *out = (i & 1 ? 1 : -1) * policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(n)", 0, T(i), pol);
+      ++out;
+   }
+   return out;
+}
+
+template <class T, class OutputIterator, class Policy>
+OutputIterator bernoulli_number_imp(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol, const mpl::int_<0>& tag)
+{
+   for(std::size_t i = start; (i <= max_bernoulli_b2n<T>::value) && (i < start + n); ++i)
+   {
+      *out = unchecked_bernoulli_imp<T>(i, tag);
+      ++out;
+   }
+   //
+   // Short circuit return so we don't grab the mutex below unless we have to:
+   //
+   if(start + n <= max_bernoulli_b2n<T>::value)
+      return out;
+
+   return get_bernoulli_numbers_cache<T, Policy>().copy_bernoulli_numbers(out, start, n, pol);
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline T bernoulli_b2n(const int i, const Policy &pol)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+   if(i < 0)
+      return policies::raise_domain_error<T>("boost::math::bernoulli_b2n<%1%>", "Index should be >= 0 but got %1%", T(i), pol);
+
+   T result = 0; // The = 0 is just to silence compiler warings :-(
+   boost::math::detail::bernoulli_number_imp<T>(&result, static_cast<std::size_t>(i), 1u, pol, tag_type());
+   return result;
+}
+
+template <class T>
+inline T bernoulli_b2n(const int i)
+{
+   return boost::math::bernoulli_b2n<T>(i, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator bernoulli_b2n(const int start_index,
+                                    const unsigned number_of_bernoullis_b2n,
+                                    OutputIterator out_it,
+                                    const Policy& pol)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+   if(start_index < 0)
+   {
+      *out_it = policies::raise_domain_error<T>("boost::math::bernoulli_b2n<%1%>", "Index should be >= 0 but got %1%", T(start_index), pol);
+      return ++out_it;
+   }
+
+   return boost::math::detail::bernoulli_number_imp<T>(out_it, start_index, number_of_bernoullis_b2n, pol, tag_type());
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator bernoulli_b2n(const int start_index,
+                                    const unsigned number_of_bernoullis_b2n,
+                                    OutputIterator out_it)
+{
+   return boost::math::bernoulli_b2n<T, OutputIterator>(start_index, number_of_bernoullis_b2n, out_it, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T tangent_t2n(const int i, const Policy &pol)
+{
+   if(i < 0)
+      return policies::raise_domain_error<T>("boost::math::tangent_t2n<%1%>", "Index should be >= 0 but got %1%", T(i), pol);
+
+   T result;
+   boost::math::detail::get_bernoulli_numbers_cache<T, Policy>().copy_tangent_numbers(&result, i, 1, pol);
+   return result;
+}
+
+template <class T>
+inline T tangent_t2n(const int i)
+{
+   return boost::math::tangent_t2n<T>(i, policies::policy<>());
+}
+
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator tangent_t2n(const int start_index,
+                                    const unsigned number_of_tangent_t2n,
+                                    OutputIterator out_it,
+                                    const Policy& pol)
+{
+   if(start_index < 0)
+   {
+      *out_it = policies::raise_domain_error<T>("boost::math::tangent_t2n<%1%>", "Index should be >= 0 but got %1%", T(start_index), pol);
+      return ++out_it;
+   }
+
+   return boost::math::detail::get_bernoulli_numbers_cache<T, Policy>().copy_tangent_numbers(out_it, start_index, number_of_tangent_t2n, pol);
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator tangent_t2n(const int start_index,
+                                    const unsigned number_of_tangent_t2n,
+                                    OutputIterator out_it)
+{
+   return boost::math::tangent_t2n<T, OutputIterator>(start_index, number_of_tangent_t2n, out_it, policies::policy<>());
+}
+
+} } // namespace boost::math
+
+#endif // _BOOST_BERNOULLI_B2N_2013_05_30_HPP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/bessel_prime.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,359 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_MATH_BESSEL_DERIVATIVES_HPP
+#define BOOST_MATH_BESSEL_DERIVATIVES_HPP
+
+#ifdef _MSC_VER
+#  pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/bessel.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp>
+#include <boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp>
+#include <boost/math/special_functions/detail/bessel_derivatives_linear.hpp>
+
+namespace boost{ namespace math{
+
+namespace detail{
+
+template <class Tag, class T, class Policy>
+inline T cyl_bessel_j_prime_imp(T v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::cyl_bessel_j_prime<%1%>(%1%,%1%)";
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex result:
+   //
+   if (x < 0 && floor(v) != v)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0", x, pol);
+   //
+   // Special cases for x == 0:
+   //
+   if (x == 0)
+   {
+      if (v == 1)
+         return 0.5;
+      else if (v == -1)
+         return -0.5;
+      else if (floor(v) == v || v > 1)
+         return 0;
+      else return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   }
+   //
+   // Special case for large x: use asymptotic expansion:
+   //
+   if (boost::math::detail::asymptotic_bessel_derivative_large_x_limit(v, x))
+      return boost::math::detail::asymptotic_bessel_j_derivative_large_x_2(v, x);
+   //
+   // Special case for small x: use Taylor series:
+   //
+   if ((abs(x) < 5) || (abs(v) > x * x / 4))
+   {
+      bool inversed = false;
+      if (floor(v) == v && v < 0)
+      {
+         v = -v;
+         if (itrunc(v, pol) & 1)
+            inversed = true;
+      }
+      T r = boost::math::detail::bessel_j_derivative_small_z_series(v, x, pol);
+      return inversed ? T(-r) : r;
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_bessel_j_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_j_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class T, class Policy>
+inline T sph_bessel_j_prime_imp(unsigned v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::sph_bessel_prime<%1%>(%1%,%1%)";
+   //
+   // Prevent complex result:
+   //
+   if (x < 0)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0.", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return (x == 0) ? boost::math::policies::raise_overflow_error<T>(function, 0, pol)
+         : static_cast<T>(-boost::math::detail::sph_bessel_j_imp<T>(1, x, pol));
+   //
+   // Special case for x == 0 and v > 0:
+   //
+   if (x == 0)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::sph_bessel_j_derivative_linear(v, x, pol);
+}
+
+template <class T, class Policy>
+inline T cyl_bessel_i_prime_imp(T v, T x, const Policy& pol)
+{
+   static const char* const function = "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)";
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex result:
+   //
+   if (x < 0 && floor(v) != v)
+      return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function requires x >= 0", x, pol);
+   //
+   // Special cases for x == 0:
+   //
+   if (x == 0)
+   {
+      if (v == 1 || v == -1)
+         return 0.5;
+      else if (floor(v) == v || v > 1)
+         return 0;
+      else return boost::math::policies::raise_domain_error<T>(
+         function,
+         "Got x = %1%, but function is indeterminate for this order", x, pol);
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return boost::math::detail::cyl_bessel_i_imp<T>(1, x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_i_derivative_linear(v, x, pol);
+}
+
+template <class Tag, class T, class Policy>
+inline T cyl_bessel_k_prime_imp(T v, T x, const Policy& pol)
+{
+   //
+   // Prevent complex and indeterminate results:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::cyl_bessel_k_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_bessel_k_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_k_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class Tag, class T, class Policy>
+inline T cyl_neumann_prime_imp(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   //
+   // Prevent complex and indeterminate results:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::cyl_neumann_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0", x, pol);
+   //
+   // Special case for large x: use asymptotic expansion:
+   //
+   if (boost::math::detail::asymptotic_bessel_derivative_large_x_limit(v, x))
+      return boost::math::detail::asymptotic_bessel_y_derivative_large_x_2(v, x);
+   //
+   // Special case for small x: use Taylor series:
+   //
+   if (v > 0 && floor(v) != v)
+   {
+      const T eps = boost::math::policies::get_epsilon<T, Policy>();
+      if (log(eps / 2) > v * log((x * x) / (v * 4)))
+         return boost::math::detail::bessel_y_derivative_small_z_series(v, x, pol);
+   }
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::cyl_neumann_imp<T>(1, x, Tag(), pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::bessel_y_derivative_linear(v, x, Tag(), pol);
+}
+
+template <class T, class Policy>
+inline T sph_neumann_prime_imp(unsigned v, T x, const Policy& pol)
+{
+   //
+   // Prevent complex and indeterminate result:
+   //
+   if (x <= 0)
+      return boost::math::policies::raise_domain_error<T>(
+         "boost::math::sph_neumann_prime<%1%>(%1%,%1%)",
+         "Got x = %1%, but function requires x > 0.", x, pol);
+   //
+   // Special case for v == 0:
+   //
+   if (v == 0)
+      return -boost::math::detail::sph_neumann_imp<T>(1, x, pol);
+   //
+   // Default case:
+   //
+   return boost::math::detail::sph_neumann_derivative_linear(v, x, pol);
+}
+
+} // namespace detail
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_j_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_j_prime(T1 v, T2 x)
+{
+   return cyl_bessel_j_prime(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_bessel_prime(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_bessel_j_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_bessel_j_prime<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_bessel_prime(unsigned v, T x)
+{
+   return sph_bessel_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_i_prime(T1 v, T2 x)
+{
+   return cyl_bessel_i_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_k_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_k_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_bessel_k_prime(T1 v, T2 x)
+{
+   return cyl_bessel_k_prime(v, x, policies::policy<>());
+}
+
+template <class T1, class T2, class Policy>
+inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann_prime(T1 v, T2 x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T1, T2, Policy>::result_type result_type;
+   typedef typename detail::bessel_traits<T1, T2, Policy>::optimisation_tag tag_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_neumann_prime<%1%,%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename detail::bessel_traits<T1, T2, policies::policy<> >::result_type cyl_neumann_prime(T1 v, T2 x)
+{
+   return cyl_neumann_prime(v, x, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline typename detail::bessel_traits<T, T, Policy>::result_type sph_neumann_prime(unsigned v, T x, const Policy& /* pol */)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename detail::bessel_traits<T, T, Policy>::result_type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::sph_neumann_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::sph_neumann_prime<%1%>(%1%,%1%)");
+}
+
+template <class T>
+inline typename detail::bessel_traits<T, T, policies::policy<> >::result_type sph_neumann_prime(unsigned v, T x)
+{
+   return sph_neumann_prime(v, x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_BESSEL_DERIVATIVES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/bernoulli_details.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,653 @@
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 John Maddock
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BERNOULLI_DETAIL_HPP
+#define BOOST_MATH_BERNOULLI_DETAIL_HPP
+
+#include <boost/config.hpp>
+#include <boost/detail/lightweight_mutex.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/math/tools/toms748_solve.hpp>
+
+#ifdef BOOST_HAS_THREADS
+
+#ifndef BOOST_NO_CXX11_HDR_ATOMIC
+#  include <atomic>
+#  define BOOST_MATH_ATOMIC_NS std
+#if ATOMIC_INT_LOCK_FREE == 2
+typedef std::atomic<int> atomic_counter_type;
+typedef int atomic_integer_type;
+#elif ATOMIC_SHORT_LOCK_FREE == 2
+typedef std::atomic<short> atomic_counter_type;
+typedef short atomic_integer_type;
+#elif ATOMIC_LONG_LOCK_FREE == 2
+typedef std::atomic<long> atomic_counter_type;
+typedef long atomic_integer_type;
+#elif ATOMIC_LLONG_LOCK_FREE == 2
+typedef std::atomic<long long> atomic_counter_type;
+typedef long long atomic_integer_type;
+#else
+#  define BOOST_MATH_NO_ATOMIC_INT
+#endif
+
+#else // BOOST_NO_CXX11_HDR_ATOMIC
+//
+// We need Boost.Atomic, but on any platform that supports auto-linking we do
+// not need to link against a separate library:
+//
+#define BOOST_ATOMIC_NO_LIB
+#include <boost/atomic.hpp>
+#  define BOOST_MATH_ATOMIC_NS boost
+
+namespace boost{ namespace math{ namespace detail{
+
+//
+// We need a type to use as an atomic counter:
+//
+#if BOOST_ATOMIC_INT_LOCK_FREE == 2
+typedef boost::atomic<int> atomic_counter_type;
+typedef int atomic_integer_type;
+#elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
+typedef boost::atomic<short> atomic_counter_type;
+typedef short atomic_integer_type;
+#elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
+typedef boost::atomic<long> atomic_counter_type;
+typedef long atomic_integer_type;
+#elif BOOST_ATOMIC_LLONG_LOCK_FREE == 2
+typedef boost::atomic<long long> atomic_counter_type;
+typedef long long atomic_integer_type;
+#else
+#  define BOOST_MATH_NO_ATOMIC_INT
+#endif
+
+}}} // namespaces
+
+#endif  // BOOST_NO_CXX11_HDR_ATOMIC
+
+#endif // BOOST_HAS_THREADS
+
+namespace boost{ namespace math{ namespace detail{
+//
+// Asymptotic expansion for B2n due to
+// Luschny LogB3 formula (http://www.luschny.de/math/primes/bernincl.html)
+//
+template <class T, class Policy>
+T b2n_asymptotic(int n)
+{
+   BOOST_MATH_STD_USING
+   const T nx = static_cast<T>(n);
+   const T nx2(nx * nx);
+
+   const T approximate_log_of_bernoulli_bn = 
+        ((boost::math::constants::half<T>() + nx) * log(nx))
+        + ((boost::math::constants::half<T>() - nx) * log(boost::math::constants::pi<T>()))
+        + (((T(3) / 2) - nx) * boost::math::constants::ln_two<T>())
+        + ((nx * (T(2) - (nx2 * 7) * (1 + ((nx2 * 30) * ((nx2 * 12) - 1))))) / (((nx2 * nx2) * nx2) * 2520));
+   return ((n / 2) & 1 ? 1 : -1) * (approximate_log_of_bernoulli_bn > tools::log_max_value<T>() 
+      ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, nx, Policy())
+      : static_cast<T>(exp(approximate_log_of_bernoulli_bn)));
+}
+
+template <class T, class Policy>
+T t2n_asymptotic(int n)
+{
+   BOOST_MATH_STD_USING
+   // Just get B2n and convert to a Tangent number:
+   T t2n = fabs(b2n_asymptotic<T, Policy>(2 * n)) / (2 * n);
+   T p2 = ldexp(T(1), n);
+   if(tools::max_value<T>() / p2 < t2n)
+      return policies::raise_overflow_error<T>("boost::math::tangent_t2n<%1%>(std::size_t)", 0, T(n), Policy());
+   t2n *= p2;
+   p2 -= 1;
+   if(tools::max_value<T>() / p2 < t2n)
+      return policies::raise_overflow_error<T>("boost::math::tangent_t2n<%1%>(std::size_t)", 0, Policy());
+   t2n *= p2;
+   return t2n;
+}
+//
+// We need to know the approximate value of /n/ which will
+// cause bernoulli_b2n<T>(n) to return infinity - this allows
+// us to elude a great deal of runtime checking for values below
+// n, and only perform the full overflow checks when we know that we're
+// getting close to the point where our calculations will overflow.
+// We use Luschny's LogB3 formula (http://www.luschny.de/math/primes/bernincl.html) 
+// to find the limit, and since we're dealing with the log of the Bernoulli numbers
+// we need only perform the calculation at double precision and not with T
+// (which may be a multiprecision type).  The limit returned is within 1 of the true
+// limit for all the types tested.  Note that although the code below is basically
+// the same as b2n_asymptotic above, it has been recast as a continuous real-valued 
+// function as this makes the root finding go smoother/faster.  It also omits the
+// sign of the Bernoulli number.
+//
+struct max_bernoulli_root_functor
+{
+   max_bernoulli_root_functor(long long t) : target(static_cast<double>(t)) {}
+   double operator()(double n)
+   {
+      BOOST_MATH_STD_USING
+
+      // Luschny LogB3(n) formula.
+
+      const double nx2(n * n);
+
+      const double approximate_log_of_bernoulli_bn
+         =   ((boost::math::constants::half<double>() + n) * log(n))
+           + ((boost::math::constants::half<double>() - n) * log(boost::math::constants::pi<double>()))
+           + (((double(3) / 2) - n) * boost::math::constants::ln_two<double>())
+           + ((n * (2 - (nx2 * 7) * (1 + ((nx2 * 30) * ((nx2 * 12) - 1))))) / (((nx2 * nx2) * nx2) * 2520));
+
+      return approximate_log_of_bernoulli_bn - target;
+   }
+private:
+   double target;
+};
+
+template <class T, class Policy>
+inline std::size_t find_bernoulli_overflow_limit(const mpl::false_&)
+{
+   long long t = lltrunc(boost::math::tools::log_max_value<T>());
+   max_bernoulli_root_functor fun(t);
+   boost::math::tools::equal_floor tol;
+   boost::uintmax_t max_iter = boost::math::policies::get_max_root_iterations<Policy>();
+   return static_cast<std::size_t>(boost::math::tools::toms748_solve(fun, sqrt(double(t)), double(t), tol, max_iter).first) / 2;
+}
+
+template <class T, class Policy>
+inline std::size_t find_bernoulli_overflow_limit(const mpl::true_&)
+{
+   return max_bernoulli_index<bernoulli_imp_variant<T>::value>::value;
+}
+
+template <class T, class Policy>
+std::size_t b2n_overflow_limit()
+{
+   // This routine is called at program startup if it's called at all:
+   // that guarantees safe initialization of the static variable.
+   typedef mpl::bool_<(bernoulli_imp_variant<T>::value >= 1) && (bernoulli_imp_variant<T>::value <= 3)> tag_type;
+   static const std::size_t lim = find_bernoulli_overflow_limit<T, Policy>(tag_type());
+   return lim;
+}
+
+//
+// The tangent numbers grow larger much more rapidly than the Bernoulli numbers do....
+// so to compute the Bernoulli numbers from the tangent numbers, we need to avoid spurious
+// overflow in the calculation, we can do this by scaling all the tangent number by some scale factor:
+//
+template <class T>
+inline typename enable_if_c<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2), T>::type tangent_scale_factor()
+{
+   BOOST_MATH_STD_USING
+   return ldexp(T(1), std::numeric_limits<T>::min_exponent + 5);
+}
+template <class T>
+inline typename disable_if_c<std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2), T>::type tangent_scale_factor()
+{
+   return tools::min_value<T>() * 16;
+}
+//
+// Initializer: ensure all our constants are initialized prior to the first call of main:
+//
+template <class T, class Policy>
+struct bernoulli_initializer
+{
+   struct init
+   {
+      init()
+      {
+         //
+         // We call twice, once to initialize our static table, and once to
+         // initialize our dymanic table:
+         //
+         boost::math::bernoulli_b2n<T>(2, Policy());
+         try{
+            boost::math::bernoulli_b2n<T>(max_bernoulli_b2n<T>::value + 1, Policy());
+         } catch(const std::overflow_error&){}
+         boost::math::tangent_t2n<T>(2, Policy());
+      }
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename bernoulli_initializer<T, Policy>::init bernoulli_initializer<T, Policy>::initializer;
+
+//
+// We need something to act as a cache for our calculated Bernoulli numbers.  In order to
+// ensure both fast access and thread safety, we need a stable table which may be extended
+// in size, but which never reallocates: that way values already calculated may be accessed
+// concurrently with another thread extending the table with new values.
+//
+// Very very simple vector class that will never allocate more than once, we could use
+// boost::container::static_vector here, but that allocates on the stack, which may well
+// cause issues for the amount of memory we want in the extreme case...
+//
+template <class T>
+struct fixed_vector : private std::allocator<T>
+{
+   typedef unsigned size_type;
+   typedef T* iterator;
+   typedef const T* const_iterator;
+   fixed_vector() : m_used(0)
+   { 
+      std::size_t overflow_limit = 5 + b2n_overflow_limit<T, policies::policy<> >();
+      m_capacity = static_cast<unsigned>((std::min)(overflow_limit, static_cast<std::size_t>(100000u)));
+      m_data = this->allocate(m_capacity); 
+   }
+   ~fixed_vector()
+   {
+      for(unsigned i = 0; i < m_used; ++i)
+         this->destroy(&m_data[i]);
+      this->deallocate(m_data, m_capacity);
+   }
+   T& operator[](unsigned n) { BOOST_ASSERT(n < m_used); return m_data[n]; }
+   const T& operator[](unsigned n)const { BOOST_ASSERT(n < m_used); return m_data[n]; }
+   unsigned size()const { return m_used; }
+   unsigned size() { return m_used; }
+   void resize(unsigned n, const T& val)
+   {
+      if(n > m_capacity)
+         throw std::runtime_error("Exhausted storage for Bernoulli numbers.");
+      for(unsigned i = m_used; i < n; ++i)
+         new (m_data + i) T(val);
+      m_used = n;
+   }
+   void resize(unsigned n) { resize(n, T()); }
+   T* begin() { return m_data; }
+   T* end() { return m_data + m_used; }
+   T* begin()const { return m_data; }
+   T* end()const { return m_data + m_used; }
+   unsigned capacity()const { return m_capacity; }
+private:
+   T* m_data;
+   unsigned m_used, m_capacity;
+};
+
+template <class T, class Policy>
+class bernoulli_numbers_cache
+{
+public:
+   bernoulli_numbers_cache() : m_overflow_limit((std::numeric_limits<std::size_t>::max)())
+#if defined(BOOST_HAS_THREADS) && !defined(BOOST_MATH_NO_ATOMIC_INT)
+      , m_counter(0)
+#endif
+   {}
+
+   typedef fixed_vector<T> container_type;
+
+   void tangent(std::size_t m)
+   {
+      static const std::size_t min_overflow_index = b2n_overflow_limit<T, Policy>() - 1;
+      tn.resize(static_cast<typename container_type::size_type>(m), T(0U));
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(min_overflow_index);
+
+      std::size_t prev_size = m_intermediates.size();
+      m_intermediates.resize(m, T(0U));
+
+      if(prev_size == 0)
+      {
+         m_intermediates[1] = tangent_scale_factor<T>() /*T(1U)*/;
+         tn[0U] = T(0U);
+         tn[1U] = tangent_scale_factor<T>()/* T(1U)*/;
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[0]);
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[1]);
+      }
+
+      for(std::size_t i = std::max<size_t>(2, prev_size); i < m; i++)
+      {
+         bool overflow_check = false;
+         if(i >= min_overflow_index && (boost::math::tools::max_value<T>() / (i-1) < m_intermediates[1]) )
+         {
+            std::fill(tn.begin() + i, tn.end(), boost::math::tools::max_value<T>());
+            break;
+         }
+         m_intermediates[1] = m_intermediates[1] * (i-1);
+         for(std::size_t j = 2; j <= i; j++)
+         {
+            overflow_check =
+                  (i >= min_overflow_index) && (
+                  (boost::math::tools::max_value<T>() / (i - j) < m_intermediates[j])
+                  || (boost::math::tools::max_value<T>() / (i - j + 2) < m_intermediates[j-1])
+                  || (boost::math::tools::max_value<T>() - m_intermediates[j] * (i - j) < m_intermediates[j-1] * (i - j + 2))
+                  || ((boost::math::isinf)(m_intermediates[j]))
+                );
+
+            if(overflow_check)
+            {
+               std::fill(tn.begin() + i, tn.end(), boost::math::tools::max_value<T>());
+               break;
+            }
+            m_intermediates[j] = m_intermediates[j] * (i - j) + m_intermediates[j-1] * (i - j + 2);
+         }
+         if(overflow_check)
+            break; // already filled the tn...
+         tn[static_cast<typename container_type::size_type>(i)] = m_intermediates[i];
+         BOOST_MATH_INSTRUMENT_VARIABLE(i);
+         BOOST_MATH_INSTRUMENT_VARIABLE(tn[static_cast<typename container_type::size_type>(i)]);
+      }
+   }
+
+   void tangent_numbers_series(const std::size_t m)
+   {
+      BOOST_MATH_STD_USING
+      static const std::size_t min_overflow_index = b2n_overflow_limit<T, Policy>() - 1;
+
+      typename container_type::size_type old_size = bn.size();
+
+      tangent(m);
+      bn.resize(static_cast<typename container_type::size_type>(m));
+
+      if(!old_size)
+      {
+         bn[0] = 1;
+         old_size = 1;
+      }
+
+      T power_two(ldexp(T(1), static_cast<int>(2 * old_size)));
+
+      for(std::size_t i = old_size; i < m; i++)
+      {
+         T b(static_cast<T>(i * 2));
+         //
+         // Not only do we need to take care to avoid spurious over/under flow in
+         // the calculation, but we also need to avoid overflow altogether in case
+         // we're calculating with a type where "bad things" happen in that case:
+         //
+         b  = b / (power_two * tangent_scale_factor<T>());
+         b /= (power_two - 1);
+         bool overflow_check = (i >= min_overflow_index) && (tools::max_value<T>() / tn[static_cast<typename container_type::size_type>(i)] < b);
+         if(overflow_check)
+         {
+            m_overflow_limit = i;
+            while(i < m)
+            {
+               b = std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : tools::max_value<T>();
+               bn[static_cast<typename container_type::size_type>(i)] = ((i % 2U) ? b : T(-b));
+               ++i;
+            }
+            break;
+         }
+         else
+         {
+            b *= tn[static_cast<typename container_type::size_type>(i)];
+         }
+
+         power_two = ldexp(power_two, 2);
+
+         const bool b_neg = i % 2 == 0;
+
+         bn[static_cast<typename container_type::size_type>(i)] = ((!b_neg) ? b : T(-b));
+      }
+   }
+
+   template <class OutputIterator>
+   OutputIterator copy_bernoulli_numbers(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol)
+   {
+      //
+      // There are basically 3 thread safety options:
+      //
+      // 1) There are no threads (BOOST_HAS_THREADS is not defined).
+      // 2) There are threads, but we do not have a true atomic integer type, 
+      //    in this case we just use a mutex to guard against race conditions.
+      // 3) There are threads, and we have an atomic integer: in this case we can
+      //    use the double-checked locking pattern to avoid thread synchronisation
+      //    when accessing values already in the cache.
+      //
+      // First off handle the common case for overflow and/or asymptotic expansion:
+      //
+      if(start + n > bn.capacity())
+      {
+         if(start < bn.capacity())
+         {
+            out = copy_bernoulli_numbers(out, start, bn.capacity() - start, pol);
+            n -= bn.capacity() - start;
+            start = static_cast<std::size_t>(bn.capacity());
+         }
+         if(start < b2n_overflow_limit<T, Policy>() + 2u)
+         {
+            for(; n; ++start, --n)
+            {
+               *out = b2n_asymptotic<T, Policy>(static_cast<typename container_type::size_type>(start * 2U));
+               ++out;
+            }
+         }
+         for(; n; ++start, --n)
+         {
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(start), pol);
+            ++out;
+         }
+         return out;
+      }
+   #if !defined(BOOST_HAS_THREADS)
+      //
+      // Single threaded code, very simple:
+      //
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
+         ++out;
+      }
+   #elif defined(BOOST_MATH_NO_ATOMIC_INT)
+      //
+      // We need to grab a mutex every time we get here, for both readers and writers:
+      //
+      boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
+         ++out;
+      }
+
+   #else
+      //
+      // Double-checked locking pattern, lets us access cached already cached values
+      // without locking:
+      //
+      // Get the counter and see if we need to calculate more constants:
+      //
+      if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+      {
+         boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+
+         if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+         {
+            if(start + n >= bn.size())
+            {
+               std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+               tangent_numbers_series(new_size);
+            }
+            m_counter.store(static_cast<atomic_integer_type>(bn.size()), BOOST_MATH_ATOMIC_NS::memory_order_release);
+         }
+      }
+
+      for(std::size_t i = (std::max)(static_cast<std::size_t>(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
+      {
+         *out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[static_cast<typename container_type::size_type>(i)];
+         ++out;
+      }
+
+   #endif
+      return out;
+   }
+
+   template <class OutputIterator>
+   OutputIterator copy_tangent_numbers(OutputIterator out, std::size_t start, std::size_t n, const Policy& pol)
+   {
+      //
+      // There are basically 3 thread safety options:
+      //
+      // 1) There are no threads (BOOST_HAS_THREADS is not defined).
+      // 2) There are threads, but we do not have a true atomic integer type, 
+      //    in this case we just use a mutex to guard against race conditions.
+      // 3) There are threads, and we have an atomic integer: in this case we can
+      //    use the double-checked locking pattern to avoid thread synchronisation
+      //    when accessing values already in the cache.
+      //
+      //
+      // First off handle the common case for overflow and/or asymptotic expansion:
+      //
+      if(start + n > bn.capacity())
+      {
+         if(start < bn.capacity())
+         {
+            out = copy_tangent_numbers(out, start, bn.capacity() - start, pol);
+            n -= bn.capacity() - start;
+            start = static_cast<std::size_t>(bn.capacity());
+         }
+         if(start < b2n_overflow_limit<T, Policy>() + 2u)
+         {
+            for(; n; ++start, --n)
+            {
+               *out = t2n_asymptotic<T, Policy>(static_cast<typename container_type::size_type>(start));
+               ++out;
+            }
+         }
+         for(; n; ++start, --n)
+         {
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(start), pol);
+            ++out;
+         }
+         return out;
+      }
+   #if !defined(BOOST_HAS_THREADS)
+      //
+      // Single threaded code, very simple:
+      //
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+   #elif defined(BOOST_MATH_NO_ATOMIC_INT)
+      //
+      // We need to grab a mutex every time we get here, for both readers and writers:
+      //
+      boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+      if(start + n >= bn.size())
+      {
+         std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+         tangent_numbers_series(new_size);
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+
+   #else
+      //
+      // Double-checked locking pattern, lets us access cached already cached values
+      // without locking:
+      //
+      // Get the counter and see if we need to calculate more constants:
+      //
+      if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+      {
+         boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
+
+         if(static_cast<std::size_t>(m_counter.load(BOOST_MATH_ATOMIC_NS::memory_order_consume)) < start + n)
+         {
+            if(start + n >= bn.size())
+            {
+               std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+               tangent_numbers_series(new_size);
+            }
+            m_counter.store(static_cast<atomic_integer_type>(bn.size()), BOOST_MATH_ATOMIC_NS::memory_order_release);
+         }
+      }
+
+      for(std::size_t i = start; i < start + n; ++i)
+      {
+         if(i >= m_overflow_limit)
+            *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+         else
+         {
+            if(tools::max_value<T>() * tangent_scale_factor<T>() < tn[static_cast<typename container_type::size_type>(i)])
+               *out = policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol);
+            else
+               *out = tn[static_cast<typename container_type::size_type>(i)] / tangent_scale_factor<T>();
+         }
+         ++out;
+      }
+
+   #endif
+      return out;
+   }
+
+private:
+   //
+   // The caches for Bernoulli and tangent numbers, once allocated,
+   // these must NEVER EVER reallocate as it breaks our thread
+   // safety guarentees:
+   //
+   fixed_vector<T> bn, tn;
+   std::vector<T> m_intermediates;
+   // The value at which we know overflow has already occured for the Bn:
+   std::size_t m_overflow_limit;
+#if !defined(BOOST_HAS_THREADS)
+#elif defined(BOOST_MATH_NO_ATOMIC_INT)
+   boost::detail::lightweight_mutex m_mutex;
+#else
+   boost::detail::lightweight_mutex m_mutex;
+   atomic_counter_type m_counter;
+#endif
+};
+
+template <class T, class Policy>
+inline bernoulli_numbers_cache<T, Policy>& get_bernoulli_numbers_cache()
+{
+   //
+   // Force this function to be called at program startup so all the static variables
+   // get initailzed then (thread safety).
+   //
+   bernoulli_initializer<T, Policy>::force_instantiate();
+   static bernoulli_numbers_cache<T, Policy> data;
+   return data;
+}
+
+}}}
+
+#endif // BOOST_MATH_BERNOULLI_DETAIL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_derivatives_linear.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is a partial header, do not include on it's own!!!
+//
+// Linear combination for bessel derivatives are defined here
+#ifndef BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
+#define BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Tag, class Policy>
+inline T bessel_j_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_j_imp<T>(v-1, x, tag, pol) - boost::math::detail::cyl_bessel_j_imp<T>(v+1, x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T bessel_j_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_j_imp<T>(itrunc(v-1), x, tag, pol) - boost::math::detail::cyl_bessel_j_imp<T>(itrunc(v+1), x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T sph_bessel_j_derivative_linear(unsigned v, T x, Policy pol)
+{
+   return (v / x) * boost::math::detail::sph_bessel_j_imp<T>(v, x, pol) - boost::math::detail::sph_bessel_j_imp<T>(v+1, x, pol);
+}
+
+template <class T, class Policy>
+inline T bessel_i_derivative_linear(T v, T x, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_i_imp<T>(v-1, x, pol) + boost::math::detail::cyl_bessel_i_imp<T>(v+1, x, pol)) / 2;
+}
+
+template <class T, class Tag, class Policy>
+inline T bessel_k_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_k_imp<T>(v-1, x, tag, pol) + boost::math::detail::cyl_bessel_k_imp<T>(v+1, x, tag, pol)) / -2;
+}
+
+template <class T, class Policy>
+inline T bessel_k_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_bessel_k_imp<T>(itrunc(v-1), x, tag, pol) + boost::math::detail::cyl_bessel_k_imp<T>(itrunc(v+1), x, tag, pol)) / -2;
+}
+
+template <class T, class Tag, class Policy>
+inline T bessel_y_derivative_linear(T v, T x, Tag tag, Policy pol)
+{
+   return (boost::math::detail::cyl_neumann_imp<T>(v-1, x, tag, pol) - boost::math::detail::cyl_neumann_imp<T>(v+1, x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T bessel_y_derivative_linear(T v, T x, const bessel_int_tag& tag, Policy pol)
+{
+   return (boost::math::detail::cyl_neumann_imp<T>(itrunc(v-1), x, tag, pol) - boost::math::detail::cyl_neumann_imp<T>(itrunc(v+1), x, tag, pol)) / 2;
+}
+
+template <class T, class Policy>
+inline T sph_neumann_derivative_linear(unsigned v, T x, Policy pol)
+{
+   return (v / x) * boost::math::detail::sph_neumann_imp<T>(v, x, pol) - boost::math::detail::sph_neumann_imp<T>(v+1, x, pol);
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SF_DETAIL_BESSEL_DERIVATIVES_LINEAR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_jy_derivatives_asym.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,141 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// This is a partial header, do not include on it's own!!!
+//
+// Contains asymptotic expansions for derivatives of Bessel J(v,x) and Y(v,x)
+// functions, as x -> INF.
+#ifndef BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
+#define BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline T asymptotic_bessel_derivative_amplitude(T v, T x)
+{
+   // Calculate the amplitude for J'(v,x) and I'(v,x)
+   // for large x: see A&S 9.2.30.
+   BOOST_MATH_STD_USING
+   T s = 1;
+   const T mu = 4 * v * v;
+   T txq = 2 * x;
+   txq *= txq;
+
+   s -= (mu - 3) / (2 * txq);
+   s -= ((mu - 1) * (mu - 45)) / (txq * txq * 8);
+
+   return sqrt(s * 2 / (boost::math::constants::pi<T>() * x));
+}
+
+template <class T>
+inline T asymptotic_bessel_derivative_phase_mx(T v, T x)
+{
+   // Calculate the phase of J'(v, x) and Y'(v, x) for large x.
+   // See A&S 9.2.31.
+   // Note that the result returned is the phase less (x - PI(v/2 - 1/4))
+   // which we'll factor in later when we calculate the sines/cosines of the result:
+   const T mu = 4 * v * v;
+   const T mu2 = mu * mu;
+   const T mu3 = mu2 * mu;
+   T denom = 4 * x;
+   T denom_mult = denom * denom;
+
+   T s = 0;
+   s += (mu + 3) / (2 * denom);
+   denom *= denom_mult;
+   s += (mu2 + (46 * mu) - 63) / (6 * denom);
+   denom *= denom_mult;
+   s += (mu3 + (185 * mu2) - (2053 * mu) + 1899) / (5 * denom);
+   return s;
+}
+
+template <class T>
+inline T asymptotic_bessel_y_derivative_large_x_2(T v, T x)
+{
+   // See A&S 9.2.20.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   const T ampl = asymptotic_bessel_derivative_amplitude(v, x);
+   const T phase = asymptotic_bessel_derivative_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 - 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   const T cx = cos(x);
+   const T sx = sin(x);
+   const T vd2shifted = (v / 2) - 0.25f;
+   const T ci = cos_pi(vd2shifted);
+   const T si = sin_pi(vd2shifted);
+   const T sin_phase = sin(phase) * (cx * ci + sx * si) + cos(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline T asymptotic_bessel_j_derivative_large_x_2(T v, T x)
+{
+   // See A&S 9.2.20.
+   BOOST_MATH_STD_USING
+   // Get the phase and amplitude:
+   const T ampl = asymptotic_bessel_derivative_amplitude(v, x);
+   const T phase = asymptotic_bessel_derivative_phase_mx(v, x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(ampl);
+   BOOST_MATH_INSTRUMENT_VARIABLE(phase);
+   //
+   // Calculate the sine of the phase, using
+   // sine/cosine addition rules to factor in
+   // the x - PI(v/2 - 1/4) term not added to the
+   // phase when we calculated it.
+   //
+   BOOST_MATH_INSTRUMENT_CODE(cos(phase));
+   BOOST_MATH_INSTRUMENT_CODE(cos(x));
+   BOOST_MATH_INSTRUMENT_CODE(sin(phase));
+   BOOST_MATH_INSTRUMENT_CODE(sin(x));
+   const T cx = cos(x);
+   const T sx = sin(x);
+   const T vd2shifted = (v / 2) - 0.25f;
+   const T ci = cos_pi(vd2shifted);
+   const T si = sin_pi(vd2shifted);
+   const T sin_phase = cos(phase) * (cx * ci + sx * si) - sin(phase) * (sx * ci - cx * si);
+   BOOST_MATH_INSTRUMENT_VARIABLE(sin_phase);
+   return sin_phase * ampl;
+}
+
+template <class T>
+inline bool asymptotic_bessel_derivative_large_x_limit(const T& v, const T& x)
+{
+   BOOST_MATH_STD_USING
+   //
+   // This function is the copy of math::asymptotic_bessel_large_x_limit
+   // It means that we use the same rules for determining how x is large
+   // compared to v.
+   //
+   // Determines if x is large enough compared to v to take the asymptotic
+   // forms above.  From A&S 9.2.28 we require:
+   //    v < x * eps^1/8
+   // and from A&S 9.2.29 we require:
+   //    v^12/10 < 1.5 * x * eps^1/10
+   // using the former seems to work OK in practice with broadly similar
+   // error rates either side of the divide for v < 10000.
+   // At double precision eps^1/8 ~= 0.01.
+   //
+   return (std::max)(T(fabs(v)), T(1)) < x * sqrt(boost::math::tools::forth_root_epsilon<T>());
+}
+
+}}} // namespaces
+
+#endif // BOOST_MATH_SF_DETAIL_BESSEL_JY_DERIVATIVES_ASYM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,220 @@
+//  Copyright (c) 2013 Anton Bikineev
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_BESSEL_JY_DERIVATIVES_SERIES_HPP
+#define BOOST_MATH_BESSEL_JY_DERIVATIVES_SERIES_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+struct bessel_j_derivative_small_z_series_term
+{
+   typedef T result_type;
+
+   bessel_j_derivative_small_z_series_term(T v_, T x)
+      : N(0), v(v_), term(1), mult(x / 2)
+   {
+      mult *= -mult;
+      // iterate if v == 0; otherwise result of
+      // first term is 0 and tools::sum_series stops
+      if (v == 0)
+         iterate();
+   }
+   T operator()()
+   {
+      T r = term * (v + 2 * N);
+      iterate();
+      return r;
+   }
+private:
+   void iterate()
+   {
+      ++N;
+      term *= mult / (N * (N + v));
+   }
+   unsigned N;
+   T v;
+   T term;
+   T mult;
+};
+//
+// Series evaluation for BesselJ'(v, z) as z -> 0.
+// It's derivative of http://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/06/01/04/01/01/0003/
+// Converges rapidly for all z << v.
+//
+template <class T, class Policy>
+inline T bessel_j_derivative_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   T prefix;
+   if (v < boost::math::max_factorial<T>::value)
+   {
+      prefix = pow(x / 2, v - 1) / 2 / boost::math::tgamma(v + 1, pol);
+   }
+   else
+   {
+      prefix = (v - 1) * log(x / 2) - constants::ln_two<T>() - boost::math::lgamma(v + 1, pol);
+      prefix = exp(prefix);
+   }
+   if (0 == prefix)
+      return prefix;
+
+   bessel_j_derivative_small_z_series_term<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   boost::math::policies::check_series_iterations<T>("boost::math::bessel_j_derivative_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   return prefix * result;
+}
+
+template <class T, class Policy>
+struct bessel_y_derivative_small_z_series_term_a
+{
+   typedef T result_type;
+
+   bessel_y_derivative_small_z_series_term_a(T v_, T x)
+      : N(0), v(v_)
+   {
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term * (-v + 2 * N);
+      ++N;
+      term *= mult / (N * (N - v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+
+template <class T, class Policy>
+struct bessel_y_derivative_small_z_series_term_b
+{
+   typedef T result_type;
+
+   bessel_y_derivative_small_z_series_term_b(T v_, T x)
+      : N(0), v(v_)
+   {
+      mult = x / 2;
+      mult *= -mult;
+      term = 1;
+   }
+   T operator()()
+   {
+      T r = term * (v + 2 * N);
+      ++N;
+      term *= mult / (N * (N + v));
+      return r;
+   }
+private:
+   unsigned N;
+   T v;
+   T mult;
+   T term;
+};
+//
+// Series form for BesselY' as z -> 0,
+// It's derivative of http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/01/0003/
+// This series is only useful when the second term is small compared to the first
+// otherwise we get catestrophic cancellation errors.
+//
+// Approximating tgamma(v) by v^v, and assuming |tgamma(-z)| < eps we end up requiring:
+// eps/2 * v^v(x/2)^-v > (x/2)^v or log(eps/2) > v log((x/2)^2/v)
+//
+template <class T, class Policy>
+inline T bessel_y_derivative_small_z_series(T v, T x, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   static const char* function = "bessel_y_derivative_small_z_series<%1%>(%1%,%1%)";
+   T prefix;
+   T gam;
+   T p = log(x / 2);
+   T scale = 1;
+   bool need_logs = (v >= boost::math::max_factorial<T>::value) || (boost::math::tools::log_max_value<T>() / v < fabs(p));
+   if (!need_logs)
+   {
+      gam = boost::math::tgamma(v, pol);
+      p = pow(x / 2, v + 1) * 2;
+      if (boost::math::tools::max_value<T>() * p < gam)
+      {
+         scale /= gam;
+         gam = 1;
+         if (boost::math::tools::max_value<T>() * p < gam)
+         {
+            return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -gam / (boost::math::constants::pi<T>() * p);
+   }
+   else
+   {
+      gam = boost::math::lgamma(v, pol);
+      p = (v + 1) * p + constants::ln_two<T>();
+      prefix = gam - log(boost::math::constants::pi<T>()) - p;
+      if (boost::math::tools::log_max_value<T>() < prefix)
+      {
+         prefix -= log(boost::math::tools::max_value<T>() / 4);
+         scale /= (boost::math::tools::max_value<T>() / 4);
+         if (boost::math::tools::log_max_value<T>() < prefix)
+         {
+            return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+         }
+      }
+      prefix = -exp(prefix);
+   }
+   bessel_y_derivative_small_z_series_term_a<T, Policy> s(v, x);
+   boost::uintmax_t max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T zero = 0;
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   boost::math::policies::check_series_iterations<T>("boost::math::bessel_y_derivative_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
+   result *= prefix;
+
+   p = pow(x / 2, v - 1) / 2;
+   if (!need_logs)
+   {
+      prefix = boost::math::tgamma(-v, pol) * boost::math::cos_pi(v) * p / boost::math::constants::pi<T>();
+   }
+   else
+   {
+      int sgn;
+      prefix = boost::math::lgamma(-v, &sgn, pol) + (v - 1) * log(x / 2) - constants::ln_two<T>();
+      prefix = exp(prefix) * sgn / boost::math::constants::pi<T>();
+   }
+   bessel_y_derivative_small_z_series_term_b<T, Policy> s2(v, x);
+   max_iter = boost::math::policies::get_max_series_iterations<Policy>();
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
+#else
+   T b = boost::math::tools::sum_series(s2, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
+#endif
+   result += scale * prefix * b;
+   return result;
+}
+
+// Calculating of BesselY'(v,x) with small x (x < epsilon) and integer x using derivatives
+// of formulas in http://functions.wolfram.com/Bessel-TypeFunctions/BesselY/06/01/04/01/02/
+// seems to lose precision. Instead using linear combination of regular Bessel is preferred.
+
+}}} // namespaces
+
+#endif // BOOST_MATH_BESSEL_JY_DERIVATVIES_SERIES_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/polygamma.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,538 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2014 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+  #define _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+
+  #include <cmath>
+  #include <limits>
+  #include <boost/cstdint.hpp>
+  #include <boost/math/policies/policy.hpp>
+  #include <boost/math/special_functions/bernoulli.hpp>
+  #include <boost/math/special_functions/trunc.hpp>
+  #include <boost/math/special_functions/zeta.hpp>
+  #include <boost/math/special_functions/digamma.hpp>
+  #include <boost/math/special_functions/sin_pi.hpp>
+  #include <boost/math/special_functions/cos_pi.hpp>
+  #include <boost/math/special_functions/pow.hpp>
+  #include <boost/mpl/if.hpp>
+  #include <boost/mpl/int.hpp>
+  #include <boost/static_assert.hpp>
+  #include <boost/type_traits/is_convertible.hpp>
+
+  namespace boost { namespace math { namespace detail{
+
+  template<class T, class Policy>
+  T polygamma_atinfinityplus(const int n, const T& x, const Policy& pol, const char* function) // for large values of x such as for x> 400
+  {
+     // See http://functions.wolfram.com/GammaBetaErf/PolyGamma2/06/02/0001/
+     BOOST_MATH_STD_USING
+     //
+     // sum       == current value of accumulated sum.
+     // term      == value of current term to be added to sum.
+     // part_term == value of current term excluding the Bernoulli number part
+     //
+     if(n + x == x)
+     {
+        // x is crazy large, just concentrate on the first part of the expression and use logs:
+        if(n == 1) return 1 / x;
+        T nlx = n * log(x);
+        if((nlx < tools::log_max_value<T>()) && (n < max_factorial<T>::value))
+           return ((n & 1) ? 1 : -1) * boost::math::factorial<T>(n - 1) * pow(x, -n);
+        else
+         return ((n & 1) ? 1 : -1) * exp(boost::math::lgamma(T(n), pol) - n * log(x));
+     }
+     T term, sum, part_term;
+     T x_squared = x * x;
+     //
+     // Start by setting part_term to:
+     //
+     // (n-1)! / x^(n+1)
+     //
+     // which is common to both the first term of the series (with k = 1)
+     // and to the leading part.  
+     // We can then get to the leading term by:
+     //
+     // part_term * (n + 2 * x) / 2
+     //
+     // and to the first term in the series 
+     // (excluding the Bernoulli number) by:
+     //
+     // part_term n * (n + 1) / (2x)
+     //
+     // If either the factorial would overflow,
+     // or the power term underflows, this just gets set to 0 and then we
+     // know that we have to use logs for the initial terms:
+     //
+     part_term = ((n > boost::math::max_factorial<T>::value) && (T(n) * n > tools::log_max_value<T>())) 
+        ? T(0) : static_cast<T>(boost::math::factorial<T>(n - 1, pol) * pow(x, -n - 1));
+     if(part_term == 0)
+     {
+        // Either n is very large, or the power term underflows,
+        // set the initial values of part_term, term and sum via logs:
+        part_term = boost::math::lgamma(n, pol) - (n + 1) * log(x);
+        sum = exp(part_term + log(n + 2 * x) - boost::math::constants::ln_two<T>());
+        part_term += log(T(n) * (n + 1)) - boost::math::constants::ln_two<T>() - log(x);
+        part_term = exp(part_term);
+     }
+     else
+     {
+        sum = part_term * (n + 2 * x) / 2;
+        part_term *= (T(n) * (n + 1)) / 2;
+        part_term /= x;
+     }
+     //
+     // If the leading term is 0, so is the result:
+     //
+     if(sum == 0)
+        return sum;
+
+     for(unsigned k = 1;;)
+     {
+        term = part_term * boost::math::bernoulli_b2n<T>(k, pol);
+        sum += term;
+        //
+        // Normal termination condition:
+        //
+        if(fabs(term / sum) < tools::epsilon<T>())
+           break;
+        //
+        // Increment our counter, and move part_term on to the next value:
+        //
+        ++k;
+        part_term *= T(n + 2 * k - 2) * (n - 1 + 2 * k);
+        part_term /= (2 * k - 1) * 2 * k;
+        part_term /= x_squared;
+        //
+        // Emergency get out termination condition:
+        //
+        if(k > policies::get_max_series_iterations<Policy>())
+        {
+           return policies::raise_evaluation_error(function, "Series did not converge, closest value was %1%", sum, pol);
+        }
+     }
+     
+     if((n - 1) & 1)
+        sum = -sum;
+
+     return sum;
+  }
+
+  template<class T, class Policy>
+  T polygamma_attransitionplus(const int n, const T& x, const Policy& pol, const char* function)
+  {
+    // See: http://functions.wolfram.com/GammaBetaErf/PolyGamma2/16/01/01/0017/
+
+    // Use N = (0.4 * digits) + (4 * n) for target value for x:
+    BOOST_MATH_STD_USING
+    const int d4d  = static_cast<int>(0.4F * policies::digits_base10<T, Policy>());
+    const int N = d4d + (4 * n);
+    const int m    = n;
+    const int iter = N - itrunc(x);
+
+    if(iter > (int)policies::get_max_series_iterations<Policy>())
+       return policies::raise_evaluation_error<T>(function, ("Exceeded maximum series evaluations evaluating at n = " + boost::lexical_cast<std::string>(n) + " and x = %1%").c_str(), x, pol);
+
+    const int minus_m_minus_one = -m - 1;
+
+    T z(x);
+    T sum0(0);
+    T z_plus_k_pow_minus_m_minus_one(0);
+
+    // Forward recursion to larger x, need to check for overflow first though:
+    if(log(z + iter) * minus_m_minus_one > -tools::log_max_value<T>())
+    {
+       for(int k = 1; k <= iter; ++k)
+       {
+          z_plus_k_pow_minus_m_minus_one = pow(z, minus_m_minus_one);
+          sum0 += z_plus_k_pow_minus_m_minus_one;
+          z += 1;
+       }
+       sum0 *= boost::math::factorial<T>(n);
+    }
+    else
+    {
+       for(int k = 1; k <= iter; ++k)
+       {
+          T log_term = log(z) * minus_m_minus_one + boost::math::lgamma(T(n + 1), pol);
+          sum0 += exp(log_term);
+          z += 1;
+       }
+    }
+    if((n - 1) & 1)
+       sum0 = -sum0;
+
+    return sum0 + polygamma_atinfinityplus(n, z, pol, function);
+  }
+
+  template <class T, class Policy>
+  T polygamma_nearzero(int n, T x, const Policy& pol, const char* function)
+  {
+     BOOST_MATH_STD_USING
+     //
+     // If we take this expansion for polygamma: http://functions.wolfram.com/06.15.06.0003.02
+     // and substitute in this expression for polygamma(n, 1): http://functions.wolfram.com/06.15.03.0009.01
+     // we get an alternating series for polygamma when x is small in terms of zeta functions of
+     // integer arguments (which are easy to evaluate, at least when the integer is even).
+     //
+     // In order to avoid spurious overflow, save the n! term for later, and rescale at the end:
+     //
+     T scale = boost::math::factorial<T>(n, pol);
+     //
+     // "factorial_part" contains everything except the zeta function
+     // evaluations in each term:
+     //
+     T factorial_part = 1;
+     //
+     // "prefix" is what we'll be adding the accumulated sum to, it will
+     // be n! / z^(n+1), but since we're scaling by n! it's just 
+     // 1 / z^(n+1) for now:
+     //
+     T prefix = pow(x, n + 1);
+     if(prefix == 0)
+        return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     prefix = 1 / prefix;
+     //
+     // First term in the series is necessarily < zeta(2) < 2, so
+     // ignore the sum if it will have no effect on the result anyway:
+     //
+     if(prefix > 2 / policies::get_epsilon<T, Policy>())
+        return ((n & 1) ? 1 : -1) * 
+         (tools::max_value<T>() / prefix < scale ? policies::raise_overflow_error<T>(function, 0, pol) : prefix * scale);
+     //
+     // As this is an alternating series we could accelerate it using 
+     // "Convergence Acceleration of Alternating Series",
+     // Henri Cohen, Fernando Rodriguez Villegas, and Don Zagier, Experimental Mathematics, 1999.
+     // In practice however, it appears not to make any difference to the number of terms
+     // required except in some edge cases which are filtered out anyway before we get here.
+     //
+     T sum = prefix;
+     for(unsigned k = 0;;)
+     {
+        // Get the k'th term:
+        T term = factorial_part * boost::math::zeta(T(k + n + 1), pol);
+        sum += term;
+        // Termination condition:
+        if(fabs(term) < fabs(sum * boost::math::policies::get_epsilon<T, Policy>()))
+           break;
+        //
+        // Move on k and factorial_part:
+        //
+        ++k;
+        factorial_part *= (-x * (n + k)) / k;
+        //
+        // Last chance exit:
+        //
+        if(k > policies::get_max_series_iterations<Policy>())
+           return policies::raise_evaluation_error<T>(function, "Series did not converge, best value is %1%", sum, pol);
+     }
+     //
+     // We need to multiply by the scale, at each stage checking for oveflow:
+     //
+     if(boost::math::tools::max_value<T>() / scale < sum)
+        return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     sum *= scale;
+     return n & 1 ? sum : -sum;
+  }
+
+  //
+  // Helper function which figures out which slot our coefficient is in
+  // given an angle multiplier for the cosine term of power:
+  //
+  template <class Table>
+  typename Table::value_type::reference dereference_table(Table& table, unsigned row, unsigned power)
+  {
+     return table[row][power / 2];
+  }
+
+
+
+  template <class T, class Policy>
+  T poly_cot_pi(int n, T x, T xc, const Policy& pol, const char* function)
+  {
+     BOOST_MATH_STD_USING
+     // Return n'th derivative of cot(pi*x) at x, these are simply
+     // tabulated for up to n = 9, beyond that it is possible to
+     // calculate coefficients as follows:
+     //
+     // The general form of each derivative is:
+     //
+     // pi^n * SUM{k=0, n} C[k,n] * cos^k(pi * x) * csc^(n+1)(pi * x)
+     //
+     // With constant C[0,1] = -1 and all other C[k,n] = 0;
+     // Then for each k < n+1:
+     // C[k-1, n+1]  -= k * C[k, n];
+     // C[k+1, n+1]  += (k-n-1) * C[k, n];
+     //
+     // Note that there are many different ways of representing this derivative thanks to
+     // the many trigomonetric identies available.  In particular, the sum of powers of
+     // cosines could be replaced by a sum of cosine multiple angles, and indeed if you
+     // plug the derivative into Mathematica this is the form it will give.  The two
+     // forms are related via the Chebeshev polynomials of the first kind and
+     // T_n(cos(x)) = cos(n x).  The polynomial form has the great advantage that
+     // all the cosine terms are zero at half integer arguments - right where this
+     // function has it's minumum - thus avoiding cancellation error in this region.
+     //
+     // And finally, since every other term in the polynomials is zero, we can save
+     // space by only storing the non-zero terms.  This greatly complexifies
+     // subscripting the tables in the calculation, but halves the storage space
+     // (and complexity for that matter).
+     //
+     T s = fabs(x) < fabs(xc) ? boost::math::sin_pi(x, pol) : boost::math::sin_pi(xc, pol);
+     T c = boost::math::cos_pi(x, pol);
+     switch(n)
+     {
+     case 1:
+        return -constants::pi<T, Policy>() / (s * s);
+     case 2:
+     {
+        return 2 * constants::pi<T, Policy>() * constants::pi<T, Policy>() * c / boost::math::pow<3>(s, pol);
+     }
+     case 3:
+     {
+        int P[] = { -2, -4 };
+        return boost::math::pow<3>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<4>(s, pol);
+     }
+     case 4:
+     {
+        int P[] = { 16, 8 };
+        return boost::math::pow<4>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<5>(s, pol);
+     }
+     case 5:
+     {
+        int P[] = { -16, -88, -16 };
+        return boost::math::pow<5>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<6>(s, pol);
+     }
+     case 6:
+     {
+        int P[] = { 272, 416, 32 };
+        return boost::math::pow<6>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<7>(s, pol);
+     }
+     case 7:
+     {
+        int P[] = { -272, -2880, -1824, -64 };
+        return boost::math::pow<7>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<8>(s, pol);
+     }
+     case 8:
+     {
+        int P[] = { 7936, 24576, 7680, 128 };
+        return boost::math::pow<8>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<9>(s, pol);
+     }
+     case 9:
+     {
+        int P[] = { -7936, -137216, -185856, -31616, -256 };
+        return boost::math::pow<9>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<10>(s, pol);
+     }
+     case 10:
+     {
+        int P[] = { 353792, 1841152, 1304832, 128512, 512 };
+        return boost::math::pow<10>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<11>(s, pol);
+     }
+     case 11:
+     {
+        int P[] = { -353792, -9061376, -21253376, -8728576, -518656, -1024};
+        return boost::math::pow<11>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<12>(s, pol);
+     }
+     case 12:
+     {
+        int P[] = { 22368256, 175627264, 222398464, 56520704, 2084864, 2048 };
+        return boost::math::pow<12>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<13>(s, pol);
+     }
+#ifndef BOOST_NO_LONG_LONG
+     case 13:
+     {
+        long long P[] = { -22368256LL, -795300864LL, -2868264960LL, -2174832640LL, -357888000LL, -8361984LL, -4096 };
+        return boost::math::pow<13>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<14>(s, pol);
+     }
+     case 14:
+     {
+        long long P[] = { 1903757312LL, 21016670208LL, 41731645440LL, 20261765120LL, 2230947840LL, 33497088LL, 8192 };
+        return boost::math::pow<14>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<15>(s, pol);
+     }
+     case 15:
+     {
+        long long P[] = { -1903757312LL, -89702612992LL, -460858269696LL, -559148810240LL, -182172651520LL, -13754155008LL, -134094848LL, -16384 };
+        return boost::math::pow<15>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<16>(s, pol);
+     }
+     case 16:
+     {
+        long long P[] = { 209865342976LL, 3099269660672LL, 8885192097792LL, 7048869314560LL, 1594922762240LL, 84134068224LL, 536608768LL, 32768 };
+        return boost::math::pow<16>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<17>(s, pol);
+     }
+     case 17:
+     {
+        long long P[] = { -209865342976LL, -12655654469632LL, -87815735738368LL, -155964390375424LL, -84842998005760LL, -13684856848384LL, -511780323328LL, -2146926592LL, -65536 };
+        return boost::math::pow<17>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<18>(s, pol);
+     }
+     case 18:
+     {
+        long long P[] = { 29088885112832LL, 553753414467584LL, 2165206642589696LL, 2550316668551168LL, 985278548541440LL, 115620218667008LL, 3100738912256LL, 8588754944LL, 131072 };
+        return boost::math::pow<18>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<19>(s, pol);
+     }
+     case 19:
+     {
+        long long P[] = { -29088885112832LL, -2184860175433728LL, -19686087844429824LL, -48165109676113920LL, -39471306959486976LL, -11124607890751488LL, -965271355195392LL, -18733264797696LL, -34357248000LL, -262144 };
+        return boost::math::pow<19>(constants::pi<T, Policy>(), pol) * tools::evaluate_even_polynomial(P, c) / boost::math::pow<20>(s, pol);
+     }
+     case 20:
+     {
+        long long P[] = { 4951498053124096LL, 118071834535526400LL, 603968063567560704LL, 990081991141490688LL, 584901762421358592LL, 122829335169859584LL, 7984436548730880LL, 112949304754176LL, 137433710592LL, 524288 };
+        return boost::math::pow<20>(constants::pi<T, Policy>(), pol) * c * tools::evaluate_even_polynomial(P, c) / boost::math::pow<21>(s, pol);
+     }
+#endif
+     }
+
+     //
+     // We'll have to compute the coefficients up to n, 
+     // complexity is O(n^2) which we don't worry about for now
+     // as the values are computed once and then cached.
+     // However, if the final evaluation would have too many
+     // terms just bail out right away:
+     //
+     if((unsigned)n / 2u > policies::get_max_series_iterations<Policy>())
+        return policies::raise_evaluation_error<T>(function, "The value of n is so large that we're unable to compute the result in reasonable time, best guess is %1%", 0, pol);
+#ifdef BOOST_HAS_THREADS
+     static boost::detail::lightweight_mutex m;
+     boost::detail::lightweight_mutex::scoped_lock l(m);
+#endif
+     static std::vector<std::vector<T> > table(1, std::vector<T>(1, T(-1)));
+
+     int index = n - 1;
+
+     if(index >= (int)table.size())
+     {
+        for(int i = (int)table.size() - 1; i < index; ++i)
+        {
+           int offset = i & 1; // 1 if the first cos power is 0, otherwise 0.
+           int sin_order = i + 2;  // order of the sin term
+           int max_cos_order = sin_order - 1;  // largest order of the polynomial of cos terms
+           int max_columns = (max_cos_order - offset) / 2;  // How many entries there are in the current row.
+           int next_offset = offset ? 0 : 1;
+           int next_max_columns = (max_cos_order + 1 - next_offset) / 2;  // How many entries there will be in the next row
+           table.push_back(std::vector<T>(next_max_columns + 1, T(0)));
+
+           for(int column = 0; column <= max_columns; ++column)
+           {
+              int cos_order = 2 * column + offset;  // order of the cosine term in entry "column"
+              BOOST_ASSERT(column < (int)table[i].size());
+              BOOST_ASSERT((cos_order + 1) / 2 < (int)table[i + 1].size());
+              table[i + 1][(cos_order + 1) / 2] += ((cos_order - sin_order) * table[i][column]) / (sin_order - 1);
+              if(cos_order)
+                table[i + 1][(cos_order - 1) / 2] += (-cos_order * table[i][column]) / (sin_order - 1);
+           }
+        }
+
+     }
+     T sum = boost::math::tools::evaluate_even_polynomial(&table[index][0], c, table[index].size());
+     if(index & 1)
+        sum *= c;  // First coeffient is order 1, and really an odd polynomial.
+     if(sum == 0)
+        return sum;
+     //
+     // The remaining terms are computed using logs since the powers and factorials
+     // get real large real quick:
+     //
+     T power_terms = n * log(boost::math::constants::pi<T>());
+     if(s == 0)
+        return sum * boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+     power_terms -= log(fabs(s)) * (n + 1);
+     power_terms += boost::math::lgamma(T(n));
+     power_terms += log(fabs(sum));
+
+     if(power_terms > boost::math::tools::log_max_value<T>())
+        return sum * boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+
+     return exp(power_terms) * ((s < 0) && ((n + 1) & 1) ? -1 : 1) * boost::math::sign(sum);
+  }
+
+  template <class T, class Policy>
+  struct polygamma_initializer
+  {
+     struct init
+     {
+        init()
+        {
+           // Forces initialization of our table of coefficients and mutex:
+           boost::math::polygamma(30, T(-2.5f), Policy());
+        }
+        void force_instantiate()const{}
+     };
+     static const init initializer;
+     static void force_instantiate()
+     {
+        initializer.force_instantiate();
+     }
+  };
+
+  template <class T, class Policy>
+  const typename polygamma_initializer<T, Policy>::init polygamma_initializer<T, Policy>::initializer;
+  
+  template<class T, class Policy>
+  inline T polygamma_imp(const int n, T x, const Policy &pol)
+  {
+    BOOST_MATH_STD_USING
+    static const char* function = "boost::math::polygamma<%1%>(int, %1%)";
+    polygamma_initializer<T, Policy>::initializer.force_instantiate();
+    if(n < 0)
+       return policies::raise_domain_error<T>(function, "Order must be >= 0, but got %1%", static_cast<T>(n), pol);
+    if(x < 0)
+    {
+       if(floor(x) == x)
+       {
+          //
+          // Result is infinity if x is odd, and a pole error if x is even.
+          //
+          if(lltrunc(x) & 1)
+             return policies::raise_overflow_error<T>(function, 0, pol);
+          else
+             return policies::raise_pole_error<T>(function, "Evaluation at negative integer %1%", x, pol);
+       }
+       T z = 1 - x;
+       T result = polygamma_imp(n, z, pol) + constants::pi<T, Policy>() * poly_cot_pi(n, z, x, pol, function);
+       return n & 1 ? T(-result) : result;
+    }
+    //
+    // Limit for use of small-x-series is chosen
+    // so that the series doesn't go too divergent
+    // in the first few terms.  Ordinarily this
+    // would mean setting the limit to ~ 1 / n,
+    // but we can tolerate a small amount of divergence:
+    //
+    T small_x_limit = std::min(T(T(5) / n), T(0.25f));
+    if(x < small_x_limit)
+    {
+      return polygamma_nearzero(n, x, pol, function);
+    }
+    else if(x > 0.4F * policies::digits_base10<T, Policy>() + 4.0f * n)
+    {
+      return polygamma_atinfinityplus(n, x, pol, function);
+    }
+    else if(x == 1)
+    {
+       return (n & 1 ? 1 : -1) * boost::math::factorial<T>(n, pol) * boost::math::zeta(T(n + 1), pol);
+    }
+    else if(x == 0.5f)
+    {
+       T result = (n & 1 ? 1 : -1) * boost::math::factorial<T>(n, pol) * boost::math::zeta(T(n + 1), pol);
+       if(fabs(result) >= ldexp(tools::max_value<T>(), -n - 1))
+          return boost::math::sign(result) * policies::raise_overflow_error<T>(function, 0, pol);
+       result *= ldexp(T(1), n + 1) - 1;
+       return result;
+    }
+    else
+    {
+      return polygamma_attransitionplus(n, x, pol, function);
+    }
+  }
+
+} } } // namespace boost::math::detail
+
+#endif // _BOOST_POLYGAMMA_DETAIL_2013_07_30_HPP_
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/detail/unchecked_bernoulli.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,700 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2013 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_UNCHECKED_BERNOULLI_HPP
+#define BOOST_MATH_UNCHECKED_BERNOULLI_HPP
+
+#include <limits>
+#include <cmath>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost { namespace math { 
+   
+namespace detail {
+
+template <unsigned N>
+struct max_bernoulli_index
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 17);
+};
+
+template <>
+struct max_bernoulli_index<1>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 32);
+};
+
+template <>
+struct max_bernoulli_index<2>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 129);
+};
+
+template <>
+struct max_bernoulli_index<3>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 1156);
+};
+
+template <>
+struct max_bernoulli_index<4>
+{
+   BOOST_STATIC_CONSTANT(unsigned, value = 11);
+};
+
+template <class T>
+struct bernoulli_imp_variant
+{
+   static const unsigned value = 
+      (std::numeric_limits<T>::max_exponent == 128)
+      && (std::numeric_limits<T>::radix == 2)
+      && (std::numeric_limits<T>::digits <= std::numeric_limits<float>::digits)
+      && (boost::is_convertible<float, T>::value) ? 1 :
+      (
+         (std::numeric_limits<T>::max_exponent == 1024)
+         && (std::numeric_limits<T>::radix == 2)
+         && (std::numeric_limits<T>::digits <= std::numeric_limits<double>::digits)
+         && (boost::is_convertible<double, T>::value) ? 2 :
+         (
+            (std::numeric_limits<T>::max_exponent == 16384)
+            && (std::numeric_limits<T>::radix == 2)
+            && (std::numeric_limits<T>::digits <= std::numeric_limits<long double>::digits)
+            && (boost::is_convertible<long double, T>::value) ? 3 : (!is_convertible<boost::int64_t, T>::value ? 4 : 0)
+         )
+      );
+};
+
+} // namespace detail
+
+template <class T>
+struct max_bernoulli_b2n : public detail::max_bernoulli_index<detail::bernoulli_imp_variant<T>::value>{};
+
+namespace detail{
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<0>& )
+{
+   static const boost::array<boost::int64_t, 1 + max_bernoulli_b2n<T>::value> numerators =
+   {{
+      boost::int64_t(            +1LL),
+      boost::int64_t(            +1LL),
+      boost::int64_t(            -1LL),
+      boost::int64_t(            +1LL),
+      boost::int64_t(            -1LL),
+      boost::int64_t(            +5LL),
+      boost::int64_t(          -691LL),
+      boost::int64_t(            +7LL),
+      boost::int64_t(         -3617LL),
+      boost::int64_t(        +43867LL),
+      boost::int64_t(       -174611LL),
+      boost::int64_t(       +854513LL),
+      boost::int64_t(    -236364091LL),
+      boost::int64_t(      +8553103LL),
+      boost::int64_t(  -23749461029LL),
+      boost::int64_t(+8615841276005LL),
+      boost::int64_t(-7709321041217LL),
+      boost::int64_t(+2577687858367LL)
+   }};
+
+   static const boost::array<boost::int64_t, 1 + max_bernoulli_b2n<T>::value> denominators =
+   {{
+      boost::int64_t(      1LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(     30LL),
+      boost::int64_t(     42LL),
+      boost::int64_t(     30LL),
+      boost::int64_t(     66LL),
+      boost::int64_t(   2730LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(    510LL),
+      boost::int64_t(    798LL),
+      boost::int64_t(    330LL),
+      boost::int64_t(    138LL),
+      boost::int64_t(   2730LL),
+      boost::int64_t(      6LL),
+      boost::int64_t(    870LL),
+      boost::int64_t(  14322LL),
+      boost::int64_t(    510LL),
+      boost::int64_t(      6LL)
+   }};
+   return T(numerators[n]) / denominators[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<1>& )
+{
+   static const boost::array<float, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000F,
+      +0.166666666666666666666666666666666666666667F,
+      -0.0333333333333333333333333333333333333333333F,
+      +0.0238095238095238095238095238095238095238095F,
+      -0.0333333333333333333333333333333333333333333F,
+      +0.0757575757575757575757575757575757575757576F,
+      -0.253113553113553113553113553113553113553114F,
+      +1.16666666666666666666666666666666666666667F,
+      -7.09215686274509803921568627450980392156863F,
+      +54.9711779448621553884711779448621553884712F,
+      -529.124242424242424242424242424242424242424F,
+      +6192.12318840579710144927536231884057971014F,
+      -86580.2531135531135531135531135531135531136F,
+      +1.42551716666666666666666666666666666666667e6F,
+      -2.72982310678160919540229885057471264367816e7F,
+      +6.01580873900642368384303868174835916771401e8F,
+      -1.51163157670921568627450980392156862745098e10F,
+      +4.29614643061166666666666666666666666666667e11F,
+      -1.37116552050883327721590879485616327721591e13F,
+      +4.88332318973593166666666666666666666666667e14F,
+      -1.92965793419400681486326681448632668144863e16F,
+      +8.41693047573682615000553709856035437430786e17F,
+      -4.03380718540594554130768115942028985507246e19F,
+      +2.11507486380819916056014539007092198581560e21F,
+      -1.20866265222965259346027311937082525317819e23F,
+      +7.50086674607696436685572007575757575757576e24F,
+      -5.03877810148106891413789303052201257861635e26F,
+      +3.65287764848181233351104308429711779448622e28F,
+      -2.84987693024508822262691464329106781609195e30F,
+      +2.38654274996836276446459819192192149717514e32F,
+      -2.13999492572253336658107447651910973926742e34F,
+      +2.05009757234780975699217330956723102516667e36F,
+      -2.09380059113463784090951852900279701847092e38F,
+   }};
+
+   return bernoulli_data[n];
+}
+
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<2>& )
+{
+   static const boost::array<double, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000,
+      +0.166666666666666666666666666666666666666667,
+      -0.0333333333333333333333333333333333333333333,
+      +0.0238095238095238095238095238095238095238095,
+      -0.0333333333333333333333333333333333333333333,
+      +0.0757575757575757575757575757575757575757576,
+      -0.253113553113553113553113553113553113553114,
+      +1.16666666666666666666666666666666666666667,
+      -7.09215686274509803921568627450980392156863,
+      +54.9711779448621553884711779448621553884712,
+      -529.124242424242424242424242424242424242424,
+      +6192.12318840579710144927536231884057971014,
+      -86580.2531135531135531135531135531135531136,
+      +1.42551716666666666666666666666666666666667e6,
+      -2.72982310678160919540229885057471264367816e7,
+      +6.01580873900642368384303868174835916771401e8,
+      -1.51163157670921568627450980392156862745098e10,
+      +4.29614643061166666666666666666666666666667e11,
+      -1.37116552050883327721590879485616327721591e13,
+      +4.88332318973593166666666666666666666666667e14,
+      -1.92965793419400681486326681448632668144863e16,
+      +8.41693047573682615000553709856035437430786e17,
+      -4.03380718540594554130768115942028985507246e19,
+      +2.11507486380819916056014539007092198581560e21,
+      -1.20866265222965259346027311937082525317819e23,
+      +7.50086674607696436685572007575757575757576e24,
+      -5.03877810148106891413789303052201257861635e26,
+      +3.65287764848181233351104308429711779448622e28,
+      -2.84987693024508822262691464329106781609195e30,
+      +2.38654274996836276446459819192192149717514e32,
+      -2.13999492572253336658107447651910973926742e34,
+      +2.05009757234780975699217330956723102516667e36,
+      -2.09380059113463784090951852900279701847092e38,
+      +2.27526964884635155596492603527692645814700e40,
+      -2.62577102862395760473030497361582020814490e42,
+      +3.21250821027180325182047923042649852435219e44,
+      -4.15982781667947109139170744952623589366896e46,
+      +5.69206954820352800238834562191210586444805e48,
+      -8.21836294197845756922906534686173330145509e50,
+      +1.25029043271669930167323398297028955241772e53,
+      -2.00155832332483702749253291988132987687242e55,
+      +3.36749829153643742333966769033387530162196e57,
+      -5.94709705031354477186604968440515408405791e59,
+      +1.10119103236279775595641307904376916046305e62,
+      -2.13552595452535011886583850190410656789733e64,
+      +4.33288969866411924196166130593792062184514e66,
+      -9.18855282416693282262005552155018971389604e68,
+      +2.03468967763290744934550279902200200659751e71,
+      -4.70038339580357310785752555350060606545967e73,
+      +1.13180434454842492706751862577339342678904e76,
+      -2.83822495706937069592641563364817647382847e78,
+      +7.40642489796788506297508271409209841768797e80,
+      -2.00964548027566044834656196727153631868673e83,
+      +5.66571700508059414457193460305193569614195e85,
+      -1.65845111541362169158237133743199123014950e88,
+      +5.03688599504923774192894219151801548124424e90,
+      -1.58614682376581863693634015729664387827410e93,
+      +5.17567436175456269840732406825071225612408e95,
+      -1.74889218402171173396900258776181591451415e98,
+      +6.11605199949521852558245252642641677807677e100,
+      -2.21227769127078349422883234567129324455732e103,
+      +8.27227767987709698542210624599845957312047e105,
+      -3.19589251114157095835916343691808148735263e108,
+      +1.27500822233877929823100243029266798669572e111,
+      -5.25009230867741338994028246245651754469199e113,
+      +2.23018178942416252098692981988387281437383e116,
+      -9.76845219309552044386335133989802393011669e118,
+      +4.40983619784529542722726228748131691918758e121,
+      -2.05085708864640888397293377275830154864566e124,
+      +9.82144332797912771075729696020975210414919e126,
+      -4.84126007982088805087891967099634127611305e129,
+      +2.45530888014809826097834674040886903996737e132,
+      -1.28069268040847475487825132786017857218118e135,
+      +6.86761671046685811921018885984644004360924e137,
+      -3.78464685819691046949789954163795568144895e140,
+      +2.14261012506652915508713231351482720966602e143,
+      -1.24567271371836950070196429616376072194583e146,
+      +7.43457875510001525436796683940520613117807e148,
+      -4.55357953046417048940633332233212748767721e151,
+      +2.86121128168588683453638472510172325229190e154,
+      -1.84377235520338697276882026536287854875414e157,
+      +1.21811545362210466995013165065995213558174e160,
+      -8.24821871853141215484818457296893447301419e162,
+      +5.72258779378329433296516498142978615918685e165,
+      -4.06685305250591047267679693831158655602196e168,
+      +2.95960920646420500628752695815851870426379e171,
+      -2.20495225651894575090311752273445984836379e174,
+      +1.68125970728895998058311525151360665754464e177,
+      -1.31167362135569576486452806355817153004431e180,
+      +1.04678940094780380821832853929823089643829e183,
+      -8.54328935788337077185982546299082774593270e185,
+      +7.12878213224865423522884066771438224721245e188,
+      -6.08029314555358993000847118686477458461988e191,
+      +5.29967764248499239300942910043247266228490e194,
+      -4.71942591687458626443646229013379911103761e197,
+      +4.29284137914029810894168296541074669045521e200,
+      -3.98767449682322074434477655542938795106651e203,
+      +3.78197804193588827138944181161393327898220e206,
+      -3.66142336836811912436858082151197348755196e209,
+      +3.61760902723728623488554609298914089477541e212,
+      -3.64707726451913543621383088655499449048682e215,
+      +3.75087554364544090983452410104814189306842e218,
+      -3.93458672964390282694891288533713429355657e221,
+      +4.20882111481900820046571171111494898242731e224,
+      -4.59022962206179186559802940573325591059371e227,
+      +5.10317257726295759279198185106496768539760e230,
+      -5.78227623036569554015377271242917142512200e233,
+      +6.67624821678358810322637794412809363451080e236,
+      -7.85353076444504163225916259639312444428230e239,
+      +9.41068940670587255245443288258762485293948e242,
+      -1.14849338734651839938498599206805592548354e246,
+      +1.42729587428487856771416320087122499897180e249,
+      -1.80595595869093090142285728117654560926719e252,
+      +2.32615353076608052161297985184708876161736e255,
+      -3.04957517154995947681942819261542593785327e258,
+      +4.06858060764339734424012124124937318633684e261,
+      -5.52310313219743616252320044093186392324280e264,
+      +7.62772793964343924869949690204961215533859e267,
+      -1.07155711196978863132793524001065396932667e271,
+      +1.53102008959691884453440916153355334355847e274,
+      -2.22448916821798346676602348865048510824835e277,
+      +3.28626791906901391668189736436895275365183e280,
+      -4.93559289559603449020711938191575963496999e283,
+      +7.53495712008325067212266049779283956727824e286,
+      -1.16914851545841777278088924731655041783900e290,
+      +1.84352614678389394126646201597702232396492e293,
+      -2.95368261729680829728014917350525183485207e296,
+      +4.80793212775015697668878704043264072227967e299,
+      -7.95021250458852528538243631671158693036798e302,
+      +1.33527841873546338750122832017820518292039e306
+   }};
+
+   return bernoulli_data[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<3>& )
+{
+   static const boost::array<long double, 1 + max_bernoulli_b2n<T>::value> bernoulli_data =
+   {{
+      +1.00000000000000000000000000000000000000000L,
+      +0.166666666666666666666666666666666666666667L,
+      -0.0333333333333333333333333333333333333333333L,
+      +0.0238095238095238095238095238095238095238095L,
+      -0.0333333333333333333333333333333333333333333L,
+      +0.0757575757575757575757575757575757575757576L,
+      -0.253113553113553113553113553113553113553114L,
+      +1.16666666666666666666666666666666666666667L,
+      -7.09215686274509803921568627450980392156863L,
+      +54.9711779448621553884711779448621553884712L,
+      -529.124242424242424242424242424242424242424L,
+      +6192.12318840579710144927536231884057971014L,
+      -86580.2531135531135531135531135531135531136L,
+      +1.42551716666666666666666666666666666666667E6L,
+      -2.72982310678160919540229885057471264367816E7L,
+      +6.01580873900642368384303868174835916771401E8L,
+      -1.51163157670921568627450980392156862745098E10L,
+      +4.29614643061166666666666666666666666666667E11L,
+      -1.37116552050883327721590879485616327721591E13L,
+      +4.88332318973593166666666666666666666666667E14L,
+      -1.92965793419400681486326681448632668144863E16L,
+      +8.41693047573682615000553709856035437430786E17L,
+      -4.03380718540594554130768115942028985507246E19L,
+      +2.11507486380819916056014539007092198581560E21L,
+      -1.20866265222965259346027311937082525317819E23L,
+      +7.50086674607696436685572007575757575757576E24L,
+      -5.03877810148106891413789303052201257861635E26L,
+      +3.65287764848181233351104308429711779448622E28L,
+      -2.84987693024508822262691464329106781609195E30L,
+      +2.38654274996836276446459819192192149717514E32L,
+      -2.13999492572253336658107447651910973926742E34L,
+      +2.05009757234780975699217330956723102516667E36L,
+      -2.09380059113463784090951852900279701847092E38L,
+      +2.27526964884635155596492603527692645814700E40L,
+      -2.62577102862395760473030497361582020814490E42L,
+      +3.21250821027180325182047923042649852435219E44L,
+      -4.15982781667947109139170744952623589366896E46L,
+      +5.69206954820352800238834562191210586444805E48L,
+      -8.21836294197845756922906534686173330145509E50L,
+      +1.25029043271669930167323398297028955241772E53L,
+      -2.00155832332483702749253291988132987687242E55L,
+      +3.36749829153643742333966769033387530162196E57L,
+      -5.94709705031354477186604968440515408405791E59L,
+      +1.10119103236279775595641307904376916046305E62L,
+      -2.13552595452535011886583850190410656789733E64L,
+      +4.33288969866411924196166130593792062184514E66L,
+      -9.18855282416693282262005552155018971389604E68L,
+      +2.03468967763290744934550279902200200659751E71L,
+      -4.70038339580357310785752555350060606545967E73L,
+      +1.13180434454842492706751862577339342678904E76L,
+      -2.83822495706937069592641563364817647382847E78L,
+      +7.40642489796788506297508271409209841768797E80L,
+      -2.00964548027566044834656196727153631868673E83L,
+      +5.66571700508059414457193460305193569614195E85L,
+      -1.65845111541362169158237133743199123014950E88L,
+      +5.03688599504923774192894219151801548124424E90L,
+      -1.58614682376581863693634015729664387827410E93L,
+      +5.17567436175456269840732406825071225612408E95L,
+      -1.74889218402171173396900258776181591451415E98L,
+      +6.11605199949521852558245252642641677807677E100L,
+      -2.21227769127078349422883234567129324455732E103L,
+      +8.27227767987709698542210624599845957312047E105L,
+      -3.19589251114157095835916343691808148735263E108L,
+      +1.27500822233877929823100243029266798669572E111L,
+      -5.25009230867741338994028246245651754469199E113L,
+      +2.23018178942416252098692981988387281437383E116L,
+      -9.76845219309552044386335133989802393011669E118L,
+      +4.40983619784529542722726228748131691918758E121L,
+      -2.05085708864640888397293377275830154864566E124L,
+      +9.82144332797912771075729696020975210414919E126L,
+      -4.84126007982088805087891967099634127611305E129L,
+      +2.45530888014809826097834674040886903996737E132L,
+      -1.28069268040847475487825132786017857218118E135L,
+      +6.86761671046685811921018885984644004360924E137L,
+      -3.78464685819691046949789954163795568144895E140L,
+      +2.14261012506652915508713231351482720966602E143L,
+      -1.24567271371836950070196429616376072194583E146L,
+      +7.43457875510001525436796683940520613117807E148L,
+      -4.55357953046417048940633332233212748767721E151L,
+      +2.86121128168588683453638472510172325229190E154L,
+      -1.84377235520338697276882026536287854875414E157L,
+      +1.21811545362210466995013165065995213558174E160L,
+      -8.24821871853141215484818457296893447301419E162L,
+      +5.72258779378329433296516498142978615918685E165L,
+      -4.06685305250591047267679693831158655602196E168L,
+      +2.95960920646420500628752695815851870426379E171L,
+      -2.20495225651894575090311752273445984836379E174L,
+      +1.68125970728895998058311525151360665754464E177L,
+      -1.31167362135569576486452806355817153004431E180L,
+      +1.04678940094780380821832853929823089643829E183L,
+      -8.54328935788337077185982546299082774593270E185L,
+      +7.12878213224865423522884066771438224721245E188L,
+      -6.08029314555358993000847118686477458461988E191L,
+      +5.29967764248499239300942910043247266228490E194L,
+      -4.71942591687458626443646229013379911103761E197L,
+      +4.29284137914029810894168296541074669045521E200L,
+      -3.98767449682322074434477655542938795106651E203L,
+      +3.78197804193588827138944181161393327898220E206L,
+      -3.66142336836811912436858082151197348755196E209L,
+      +3.61760902723728623488554609298914089477541E212L,
+      -3.64707726451913543621383088655499449048682E215L,
+      +3.75087554364544090983452410104814189306842E218L,
+      -3.93458672964390282694891288533713429355657E221L,
+      +4.20882111481900820046571171111494898242731E224L,
+      -4.59022962206179186559802940573325591059371E227L,
+      +5.10317257726295759279198185106496768539760E230L,
+      -5.78227623036569554015377271242917142512200E233L,
+      +6.67624821678358810322637794412809363451080E236L,
+      -7.85353076444504163225916259639312444428230E239L,
+      +9.41068940670587255245443288258762485293948E242L,
+      -1.14849338734651839938498599206805592548354E246L,
+      +1.42729587428487856771416320087122499897180E249L,
+      -1.80595595869093090142285728117654560926719E252L,
+      +2.32615353076608052161297985184708876161736E255L,
+      -3.04957517154995947681942819261542593785327E258L,
+      +4.06858060764339734424012124124937318633684E261L,
+      -5.52310313219743616252320044093186392324280E264L,
+      +7.62772793964343924869949690204961215533859E267L,
+      -1.07155711196978863132793524001065396932667E271L,
+      +1.53102008959691884453440916153355334355847E274L,
+      -2.22448916821798346676602348865048510824835E277L,
+      +3.28626791906901391668189736436895275365183E280L,
+      -4.93559289559603449020711938191575963496999E283L,
+      +7.53495712008325067212266049779283956727824E286L,
+      -1.16914851545841777278088924731655041783900E290L,
+      +1.84352614678389394126646201597702232396492E293L,
+      -2.95368261729680829728014917350525183485207E296L,
+      +4.80793212775015697668878704043264072227967E299L,
+      -7.95021250458852528538243631671158693036798E302L,
+      +1.33527841873546338750122832017820518292039E306L,
+#if LDBL_MAX_EXP == 16384
+      // Entries 260 - 600 http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C258%2C600%2C2}]
+      -2.277640649601959593875058983506938037019e309L, 
+      3.945184036046326234163525556422667595884e312L, 
+      -6.938525772130602106071724989641405550473e315L, 
+      1.238896367577564823729057820219210929986e319L, 
+      -2.245542599169309759499987966025604480745e322L, 
+      4.131213176073842359732511639489669404266e325L, 
+      -7.713581346815269584960928069762882771369e328L, 
+      1.461536066837669600638613788471335541313e332L, 
+      -2.809904606225532896862935642992712059631e335L, 
+      5.480957121318876639512096994413992284327e338L, 
+      -1.084573284087686110518125291186079616320e342L, 
+      2.176980775647663539729165173863716459962e345L, 
+      -4.431998786117553751947439433256752608068e348L, 
+      9.150625657715535047417756278073770096073e351L, 
+      -1.915867353003157351316577579148683133613e355L, 
+      4.067256303542212258698836003682016040629e358L, 
+      -8.754223791037736616228150209910348734629e361L, 
+      1.910173688735533667244373747124109379826e365L, 
+      -4.225001320265091714631115064713174404607e368L, 
+      9.471959352547827678466770796787503034505e371L, 
+      -2.152149973279986829719817376756088198573e375L, 
+      4.955485775334221051344839716507812871361e378L, 
+      -1.156225941759134696630956889716381968142e382L, 
+      2.733406597646137698610991926705098514017e385L, 
+      -6.546868135325176947099912523279938546333e388L, 
+      1.588524912441221472814692121069821695547e392L, 
+      -3.904354800861715180218598151050191841308e395L, 
+      9.719938686092045781827273411668132975319e398L, 
+      -2.450763621049522051234479737511375679283e402L, 
+      6.257892098396815305085674126334317095277e405L, 
+      -1.618113552083806592527989531636955084420e409L, 
+      4.236528795217618357348618613216833722648e412L, 
+      -1.123047068199051008086174989124136878992e416L, 
+      3.013971787525654770217283559392286666886e419L, 
+      -8.188437573221553030375681429202969070420e422L, 
+      2.251910591336716809153958146725775718707e426L, 
+      -6.268411292043789823075314151509139413399e429L, 
+      1.765990845202322642693572112511312471527e433L, 
+      -5.035154436231331651259071296731160882240e436L, 
+      1.452779356460483245253765356664402207266e440L, 
+      -4.241490890130137339052414960684151515166e443L, 
+      1.252966001692427774088293833338841893293e447L, 
+      -3.744830047478272947978103227876747240343e450L, 
+      1.132315806695710930595876001089232216024e454L, 
+      -3.463510845942701805991786197773934662578e457L, 
+      1.071643382649675572086865465873916611537e461L, 
+      -3.353824475439933688957233489984711465335e464L, 
+      1.061594257145875875963152734129803268488e468L, 
+      -3.398420969215528955528654193586189805265e471L, 
+      1.100192502000434096206138068020551065890e475L, 
+      -3.601686379213993374332690210094863486472e478L, 
+      1.192235170430164900533187239994513019475e482L, 
+      -3.990342751779668381699052942504119409180e485L, 
+      1.350281800938769780891258894167663309221e489L, 
+      -4.619325443466054312873093650888507562249e492L, 
+      1.597522243968586548227514639959727696694e496L, 
+      -5.584753729092155108530929002119620487652e499L, 
+      1.973443623104646193229794524759543752089e503L, 
+      -7.048295441989615807045620880311201930244e506L, 
+      2.544236702499719094591873151590280263560e510L, 
+      -9.281551595258615205927443367289948150345e513L, 
+      3.421757163154453657766296828520235351572e517L, 
+      -1.274733639384538364282697627345068947433e521L, 
+      4.798524805311016034711205886780460173566e524L, 
+      -1.825116948422858388787806917284878870034e528L, 
+      7.013667442807288452441777981425055613982e531L, 
+      -2.723003862685989740898815670978399383114e535L, 
+      1.068014853917260290630122222858884658850e539L, 
+      -4.231650952273697842269381683768681118533e542L, 
+      1.693650052202594386658903598564772900388e546L, 
+      -6.846944855806453360616258582310883597678e549L, 
+      2.795809132238082267120232174243715559601e553L, 
+      -1.153012972808983269106716828311318981951e557L, 
+      4.802368854268746357511997492039592697149e560L, 
+      -2.019995255271910836389761734035403905781e564L, 
+      8.580207235032617856059250643095019760968e567L, 
+      -3.680247942263468164408192134916355198549e571L, 
+      1.593924457586765331397457407661306895942e575L, 
+      -6.970267175232643679233530367569943057501e578L, 
+      3.077528087427698518703282907890556154309e582L, 
+      -1.371846760052887888926055417297342106614e586L, 
+      6.173627360829553396851763207025505289166e589L, 
+      -2.804703130495506384463249394043486916669e593L, 
+      1.286250900087150126167490951216207186092e597L, 
+      -5.954394420063617872366818601092036543220e600L, 
+      2.782297785278756426177542270854984091406e604L, 
+      -1.312214674935307746141207680066262384215e608L, 
+      6.246299145383554153167974732783934504370e611L, 
+      -3.000812007679574430883792565577444226490e615L, 
+      1.454904877136007844493861746476079537075e619L, 
+      -7.118558521873800304612781121044077357278e622L, 
+      3.514739820897817389472822276832677887997e626L, 
+      -1.751137068816377401163011262831890828437e630L, 
+      8.803498091818800678575314081978951179602e633L, 
+      -4.465612911700593572269200981612564161010e637L, 
+      2.285494565287530681465757798517033542888e641L, 
+      -1.180145168917737098025683613598595411329e645L, 
+      6.147941849198393232663105284575149616925e648L, 
+      -3.231069156963603593233679426198974663352e652L, 
+      1.713042725635435041806895849197608270935e656L, 
+      -9.161761363270648920537613435771882898051e659L, 
+      4.942675965960539112005679080810117766825e663L, 
+      -2.689684712697383518131267222872386600031e667L, 
+      1.476320014229917759615308193449511534656e671L, 
+      -8.173037740864781506597184122049453514594e674L, 
+      4.563462313190521363235182420178784459580e678L, 
+      -2.569790015236158475703055501886439298708e682L, 
+      1.459410219452119981958355737832022375085e686L, 
+      -8.358304882556983795372406183642486436653e689L, 
+      4.827305091483557818593092377664570208355e693L, 
+      -2.811394311081493166793414157061950132403e697L, 
+      1.651026863340675349245561261339568827739e701L, 
+      -9.776578579336866764167878646459810047899e704L, 
+      5.837207965197521880181236529616560780535e708L, 
+      -3.513938957938032127105389702846371181520e712L, 
+      2.132747371360190507595748444536911078788e716L, 
+      -1.305047363239192640729466563372665311602e720L, 
+      8.050825342678337497636292798039996484780e723L, 
+      -5.006884161223862543665524155681082112689e727L, 
+      3.139016066011452177570812014513491361235e731L, 
+      -1.983829535212711378291469356666001365873e735L, 
+      1.263822427649676371257598052486237628698e739L, 
+      -8.115678659900522918802121684491754629503e742L, 
+      5.252995164972075271667364371449050412435e746L, 
+      -3.427038125662404660056511738625477058135e750L, 
+      2.253446011834352733279946306835940729858e754L, 
+      -1.493407341897034717876962786798831719683e758L, 
+      9.974681322653365118752729509398728354442e761L, 
+      -6.714230142773850863927710112350816379426e765L, 
+      4.554668668931723346600337564274944733530e769L, 
+      -3.113635386023220127834102980385275379533e773L, 
+      2.144945411287666204679363498162954050208e777L, 
+      -1.488982121181387164932397544378555256016e781L, 
+      1.041537218854627455352298173588983048748e785L, 
+      -7.341073881786613676177562822942175683993e788L, 
+      5.213524272587199574980117351016322518428e792L, 
+      -3.730592531776514409283897139216167197989e796L, 
+      2.689592876341877079083449497724049500175e800L, 
+      -1.953643788231947582529884602972233135002e804L, 
+      1.429691073080500563348668321308878246277e808L, 
+      -1.054059177095488639836063073070536825675e812L, 
+      7.828919160938693948399336431565350676613e815L, 
+      -5.857884457184396382550955498026762014753e819L, 
+      4.415401588264172474136969345712659422380e823L, 
+      -3.352573884181287635796498822858109969161e827L, 
+      2.564210385719224000156548240934108974447e831L, 
+      -1.975534392116037602837941409848663077528e835L, 
+      1.533062123975940045180943006948008486466e839L, 
+      -1.198306160488763291730059994812781226903e843L, 
+      9.434034267770711698676321369174735725321e846L, 
+      -7.480619200038505368468483892246806488879e850L, 
+      5.974161898439971564124576801455052907638e854L, 
+      -4.805125663714699771668630995361572639386e858L, 
+      3.892332138028039952403812726744593073776e862L, 
+      -3.175276505779699340738548328810180869575e866L, 
+      2.608608681939322393581069188271626122519e870L, 
+      -2.158148554392732439392868052394994052628e874L, 
+      1.797993483301448477700600221980862686033e878L, 
+      -1.508407575089108597171576068862286462909e882L, 
+      1.274273406242459482708930389008701147244e886L, 
+      -1.083950475353171986748233157909397370193e890L, 
+      9.284292630726328432038470356821265395331e893L, 
+      -8.007012115449516364480417355063446317414e897L, 
+      6.952871948429568933888979915833266241471e901L, 
+      -6.078828929473797621198666799700739891205e905L, 
+      5.350908089710964244671334224708057812633e909L, 
+      -4.742168072503284973969982758434401589090e913L, 
+      4.231149239401967697257534662010605751136e917L, 
+      -3.800684612827828851942743291026898158947e921L, 
+      3.436984796314246158361599955909956583986e925L, 
+      -3.128930718993658356398482705317381808301e929L,
+      //
+      // 602-1300: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C602%2C1300%2C2}]
+      2.867524740577223817164663595437919813239e933L, -2.645462974939090580963101220449509725942e937L, 2.456800827789169780295419018499543141869e941L, -2.296690549725790064673528302231294870532e945L, 2.161174697699793265715182091764676666457e949L, -2.047023224586087259305754002882269123194e953L, 1.951604806042481282712736234132803700277e957L, -1.872785206668284042110390583158639495143e961L, 1.808847160923282257302788929692654262867e965L, -1.758427529634609613399327744595257497188e969L, 1.720468488019528147087036246754294757647e973L, -1.694180279355332648057740852839804839425e977L, 1.679013685251183870616469618951463869496e981L, -1.674640861433092946269144173974414945664e985L, 1.680943600147858322148767806987527412112e989L, -1.698008433134805056489370119323402510305e993L, 1.726128304411348354183882648263448448633e997L, -1.765810838736918108045764015629875016219e1001L, 1.817793526882665071123822455897912718293e1005L, -1.883066459765807128944897377914669600374e1009L, 1.962903588035940537938222992228124233567e1013L, -2.058903881920696086033171142046100185783e1017L, 2.173044241735786946064676598703393618281e1021L, -2.307746591425236218893160658331303115253e1025L, 2.465962312241418731528973526597433097256e1029L, -2.651278087802503406316742676403301581549e1033L, 2.868048395658440423778896607880692085708e1037L, -3.121561373094393453726645989392054731637e1041L, 3.418246710091027042099932753084126095820e1045L, -3.765936717592482928796920675282930034018e1049L, 4.174194967165213973474293718362757753877e1053L, -4.654731142471753017867105249805137855862e1057L, 5.221926310090434518253178454907900079787e1061L, -5.893500145664015254409680930288710794031e1065L, 6.691361332576333738130720616841706994101e1069L, -7.642695184575063524608775697714741180954e1073L, 8.781359617440634128952082759434723165820e1077L, -1.014968338800868135594698909567734048618e1082L, 1.180079105471061498849752479044520598414e1086L, -1.380162016721660241308046692646452732446e1090L, 1.623685158291375662775444238282343536948e1094L, -1.921404880943289359290531906131400049399e1098L, 2.287040419533950152851434188305457266969e1102L, -2.738162880206032093123060939173765335255e1106L, 3.297371307848643161532227459901386725801e1110L, -3.993854689967542662299211323085023297602e1114L, 4.865474805885735467044047308902313673643e1118L, -5.961554732739027308247618738765152679497e1122L, 7.346627151757492821447573639763873833441e1126L, -9.105493288459908620636712748727395637965e1130L, 1.135007867626164861991621396462821975167e1135L, -1.422876214067403769204874786137232627418e1139L, 1.793912271573925309173135913914667878908e1143L, -2.274542916104231188526120123855259514144e1147L, 2.900273688809987694128857655036783261991e1151L, -3.719022795563122339874875448447744493398e1155L, 4.795753420982845153626611023078973364321e1159L, -6.218937220186281310109009529226561379773e1163L, 8.109611247999584815668395828940708619394e1167L, -1.063412316303440216539797215354141158589e1172L, 1.402214363674117662460496032135704328989e1176L, -1.859223235464558752766840772026058694872e1180L, 2.478828203789903637835992128856742276028e1184L, -3.323169416193176673655321536761413885767e1188L, 4.479640207312477092938541546776915956580e1192L, -6.071721672924085739424644485636889518799e1196L, 8.274698015123579607850404326757887762270e1200L, -1.133855131459773018024052539697784205966e1205L, 1.562146222050424344025824344480153248984e1209L, -2.163904570724750459592352173471446831752e1213L, 3.013703210722669908901286635073603018696e1217L, -4.219903244242308803914269531001720703294e1221L, 5.940703220571043642186808904696174833998e1225L, -8.408147464216029127243257448169774333631e1229L, 1.196419999747411909144144315499654470715e1234L, -1.711518922741148710381740436694440587059e1238L, 2.461434539630850545757453894977350505251e1242L, -3.558748530932574002484841810677232366801e1246L, 5.172525606281917297657859608800373729529e1250L, -7.557850217376323621984784308774476917753e1254L, 1.110141075986004209769735296234549704181e1259L, -1.639216556732622481406083885926912451281e1263L, 2.433138328152562628385514545400044125983e1267L, -3.630476645219033020888837165221286413171e1271L, 5.445289518636306992942604775585977779418e1275L, -8.209806424989072060381590985042272020067e1279L, 1.244209849774134691374848390346442737613e1284L, -1.895384488692308848372754844910263931874e1288L, 2.902272596647764894203369746806169285113e1292L, -4.466944174025026625137032739317650862593e1296L, 6.910485739507636504313238347702354354916e1300L, -1.074550085668784170644854815272144687769e1305L, 1.679419258904938802199084915274175753529e1309L, -2.638155207645646220849795321076977230763e1313L, 4.165284786632654168563096850610185378233e1317L, -6.609774274649031371770290191295685774584e1321L, 1.054194100570841329575393359295845860860e1326L, -1.689822316104196916970708778265725885275e1330L, 2.722340957904912685605914893019783431164e1334L, -4.407776313964403233676810178851005163725e1338L, 7.172436210641903635864868181569129834361e1342L, -1.172947440100495955246356688225986736990e1347L, 1.927745674072824377954824961348211728006e1351L, -3.184013467435655962214317208087993711563e1355L, 5.285045125125832341263897233405196808096e1359L, -8.815883582819232027207118521581424783107e1363L, 1.477818368424505276711779171224799759099e1368L, -2.489482576496570159333357550363134602876e1372L, 4.214292881345076419678976329218843808204e1376L, -7.169068531615459070909644981451297906220e1380L, 1.225513133750594558180516896275774441895e1385L, -2.105160827387119480607950260289853896637e1389L, 3.633787605672960549893307203363402915249e1393L, -6.302830804027849515239463308430185990705e1397L, 1.098521433860299633481449685364914115468e1402L, -1.923858597401607622723144320370279518600e1406L, 3.385512828549942051667348582951554570164e1410L, -5.986286250836771248147827011780631183980e1414L, 1.063572794668186370728928272374836554300e1419L, -1.898666684876492795233907174493757572290e1423L, 3.405627002840442789235393111726609930533e1427L, -6.137724140284450036591063946055819333244e1431L, 1.111411024660941507986132154479364267486e1436L, -2.022060876221034821890406900217875915949e1440L, 3.696248025817144690840539132103538834108e1444L, -6.788448439024998306316860676030442691610e1448L, 1.252615233049059554031883468823648511657e1453L, -2.322190433141265975888955985950824418729e1457L, 4.325200102353909846882217732999001735342e1461L, -8.093531903011880118699218269369570178812e1465L, 1.521558881878323790120983450270946857209e1470L, -2.873780311010933807686415826253380907421e1474L, 5.452903697278823304173192839252276211670e1478L, -1.039457922537509500320638240809547113575e1483L, 1.990610112724715126895008793014214505760e1487L, -3.829667853173777076954453401761025071562e1491L, 7.401624504283011888971231756333356050310e1495L, -1.437075122764477911733220492562365990710e1500L, 2.802940275035867428066581228962104019228e1504L, -5.491938363067613321364335249495394164430e1508L, 1.080961960603953462180593404647115933651e1513L, -2.137290931892412298654741768897581319007e1517L, 4.245031321673807283498263276791307370788e1521L, -8.469499523038763989328773224520912663309e1525L, 1.697421812794203793865032206191322699261e1530L, -3.417217332563937242285349373774004020539e1534L, 6.910378594841763785923780822895851271770e1538L, -1.403696282437585785557998429691459557649e1543L, 2.864060533055333035232343601021192111053e1547L, -5.869818290384811353182423286543086530728e1551L, 1.208359745327224593486268988808338456906e1556L, -2.498576742140453770373914215325521001990e1560L, 5.189311407347546310078739863704346083861e1564L, -1.082537954843916294257278789980768336964e1569L, 2.268238255751421312559806122980932952706e1573L, -4.773557403917983369065731568732198697502e1577L, 1.009019097334998841920279535262007639746e1582L, -2.142181266523235177327239693359275472557e1586L, 4.567814904130855969979178320003286614868e1590L, -9.782550516204803195398428611221899469345e1594L, 2.104180123097086948576304557651398411373e1599L, -4.545658958087323864004652894518442709646e1603L, 9.862563944609427542603740078470901803131e1607L, -2.149105846582226970866569209122813809019e1612L, 4.703235567543888152049628411354542509156e1616L, -1.033719212601584878353206879472796545848e1621L, 2.281767401903848796732740825793310514456e1625L, -5.058236070813950229238666252351966279306e1629L, 1.126112519657857205642546937554224492775e1634L, -2.517766761987679577706779689880657777343e1638L, 5.653225190181653388317503182908983211029e1642L, -1.274735955461074142223278576503188429497e1647L, 2.886578974679460464298863945016671299242e1651L, -6.564203307141426181809363135003467581753e1655L, 1.499036144473064593308260681782048262301e1660L, -3.437714715599902386917108442954580869236e1664L, 7.916830957072777234152907034541325149479e1668L, -1.830850567422571420661248197094782575285e1673L, 4.251778280827419894527511469762091846660e1677L, -9.915182507286989818033146623995507108134e1681L, 2.321878208636697663781227497233334385222e1686L, -5.459879022461660582811365437190884471726e1690L, 1.289222044549922720398543474297554204559e1695L, -3.056819658344217799458557578658863826289e1699L, 7.277891759142725294172926258364455941365e1703L, -1.739928293433385104144012025546489673795e1708L, 4.176797408823713136137404972612780406904e1712L, -1.006788178307821554781930741698052910780e1717L, 2.436754569909644399766538111317379484511e1721L, -5.921896599028498715774458493117079340155e1725L, 1.445045688171565118619109316933316429671e1730L, -3.540547766876069233350621578795319652040e1734L, 8.710114552028472554054293344204504325978e1738L, -2.151484527880464463303897113553085899101e1743L, 5.335928195512405709733771642389502809087e1747L, -1.328726408335015910030370523083559660016e1752L, 3.322090527232917400247098823651437597786e1756L, -8.339387326241218096865362177688582376376e1760L, 2.101842203781264395369771906884644062395e1765L, -5.318704469415522036482913743767085545209e1769L, 1.351288005941730688647540059088127991581e1774L, -3.446853546858473171100748720136784228698e1778L, 8.827284762030783576089954173424852998700e1782L, -2.269642226090373319660782216907175419317e1787L, 5.858820683661708553422363777419430816755e1791L, -1.518385813684321665045387969920683656625e1796L, 3.950661327164595923092260035122668890334e1800L, -1.031976516347387969958181456058243183780e1805L, 2.706317892325103782207094286049104555552e1809L, -7.125140422584701175967252533378906957380e1813L, 1.883260203116768075569432925204868418472e1818L, -4.997193687108743666000994570700725873035e1822L, 1.331182722092654526185433799891693838871e1827L, -3.559930289076558484535632566755216035553e1831L, 9.557281027056970446117541983785660301558e1835L, -2.575805002229372523547972911961335317502e1840L, 6.969058431277067406841032797913179025984e1844L, -1.892842481279278678390672746902260183506e1849L, 5.160964211693777744707760614147460787285e1853L, -1.412602588198037643242529860614298968137e1858L, 3.881313379962387603749693387037174052146e1862L, -1.070542170988009009334148472388319844527e1867L, 2.964094312414144330805731101996829908435e1871L, -8.238350132106899955856124602934281976453e1875L, 2.298504171050560756192352106062598639825e1880L, -6.437303944649223478093890316531995121228e1884L, 1.809727811843121957353712606428292269805e1889L, -5.107047553992257935533518628886728031061e1893L, 1.446674478990385642488446075734631327506e1898L, -4.113513327511444762766719175770513771122e1902L, 1.174067517257431444028448391638451935667e1907L, -3.363630086409895071362533854123306097827e1911L, 9.672868956071838221096869293070568259792e1915L, -2.792101741911955365960369780457612630184e1920L, 8.089710604557382430162031502761771390568e1924L, -2.352650988877130983061761312962677887796e1929L, 6.867549079740051556501575104006222995568e1933L, -2.012161201632998475706904405535757516336e1938L, 5.917489529279588702317256137229398357271e1942L, -1.746718667239329545125902248821502764273e1947L, 5.175069416058975040990816515838893249437e1951L, -1.538913401594651457295303469904084052963e1956L, 4.593185746210984655636051293374195150815e1960L, -1.375981868450401919299150690829612124045e1965L, 4.137207965217520410530508053863759216958e1969L, -1.248518564582257710069294326648626362439e1974L, 3.781575291117895093413381897917341286951e1978L, -1.149575999691408110085856948595444100435e1983L, 3.507413095836612229403470531176947165451e1987L, -1.074032838410645352804690949680310176413e1992L, 3.300857202456564870338466973024760446263e1996L, -1.018149578840803516349758843017979498322e2001L, 3.151876950233613792531594490714752800621e2005L, -9.792574827376149360558532022944033224780e2009L, 3.053456145978161645823454710737904504036e2014L, -9.555442346102849014299990542596620094035e2018L, 3.001037449298122384017009412541525703002e2023L, -9.459120112371096268275049056229023773120e2027L, 2.992168042152196502453442556462819104060e2032L, -9.498922680869041470681858599915282791899e2036L, 3.026307717971075309746179763189393755074e2041L, -9.676079238806159594565350708123427510151e2045L, 3.104778286352798464772361361434013339088e2050L, -9.997786802782252742109475924344598057966e2054L, 3.230847952724856366943939804248186203776e2059L, -1.047769651900498931701604323213605884945e2064L, 3.409958102134053489747140426163802214042e2068L, -1.113687894644055086152064258459886518528e2073L, 3.650114509271160332136458711252217684956e2077L, -1.200536387553969483433239131469825141412e2082L, 3.962482337718333099498977337189304099484e2086L, -1.312441206957064803437100929905979391106e2091L, 4.362246723746013772563799740886664288515e2095L, -1.454975881895253548422481637083633839534e2100L, 4.869831412214692119172895822285084162147e2104L, -1.635618419512383251104125916207188960680e2109L, 5.512611314145041257838234038980389596534e2113L, -1.864392957231340288547618808749072127289e2118L, 6.327317613106621547060670091824665547127e2122L, -2.154772001506498703267302897994526372056e2127L, 7.363426139490286496267931634843475368903e2131L, -2.524950643808031915843604894357998905460e2136L, 8.687956390288096215918373666581638675156e2140L, -2.999656978200020459428228924242615592768e2145L, 1.039231328851609224822335039430898644149e2150L, -3.612742437616019936358910410005123924796e2154L, 1.260211309932738404790711574105022002093e2159L, -4.410916378453971105434385837025433805752e2163L, 1.549140617923265948720013792673729394719e2168L, -5.459173749226782924959103886664322964926e2172L, 1.930343307630952098252884031069043541182e2177L, -6.848749229218425353808144618581305978045e2181L, 2.438117138001365487681440577590059588102e2186L, -8.708873656769794358508423272379627581292e2190L, 3.121268068338199458891764932384819739714e2195L, -1.122430216307539309816165910733145404999e2200L, 4.049900779207199370582177687160985635615e2204L, -1.466167983141158219266077836130256565915e2209L, 5.325678718693772500250292767751070974887e2213L, -1.940955845102272053048140384364058448998e2218L, 7.097467198361219669927211698104447309186e2222L, -2.603968771680987683436428778397387110896e2227L, 9.585403285394812946713320044815117440444e2231L, -3.540176030547640510648455468270569908446e2236L, 1.311827683984025111744358347783996339730e2241L, -4.877124229155333857009747836542843294702e2245L, 1.819213075760490882591173222316749809951e2250L, -6.808221630329265915405178596748950929642e2254L, 2.556299969544109052724772800143396857058e2259L, -9.629763347675306704861859899230073979116e2263L, 3.639508580119285595844040783082958425575e2268L, -1.380037493555816309137481185927387732499e2273L, 5.249980712165216709135893538080020409581e2277L, -2.003737844109055078145975651407367170529e2282L, 7.672522280806944397358668566379646540213e2286L, -2.947454993639165318799389781921184991045e2291L, 1.135966912801707623489383623092951142963e2296L, -4.392293711194501621873299212059053651432e2300L, 1.703813210168560937608104155973968112409e2305L, -6.630636743874062041158387022015853902938e2309L, 2.588742636486379690203698247275411406029e2314L, -1.013959594068423546627946242481463893979e2319L, 3.984265821528043268586235974854766821078e2323L, -1.570614519682157047612769672066387881154e2328L, 6.211297381339606877062824459742129064477e2332L, -2.464246931985476159686671650962783785426e2337L, 9.807833742601662212615240518855757197483e2341L, -3.916036434571217691317276306031837539092e2346L, 1.568566392975837368624727722120313955274e2351L, -6.302885887601142677858008037129298948063e2355L, 2.540704455306077495480843691828334210014e2360L, -1.027412480318234348899627142408950111875e2365L, 4.167823618450297116765978030480648316769e2369L, -1.696076602731914277275203926124423530377e2374L, 6.923904505633301788461482786634220738504e2378L, -2.835463065742506394026733592206185459035e2383L, 1.164828772275756526225951620927486307632e2388L, -4.800242878545012539781545966693324656699e2392L, 1.984381759611877246529319121941597679107e2397L, -8.228979942542641498511023600269641046627e2401L, 3.423130231367101727862739208673375060101e2406L, -1.428418168129733054582191895023094524495e2411L, 5.979153801634459282232521647160044877770e2415L, -2.510581926948409809562349588087762800160e2420L, 1.057443785053915411991029410076722022815e2425L, -4.467723713549428749678277264414266162837e2429L, 1.893474116528533144079731251913008472748e2434L, -8.049601965052954947260081891142509464888e2438L, 3.432648527503971149009691133946275281368e2443L, -1.468324699963694393989960228042259134294e2448L,
+      //
+      // 1302-1600: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1302%2C1600%2C2}]
+      6.300146502435743791500010801885493871234e2452L, -2.711520667146768856688291798851999580833e2457L, 1.170595555513900137297344452318266434006e2462L, -5.069095411973246242900074508988493530542e2466L, 2.201819284807954055092117706033113168896e2471L, -9.593088725189386197503123561368325167085e2475L, 4.192362385909155628936230811010649614060e2480L, -1.837725836941968309866675158105812946762e2485L, 8.080201101491972605313807752565294881374e2489L, -3.563536075527215702966392543784039539240e2494L, 1.576361051321107275181955665159661781175e2499L, -6.994292466180175594372663323941761853364e2503L, 3.112744353537336702834647901141392426258e2508L, -1.389481328370627358752727485697345194612e2513L, 6.221134636655213696041740685131223999953e2517L, -2.793779613656947577224654924852010601105e2522L, 1.258399062987759035354039924686781081603e2527L, -5.685208194704131918461885165870560583895e2531L, 2.576167857759537340210434756292816456179e2536L, -1.170846052338591953257169251219597581763e2541L, 5.337296787116189575571202979672747140313e2545L, -2.440264475369219459038748840841422948951e2550L, 1.119037151526195093932933161706501865175e2555L, -5.146858829220973887154576240993607686435e2559L, 2.374259791963193693837576781321391741634e2564L, -1.098501215269400934956638118646657823799e2569L, 5.097500369683616795005376807036889542869e2573L, -2.372446971688020647583535886090779018865e2578L, 1.107430282014636546248612381377039463753e2583L, -5.184597227131050012643138079903381280471e2587L, 2.434392040100910394476893838832599310265e2592L, -1.146412753331162872665743308094817095949e2597L, 5.414578104816988124950636101250217797539e2601L, -2.564835392810685332173156758121489913946e2606L, 1.218495070518549208066544111736985586178e2611L, -5.805713573821806672815019495319510297824e2615L, 2.774298194574319430697819781128985128618e2620L, -1.329580186505564627453485444017911980430e2625L, 6.390545858902318479863947547243743500916e2629L, -3.080502542499571035376377703435361520427e2634L, 1.489236104239976282318361008292980814533e2639L, -7.220413839991892382038608955317126799684e2643L, 3.510874916591640642524021216241607185085e2648L, -1.712070118580404599831061485055269100525e2653L, 8.372956919832386730490070625622785478703e2657L, -4.106629146981883685523102256292669054596e2662L, 2.019945438530802964718619732330776495740e2667L, -9.964133277392242111939720494354938982970e2671L, 4.929278642971447854669801547226335041410e2676L, -2.445509657169810919463982615395074704130e2681L, 1.216734421265677299127016883839223226884e2686L, -6.071008437677720186241562251151490713584e2690L, 3.037824949882992896564570441252792097027e2695L, -1.524402878612630565501569310883356490225e2700L, 7.671320530781999359200097739951316234193e2704L, -3.871436167706734376478728954716915204399e2709L, 1.959313530432202158587932399068682252335e2714L, -9.944063618400630821320953821427307024297e2718L, 5.061161998202463346818982228476199873781e2723L, -2.583219090831132705328958245740715185448e2728L, 1.322193991367293532684189527174543501836e2733L, -6.786569982732483290873213417465458376706e2737L, 3.493212334804776543395067018414547811062e2742L, -1.803090099978261928508495412750404640933e2747L, 9.333100843930216567894508007158644926767e2751L, -4.844499031405982604449146511179496492045e2756L, 2.521648090959971240812330574936006906830e2761L, -1.316227870932708474838173333385377250286e2766L, 6.889488826832738674261056521130795910494e2770L, -3.616184242864384509259984293501533623932e2775L, 1.903356124758119137116543283603627028779e2780L, -1.004601544584640657081847200643996069583e2785L, 5.317043885597842225603585588404817559596e2789L, -2.821938866752488868682751438901900485500e2794L, 1.501842023003449590337997900945924161741e2799L, -8.014908048137216649348740300633172710524e2803L, 4.289126235121619907138036129192558937445e2808L, -2.301619137231461344870820700320913118444e2813L, 1.238485136850053215006962645111854705210e2818L, -6.682503731149007943059244518074044280490e2822L, 3.615572393938012932030234169574978859655e2827L, -1.961565108627429629104703146282982075623e2832L, 1.067123259692924564435881096382837264046e2837L, -5.821179870182035246401397327057170726418e2841L, 3.184127229476322727732208017279268211356e2846L, -1.746429902183019597973436257300843998825e2851L, 9.604873565299766333876882842813498685054e2855L, -5.296759978724702692134960752308186890356e2860L, 2.928906353338652198977536576170287112391e2865L, -1.623961162577704769945821804737884742792e2870L, 9.028574047002736235613238355032484299017e2874L, -5.033087486357905828950503441308068892610e2879L, 2.813325650062267479031371852434194635210e2884L, -1.576791132296320840138263753339056345362e2889L, 8.861258343945925667272164531504265693289e2893L, -4.993236404321511029440212686547068244002e2898L, 2.821192993950901287717082243608730217471e2903L, -1.598254169674379493385730199445427966752e2908L, 9.078617590346932363947095804057608979359e2912L, -5.170742114456472142154347566092068443393e2917L, 2.952866185102528847516095880416675972086e2922L, -1.690794578626103552690094140317813413244e2927L, 9.707168799669516048238542260085175133847e2931L, -5.587884732306715493795271931175883605707e2936L, 3.225179489154957423492905957887744116530e2941L, -1.866424419669188178697802576490431604300e2946L, 1.082967626854618222657109354056973072044e2951L, -6.300392007169862865282706277272018077291e2955L, 3.675066377245428685118763485986517510658e2960L, -2.149348371085132073107516253339849053182e2965L, 1.260349351812619395000600434630904474324e2970L, -7.409963623771231302980906971935254993610e2974L, 4.367980758467862686643231700861155889684e2979L, -2.581566823350789671250829457603555544100e2984L, 1.529757357568342629912560827243282062227e2989L, -9.088595394263364554625061567617375176719e2993L, 5.413829169254585648363594604231030415354e2998L, -3.233288119606092759447005827969216281573e3003L, 1.936042437734875803183915765854038424658e3008L, -1.162289934202291715747729318797398221667e3013L, 6.995870350500567071550614251287615697508e3017L, -4.221776496490106417392945233048068288503e3022L, 2.554309239868912570382343877718991746122e3027L, -1.549440871550119801225143558087410562418e3032L, 9.423199525954784955533959981278992475051e3036L, -5.745689660772387668861183913170050552119e3041L, 3.512407521007240798565045328376471603253e3046L, -2.152708113797517364614914569890010876143e3051L, 1.322761289733739440340237168659770154654e3056L, -8.148777388506488753591136948542248584098e3060L, 5.032880858479326069741729004270784264612e3065L, -3.116396010103058126269735274818345780360e3070L, 1.934634831148214353514796782480703021435e3075L, -1.204077166243116651938489240924641810276e3080L, 7.513065583444964704795707060501161621868e3084L, -4.699873512563164914493150520500838535415e3089L, 2.947541197349762411713872934523813866703e3094L, -1.853262416286420077763886100673646141885e3099L, 1.168196427912100545575264493997591040800e3104L, -7.382362285873345348505276546404015842875e3108L, 4.677071041058096429847797962954927487730e3113L, -2.970642034084362431442183248944824506476e3118L, 1.891572688282564476274920103912259755482e3123L, -1.207509963440193713810418554061532113326e3128L, 7.727731208240101791845515599659441557781e3132L, -4.957988488048495669466804712012179891532e3137L, 3.188965862446236259925047956715566822864e3142L, -2.056286895821370106507670239256782411337e3147L, 1.329246918771714093479509313343886287414e3152L, -8.614188519577835653765633797787633659253e3156L,
+      //
+      // 1602-1900: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1602%2C1900%2C2}]
+      5.596396533621874175909933615343145642161e3161L, -3.644908483469388437457938883454376864180e3166L, 2.379838409026860469990569665632800095988e3171L, -1.557720925267669865362152155022069166772e3176L, 1.022143420270029721682551084917730373739e3181L, -6.723767358891570842116651998814252095792e3185L, 4.433950491570308179905446963723780229747e3190L, -2.931196854668917448553150023532223509373e3195L, 1.942557068752664549549945921392100172355e3200L, -1.290553202978622786891265558106235068695e3205L, 8.595082329732118303768775883557789195136e3209L, -5.738453265222970049867280061719670658457e3214L, 3.840687915100689856736926915331157331684e3219L, -2.576862441955523551149886625900059307506e3224L, 1.733166107320377310388765047659987844208e3229L, -1.168569552450178559412843683052610870569e3234L, 7.898289836694980777809433306209459851871e3238L, -5.351485909164216694400535493924387979018e3243L, 3.634772439350395177931952925644409735777e3248L, -2.474801048002975145046569303233576339695e3253L, 1.689126939254790850063878942448569759390e3258L, -1.155691524500722774057997965355407962525e3263L, 7.926435404542361405718288670391575676323e3267L, -5.449654814183048796524718620178906854846e3272L, 3.755898589900254795894812942275711835138e3277L, -2.594843902682143854622514329649211211808e3282L, 1.797048752397789969347915328338360264536e3287L, -1.247551415074438712713815166107969504456e3292L, 8.681719521514448143910215886388510318746e3296L, -6.056203898213120922016159444227958572276e3301L, 4.234882876331814099029781995617143573641e3306L, -2.968432911643338866295929748049749932906e3311L, 2.085723508930484816454740610260790948864e3316L, -1.469023169879432026361623513301566735138e3321L, 1.037150346505052892302077637883522696572e3326L, -7.339977067836656769144838365069396168014e3330L, 5.206985412168234130596004552956337839140e3335L, -3.702673773319239583641029108403509825141e3340L, 2.639251227995760315076225206168354089692e3345L, -1.885736353072698581595150856674914203383e3350L, 1.350563292338261784288559687678302458996e3355L, -9.695749980998301526113046898985991802000e3359L, 6.977167462628398202151721319169989304520e3364L, -5.032768280399753942925624560483352299263e3369L, 3.638844963651800168080623511900705036698e3374L, -2.637228631269251606169613775399022890118e3379L, 1.915836351653767108720464847696767898597e3384L, -1.395064293615007319328267865803567670760e3389L, 1.018249052614943190644465556486933211307e3394L, -7.449662162606857550867922631658930320805e3398L, 5.463119632208085241594107781601567713991e3403L, -4.015736541676989144201935890497836963875e3408L, 2.958754190183866660901503059509579790900e3413L, -2.185096074054288399312733179064098492511e3418L, 1.617517444557020250864919655301189186103e3423L, -1.200170662015511746748935675940010250555e3428L, 8.925888349899029449015791684428724952411e3432L, -6.653851763691885517669938275618991145962e3437L, 4.971722031098457895973348076474071155918e3442L, -3.723500582577984967442020337848702786829e3447L, 2.795153783541721373364976034391375710110e3452L, -2.103141577212720698169118819883801186873e3457L, 1.586129575320959267959148073466004084241e3462L, -1.198988457279648730711646682156242973137e3467L, 9.084402368157025658430300252246526602197e3471L, -6.898927494435965163817354296023108913714e3476L, 5.251332286149361587885046891266325872375e3481L, -4.006442950956739933884502808470603581850e3486L, 3.063718202820270282280659950794978994604e3491L, -2.348215284130973783732145823834807395920e3496L, 1.803952490148087317330011096671019781340e3501L, -1.389022326803437345760911068933754707688e3506L, 1.071986115818329525986099441493200866389e3511L, -8.292085224650940719705699485423856363908e3515L, 6.428829064452939640541475198655560890344e3520L, -4.995654440302797445368056643032307686314e3525L, 3.890847042582299188849273838681034339406e3530L, -3.037288555751484681537442833929275697351e3535L, 2.376385803695694695338601696534348875191e3540L, -1.863527130251861900692886008704804849076e3545L, 1.464674913498036269270793715104706378182e3550L, -1.153804954579033578659954846698233083197e3555L, 9.109783835348935092264268296199541780964e3559L, -7.208869193983001804305451104827153729326e3564L, 5.717530734277611949162917337810749919265e3569L, -4.544970302634007326980094771330550661605e3574L, 3.621042850825283032134228901678636353355e3579L, -2.891447067949778492831490654980043715471e3584L, 2.314060419397710657435821461707043283167e3589L, -1.856140759923563235273220981623595304434e3594L, 1.492185412981476596273279338314204171587e3599L, -1.202290032627175365810126250991853594801e3604L, 9.708881154579770196658265042625239421053e3608L, -7.857809850747029705680072304049448493252e3613L, 6.373898598298513400228819113197728735438e3618L, -5.181780406472117449048907989647202286666e3623L, 4.222036621953044040518942750638183171221e3628L, -3.447728386429130175025813550845575613047e3633L, 2.821701521717856346224159586852612710800e3638L, -2.314488376711998526455043944505424906920e3643L, 1.902671298033180765286213227393060711096e3648L, -1.567603736821312488140289549008391847440e3653L, 1.294408945316538946551785312385509945367e3658L, -1.071194533081615830960091702262923009420e3663L, 8.884351908108581551151252566466606126397e3667L, -7.384866682828103669170236267589653324531e3672L, 6.152023838008155718180876735217718355563e3677L, -5.136304310431705506236573876510219357975e3682L, 4.297736808124296434723193397876220759378e3687L, -3.603994887745884762510172194982172483480e3692L, 3.028884745605031552399167746007361297342e3697L, -2.551141302205187365552982635794121855138e3702L, 2.153467982869535549299173317536193051608e3707L, -1.821769476343602094059466497311600827296e3712L, 1.544537580582347892980177956984101211006e3717L, -1.312358705945937257247030754517293537539e3722L, 1.117518229297781388884979995402355617235e3727L, -9.536820860779441793021624381677086661097e3731L, 8.156400668831968026931547065507466530546e3736L, -6.990984948728184142718575396052260691181e3741L, 6.005124901126818071638224144541102727563e3746L, -5.169500241880947716732682089328427995109e3751L, 4.459815478235310026240134567325749844182e3756L, -3.855902253361684187081283218890336962427e3761L, 3.340988024176995223515640815937037040546e3766L, -2.901099226680215736735094376078800376829e3771L, 2.524573363444334459448089563912567842927e3776L, -2.201659455716348555524529213295341212492e3781L, 1.924190302190936448078364755844591374353e3786L, -1.685313186099770223843319514432495898517e3791L, 1.479268235966730475749985741048766689808e3796L, -1.301205702893883803117530921635013780575e3801L, 1.147035071153450453405384269242743907426e3806L, -1.013300250456366849150496776951686112298e3811L, 8.970761720605591762300958007557533865346e3815L, -7.958829781488943084496783248922217392838e3820L, 7.076146954685024795720193943027902028642e3825L, -6.304798526260409199660290516451546966159e3830L, 5.629519616664188107056583939722984509867e3835L, -5.037281594099054092767959480843344929292e3840L, 4.516946091316834843581919268794683123349e3845L, -4.058975118925834202620358386772092359951e3850L, 3.655187798978978909014603682039470653549e3855L, -3.298555903041546671060101785513812175322e3860L, 2.983031738662727912016882399515879119620e3865L, -2.703403043317732979516341931451317866898e3870L, 2.455170460800096241793872443768546335444e3875L, -2.234443928432490538417605502448376856290e3880L, 2.037854924078003280537856980560782325730e3885L, -1.862482033918775734840779765743099458137e3890L,
+      //
+      // 1902-2200: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C1902%2C2200%2C2}]
+      1.705787724951999960095629912416210969679e3895L, -1.565564556110550991891247404758895970376e3900L, 1.439889351869832939488618785632174464789e3905L, -1.327084102784257406218693901793045990520e3910L, 1.225682557296027075027021534960026145706e3915L, -1.134401635488994148555787301654561211982e3920L, 1.052116934052356802920509999705307165985e3925L, -9.778417073593082219082361206542342793584e3929L, 9.107088061888562704837019028349522303725e3934L, -8.499551364633102138471246155980056936129e3939L, 7.949082681085658044610890152056533167407e3944L, -7.449748809722797718736397140511396011691e3949L, 6.996307824769340144608141799981589288378e3954L, -6.584122718472954006131003060359621706243e3959L, 6.209086595833487707192492087176843233407e3964L, -5.867557793863165391821489909125720982339e3969L, 5.556303538475260373917478405626416604297e3974L, -5.272450955936249442242634142613834212778e3979L, 5.013444428433789818228792126117223030641e3984L, -4.777008429684552423800736200488532033034e3989L, 4.561115100786341787876705283291018781137e3994L, -4.363955932181992701667719449097126840439e3999L, 4.183917007557000586305945495258591147615e4004L, -4.019557342177353010692923286760895584096e4009L, 3.869589913635745758786275231296652917580e4014L, -3.732865038934070181861017140563175000872e4019L, 3.608355799736107390800162778737339576843e4024L, -3.495145258697474565347261083975193776541e4029L, 3.392415245050326563747729613872524362741e4034L, -3.299436517958948801426629481782413630714e4039L, 3.215560142306355508598119430378551642857e4044L, -3.140209934146377815556058799557727461298e4049L, 3.072875852591406752692761744649563131272e4054L, -3.013108231854799187724018548255922550991e4059L, 2.960512761914376268185064129600549308882e4064L, -2.914746139139036596123006476633770383901e4069L, 2.875512319506974985103149834921665445532e4074L, -2.842559316984704569380036093537576068104e4079L, 2.815676498441436148701483904115879856704e4084L, -2.794692334326268275058539147656334465534e4089L, 2.779472571396106785963004020814493340829e4094L, -2.769918800191406321625251621260024635680e4099L, 2.765967395840433013288935879837390099329e4104L, -2.767588816244119880300161388073836623878e4109L, 2.774787246856347651152278076466043136230e4114L, -2.787600586224957950622601135620189837948e4119L, 2.806100771288225169339048358106052817280e4124L, -2.830394446218080573456394167711739786431e4129L, 2.860623983452244712039094143642843717029e4134L, -2.896968870550611723525738907034588104300e4139L, 2.939647481737606306044335918078617963078e4144L, -2.988919258547518526076380181812161398808e4149L, 3.045087329976721023952450383837883029431e4154L, -3.108501609077197464748958150625867523408e4159L, 3.179562410123820875787052833975010965963e4164L, -3.258724638491880104953913719767939138170e4169L, 3.346502614347964869115073881474258766546e4174L, -3.443475601364631413158991572423086599816e4179L, 3.550294123121350747300886840907918182129e4184L, -3.667687162886053419715985091863398517145e4189L, 3.796470357354794420044278000297864085607e4194L, -3.937555311976846882455930574021795626971e4199L, 4.091960185075595842547638450930710467324e4204L, -4.260821710519620959138720129506770036460e4209L, 4.445408854703156440576808070360934740837e4214L, -4.647138333645908068599900650548418672065e4219L, 4.867592250805288922190809906525766574205e4224L, -5.108538156515551259475573296900660666192e4229L, 5.371951876776035157276013631113314852508e4234L, -5.660043513521220243900043448456234873940e4239L, 5.975287081834808618140945840817834710330e4244L, -6.320454323372684034118816565375206053746e4249L, 6.698653321371992324876559665938996023646e4254L, -7.113372643219128807424340495235606473967e4259L, 7.568531854202750881338746432078817214052e4264L, -8.068539383842553693076672384509126681464e4269L, 8.618358887685935324188596304168259394311e4274L, -9.223585437012291673660319256730398171887e4279L, 9.890533091606747031464718533600572123091e4284L, -1.062633567277107015128545384570274268438e4290L, 1.143906286231591191271274413511275981288e4295L, -1.233785411712565904499340744089870916842e4300L, 1.333307331840530219050170916015276125870e4305L, -1.443648758235403286296065629219598769529e4310L, 1.566147425967471851736562867318748510088e4315L, -1.702326086290842780634120184324081017286e4320L, 1.853920350455786350409148418966087344063e4325L, -2.022911043115598592197907512410632615740e4330L, 2.211561842992792253055716743938240466613e4335L, -2.422463130294011318178080247305407476096e4340L, 2.658583129381772791030436640519847627789e4345L, -2.923327636881988941081365085520742216540e4350L, 3.220609866329557159104267531058019683271e4355L, -3.554932228621330128152149026066400241546e4360L, 3.931482212643167323798366327390058684499e4365L, -4.356244944221399578650235478583297389113e4370L, 4.836135498303121165971331625888490168138e4375L, -5.379154636371461359750682662639062606297e4380L, 5.994572359716861309678596804350346692501e4385L, -6.693144535124290060793936095397161934045e4390L, 7.487368894313509797084395689517008597061e4395L, -8.391787970609807810531578161564037339793e4400L, 9.423348062978921203475110312003096820035e4405L, -1.060182516651648405903017734022504884319e4411L, 1.195033105063952979885086754342706651656e4416L, -1.349591538868673992167798923586925758429e4421L, 1.527028315253291113905307092657539132480e4426L, -1.731065051510920640409442255224015234974e4431L, 1.966076741510092840076264635935585216200e4436L, -2.237214093245750681191361238831105906202e4441L, 2.550550094903891445719729187215253324232e4446L, -2.913255853313667303707651906277658164129e4451L, 3.333811847072394764285817140850092324169e4456L, -3.822262084288044913490118858492563410392e4461L, 4.390520310533864198186202368026630430120e4466L, -5.052739449335052080092114976206610871466e4471L, 5.825757966350870043117899492954521458799e4476L, -6.729639942938203582008846884575881320532e4481L, 7.788329466816396015493306357116312471970e4486L, -9.030444674469025073047417528762134025409e4491L, 1.049024263381993629167658236142000524752e4497L, -1.220879351508964912255081664072251573277e4502L, 1.423541151220109512749655991050110438471e4507L, -1.662940118618541616964708044356967429362e4512L, 1.946219185900482116137855064775635250366e4517L, -2.281995008842006909631764011781911322493e4522L, 2.680678198213108543648324254258111216040e4527L, -3.154866427472784086389609599207759103500e4532L, 3.719827710160801797530420206201570269720e4537L, -4.394095404360277919140027580071549980218e4542L, 5.200201854779615608741690339830306148442e4547L, -6.165584312943608652377791415603277251516e4552L, 7.323705248531382981433751104158852636445e4557L, -8.715439846124090647163930834760361817820e4562L, 1.039079696609215651011736087603304766850e4568L, -1.241105689556982425619608247473478857800e4573L, 1.485143079696380339521658550262280772546e4578L, -1.780437412164973637340821168154300094802e4583L, 2.138372099157518882088209435171770222745e4588L, -2.572985071149069551034276570909360759588e4593L, 3.101615379617643734762997559011097203354e4598L, -3.745713657616368229906151946770042703357e4603L, 4.531859496161940719835150033082561700677e4608L, -5.493040495326927998321538336584233566465e4613L, 6.670262730603009306595018122252730741798e4618L, -8.114581584793494903775255213273982440688e4623L, 9.889666561810883044159054730371102725871e4628L, -1.207504541653929734716275932570097623330e4634L, 1.477021377885843688233899471354959308782e4639L, -1.809984912147908767583043524070645821179e4644L,
+      //
+      // 2202-2320: http://www.wolframalpha.com/input/?i=TABLE[N[Bernoulli[i]%2C40]%2C+{i%2C2202%2C2320%2C2}]
+      2.222043594325228980916360265527780300093e4649L, -2.732869701246338361699515268224049951411e4654L, 3.367233945421922463553518272642397177145e4659L, -4.156377225041273602431272489314020150392e4664L, 5.139764368092890466235162431795350591151e4669L, -6.367329693760865476879589228002216011370e4674L, 7.902356742934106007362514378717026407839e4679L, -9.825176966314431712897976595483070301406e4684L, 1.223792760178593282435724837135946867088e4690L, -1.527068151452750404853140815207477555192e4695L, 1.908935682572268829496101580401263597905e4700L, -2.390593888616966248780378941331847473699e4705L, 2.999171106576893833644521002894489856321e4710L, -3.769440655453736670024798444784356437578e4715L, 4.746047769851891438576002047529258107351e4720L, -5.986405469241447720766576164546767533359e4725L, 7.564466155536872051712519119999711534616e4730L, -9.575641408047918720040356745796976488951e4735L, 1.214322951835035451699619713803395497423e4741L, -1.542682591979864353012093794301924196234e4746L, 1.963334539793192183270983986567556358603e4751L, -2.503148969013901182572118121398034622584e4756L, 3.197076711250102964526567664729089847162e4761L, -4.090653552025822488578293526174572934858e4766L, 5.243302769651520536759521264615159906699e4771L, -6.732697170903775309261288127044088674182e4776L, 8.660529543801770516930589210020128142543e4781L, -1.116015823611149634592870112730519454113e4787L, 1.440675306432920129218036927923030695520e4792L, -1.863078034853256227415397798026969938881e4797L, 2.413595413458810442409656314019115041699e4802L, -3.132317029597258599678590012779717945144e4807L, 4.072246763371584312534474102756137619716e4812L, -5.303577511521827157146305369181950467569e4817L, 6.919417518688636032335131253584331645491e4822L, -9.043473312934241153732087612484569398979e4827L, 1.184037400265044213826044590639924237359e4833L, -1.552956685415800894409743993367334099777e4838L, 2.040404893052952221581694807126473204625e4843L, -2.685565763841580219033402331219206776210e4848L, 3.540927057361929050327811875290025248120e4853L, -4.676912607538885419407656762767991163574e4858L, 6.188165903566760647569323704623433330229e4863L, -8.202087471895029964699042637255411806373e4868L, 1.089045274355389654614196651761310970580e4874L, -1.448524684976553869119447042300206226148e4879L, 1.930028100376784839502387280956424581974e4884L, -2.576074799096023589462128312524664980682e4889L, 3.444369635011990347297134928452972402038e4894L, -4.613354441299253694113609154769978684993e4899L, 6.189834306866879018555349507257537840922e4904L, -8.319470760665157534580593571258276368233e4909L, 1.120124240070996761986102680587384813245e4915L, -1.510740451399746828351090108638980398124e4920L, 2.041108231091323198877509959371257503819e4925L, -2.762447751447012472733302936575873838539e4930L,
+#endif
+   }};
+
+   return bernoulli_data[n];
+}
+
+template <class T>
+inline T unchecked_bernoulli_imp(std::size_t n, const mpl::int_<4>& )
+{
+   //
+   // Special case added for multiprecision types that have no conversion from long long,
+   // there are very few such types, but mpfr_class is one.
+   //
+   static const boost::array<boost::int32_t, 1 + max_bernoulli_b2n<T>::value> numerators =
+   {{
+      boost::int32_t(            +1LL),
+      boost::int32_t(            +1LL),
+      boost::int32_t(            -1LL),
+      boost::int32_t(            +1LL),
+      boost::int32_t(            -1LL),
+      boost::int32_t(            +5LL),
+      boost::int32_t(          -691LL),
+      boost::int32_t(            +7LL),
+      boost::int32_t(         -3617LL),
+      boost::int32_t(        +43867LL),
+      boost::int32_t(       -174611LL),
+      boost::int32_t(       +854513LL),
+   }};
+
+   static const boost::array<boost::int32_t, 1 + max_bernoulli_b2n<T>::value> denominators =
+   {{
+      boost::int32_t(      1LL),
+      boost::int32_t(      6LL),
+      boost::int32_t(     30LL),
+      boost::int32_t(     42LL),
+      boost::int32_t(     30LL),
+      boost::int32_t(     66LL),
+      boost::int32_t(   2730LL),
+      boost::int32_t(      6LL),
+      boost::int32_t(    510LL),
+      boost::int32_t(    798LL),
+      boost::int32_t(    330LL),
+      boost::int32_t(    138LL),
+   }};
+   return T(numerators[n]) / T(denominators[n]);
+}
+
+} // namespace detail
+
+template<class T>
+inline T unchecked_bernoulli_b2n(const std::size_t n)
+{
+   typedef mpl::int_<detail::bernoulli_imp_variant<T>::value> tag_type;
+
+   return detail::unchecked_bernoulli_imp<T>(n, tag_type());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_UNCHECKED_BERNOULLI_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/ellint_d.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,180 @@
+//  Copyright (c) 2006 Xiaogang Zhang
+//  Copyright (c) 2006 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  History:
+//  XZ wrote the original of this file as part of the Google
+//  Summer of Code 2006.  JM modified it to fit into the
+//  Boost.Math conceptual framework better, and to ensure
+//  that the code continues to work no matter how many digits
+//  type T has.
+
+#ifndef BOOST_MATH_ELLINT_D_HPP
+#define BOOST_MATH_ELLINT_D_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rg.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+// Elliptic integrals (complete and incomplete) of the second kind
+// Carlson, Numerische Mathematik, vol 33, 1 (1979)
+
+namespace boost { namespace math { 
+   
+template <class T1, class T2, class Policy>
+typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const Policy& pol);
+   
+namespace detail{
+
+template <typename T, typename Policy>
+T ellint_d_imp(T k, const Policy& pol);
+
+// Elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_d_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+
+    if(phi >= tools::max_value<T>())
+    {
+       // Need to handle infinity as a special case:
+       result = policies::raise_overflow_error<T>("boost::math::ellint_e<%1%>(%1%,%1%)", 0, pol);
+    }
+    else if(phi > 1 / tools::epsilon<T>())
+    {
+       // Phi is so large that phi%pi is necessarily zero (or garbage),
+       // just return the second part of the duplication formula:
+       result = 2 * phi * ellint_d_imp(k, pol) / constants::pi<T>();
+    }
+    else
+    {
+       // Carlson's algorithm works only for |phi| <= pi/2,
+       // use the integrand's periodicity to normalize phi
+       //
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::half_pi<T>()));
+       T m = boost::math::round((phi - rphi) / constants::half_pi<T>());
+       int s = 1;
+       if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
+       {
+          m += 1;
+          s = -1;
+          rphi = constants::half_pi<T>() - rphi;
+       }
+       T sinp = sin(rphi);
+       T cosp = cos(rphi);
+       T c = 1 / (sinp * sinp);
+       T cm1 = cosp * cosp / (sinp * sinp);  // c - 1
+       T k2 = k * k;
+       if(k2 > 1)
+       {
+          return policies::raise_domain_error<T>("boost::math::ellint_d<%1%>(%1%, %1%)", "The parameter k is out of range, got k = %1%", k, pol);
+       }
+       else if(rphi == 0)
+       {
+          result = 0;
+       }
+       else
+       {
+          // http://dlmf.nist.gov/19.25#E10
+          result = s * ellint_rd_imp(cm1, T(c - k2), c, pol) / 3;
+       }
+       if(m != 0)
+          result += m * ellint_d_imp(k, pol);
+    }
+    return invert ? T(-result) : result;
+}
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T, typename Policy>
+T ellint_d_imp(T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (abs(k) > 1)
+    {
+       return policies::raise_domain_error<T>("boost::math::ellint_e<%1%>(%1%)",
+            "Got k = %1%, function requires |k| <= 1", k, pol);
+    }
+    if (abs(k) == 1)
+    {
+        return static_cast<T>(1);
+    }
+    if(fabs(k) <= tools::root_epsilon<T>())
+       return constants::pi<T>() / 4;
+
+    T x = 0;
+    T t = k * k;
+    T y = 1 - t;
+    T z = 1;
+    T value = ellint_rd_imp(x, y, z, pol) / 3;
+
+    return value;
+}
+
+template <typename T, typename Policy>
+inline typename tools::promote_args<T>::type ellint_d(T k, const Policy& pol, const mpl::true_&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_d_imp(static_cast<value_type>(k), pol), "boost::math::ellint_d<%1%>(%1%)");
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const mpl::false_&)
+{
+   return boost::math::ellint_d(k, phi, policies::policy<>());
+}
+
+} // detail
+
+// Complete elliptic integral (Legendre form) of the second kind
+template <typename T>
+inline typename tools::promote_args<T>::type ellint_d(T k)
+{
+   return ellint_d(k, policies::policy<>());
+}
+
+// Elliptic integral (Legendre form) of the second kind
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi)
+{
+   typedef typename policies::is_policy<T2>::type tag_type;
+   return detail::ellint_d(k, phi, tag_type());
+}
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type ellint_d(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::ellint_d_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::ellint_2<%1%>(%1%,%1%)");
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/ellint_rg.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,136 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_MATH_ELLINT_RG_HPP
+#define BOOST_MATH_ELLINT_RG_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/config.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/ellint_rd.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
+#include <boost/math/special_functions/pow.hpp>
+
+namespace boost { namespace math { namespace detail{
+
+   template <typename T, typename Policy>
+   T ellint_rg_imp(T x, T y, T z, const Policy& pol)
+   {
+      BOOST_MATH_STD_USING
+      static const char* function = "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)";
+
+      if(x < 0 || y < 0 || z < 0)
+      {
+         return policies::raise_domain_error<T>(function,
+            "domain error, all arguments must be non-negative, "
+            "only sensible result is %1%.",
+            std::numeric_limits<T>::quiet_NaN(), pol);
+      }
+      //
+      // Function is symmetric in x, y and z, but we require
+      // (x - z)(y - z) >= 0 to avoid cancellation error in the result
+      // which implies (for example) x >= z >= y
+      //
+      using std::swap;
+      if(x < y)
+         swap(x, y);
+      if(x < z)
+         swap(x, z);
+      if(y > z)
+         swap(y, z);
+      
+      BOOST_ASSERT(x >= z);
+      BOOST_ASSERT(z >= y);
+      //
+      // Special cases from http://dlmf.nist.gov/19.20#ii
+      //
+      if(x == z)
+      {
+         if(y == z)
+         {
+            // x = y = z
+            // This also works for x = y = z = 0 presumably.
+            return sqrt(x);
+         }
+         else if(y == 0)
+         {
+            // x = y, z = 0
+            return constants::pi<T>() * sqrt(x) / 4;
+         }
+         else
+         {
+            // x = z, y != 0
+            swap(x, y);
+            return (x == 0) ? T(sqrt(z) / 2) : T((z * ellint_rc_imp(x, z, pol) + sqrt(x)) / 2);
+         }
+      }
+      else if(y == z)
+      {
+         if(x == 0)
+            return constants::pi<T>() * sqrt(y) / 4;
+         else
+            return (y == 0) ? T(sqrt(x) / 2) : T((y * ellint_rc_imp(x, y, pol) + sqrt(x)) / 2);
+      }
+      else if(y == 0)
+      {
+         swap(y, z);
+         //
+         // Special handling for common case, from
+         // Numerical Computation of Real or Complex Elliptic Integrals, eq.46
+         //
+         T xn = sqrt(x);
+         T yn = sqrt(y);
+         T x0 = xn;
+         T y0 = yn;
+         T sum = 0;
+         T sum_pow = 0.25f;
+
+         while(fabs(xn - yn) >= 2.7 * tools::root_epsilon<T>() * fabs(xn))
+         {
+            T t = sqrt(xn * yn);
+            xn = (xn + yn) / 2;
+            yn = t;
+            sum_pow *= 2;
+            sum += sum_pow * boost::math::pow<2>(xn - yn);
+         }
+         T RF = constants::pi<T>() / (xn + yn);
+         return ((boost::math::pow<2>((x0 + y0) / 2) - sum) * RF) / 2;
+      }
+      return (z * ellint_rf_imp(x, y, z, pol)
+         - (x - z) * (y - z) * ellint_rd_imp(x, y, z, pol) / 3
+         + sqrt(x * y / z)) / 2;
+   }
+
+} // namespace detail
+
+template <class T1, class T2, class T3, class Policy>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rg(T1 x, T2 y, T3 z, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2, T3>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(
+      detail::ellint_rg_imp(
+         static_cast<value_type>(x),
+         static_cast<value_type>(y),
+         static_cast<value_type>(z), pol), "boost::math::ellint_rf<%1%>(%1%,%1%,%1%)");
+}
+
+template <class T1, class T2, class T3>
+inline typename tools::promote_args<T1, T2, T3>::type 
+   ellint_rg(T1 x, T2 y, T3 z)
+{
+   return ellint_rg(x, y, z, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_RG_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/heuman_lambda.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_ELLINT_HL_HPP
+#define BOOST_MATH_ELLINT_HL_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/jacobi_zeta.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+
+// Elliptic integral the Jacobi Zeta function.
+
+namespace boost { namespace math { 
+   
+namespace detail{
+
+// Elliptic integral - Jacobi Zeta
+template <typename T, typename Policy>
+T heuman_lambda_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    const char* function = "boost::math::heuman_lambda<%1%>(%1%, %1%)";
+
+    if(fabs(k) > 1)
+       return policies::raise_domain_error<T>(function, "We require |k| <= 1 but got k = %1%", k, pol);
+
+    T result;
+    T sinp = sin(phi);
+    T cosp = cos(phi);
+    T s2 = sinp * sinp;
+    T k2 = k * k;
+    T kp = 1 - k2;
+    T delta = sqrt(1 - (kp * s2));
+    if(fabs(phi) <= constants::half_pi<T>())
+    {
+       result = kp * sinp * cosp / (delta * constants::half_pi<T>());
+       result *= ellint_rf_imp(T(0), kp, T(1), pol) + k2 * ellint_rj(T(0), kp, T(1), T(1 - k2 / (delta * delta)), pol) / (3 * delta * delta);
+    }
+    else
+    {
+       T rkp = sqrt(kp);
+       T ratio;
+       if(rkp == 1)
+       {
+          return policies::raise_domain_error<T>(function, "When 1-k^2 == 1 then phi must be < Pi/2, but got phi = %1%", phi, pol);
+       }
+       else
+          ratio = ellint_f_imp(phi, rkp, pol) / ellint_k_imp(rkp, pol);
+       result = ratio + ellint_k_imp(k, pol) * jacobi_zeta_imp(phi, rkp, pol) / constants::half_pi<T>();
+    }
+    return result;
+}
+
+} // detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::heuman_lambda_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::heuman_lambda<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type heuman_lambda(T1 k, T2 phi)
+{
+   return boost::math::heuman_lambda(k, phi, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/jacobi_zeta.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+//  Copyright (c) 2015 John Maddock
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_MATH_ELLINT_JZ_HPP
+#define BOOST_MATH_ELLINT_JZ_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/ellint_1.hpp>
+#include <boost/math/special_functions/ellint_rj.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/workaround.hpp>
+
+// Elliptic integral the Jacobi Zeta function.
+
+namespace boost { namespace math { 
+   
+namespace detail{
+
+// Elliptic integral - Jacobi Zeta
+template <typename T, typename Policy>
+T jacobi_zeta_imp(T phi, T k, const Policy& pol)
+{
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+    using namespace boost::math::constants;
+
+    bool invert = false;
+    if(phi < 0)
+    {
+       phi = fabs(phi);
+       invert = true;
+    }
+
+    T result;
+    T sinp = sin(phi);
+    T cosp = cos(phi);
+    T s2 = sinp * sinp;
+    T k2 = k * k;
+    T kp = 1 - k2;
+    if(k == 1)
+       result = sinp * (boost::math::sign)(cosp);  // We get here by simplifying JacobiZeta[w, 1] in Mathematica, and the fact that 0 <= phi.
+    else
+       result = k2 * sinp * cosp * sqrt(1 - k2 * s2) * ellint_rj_imp(T(0), kp, T(1), T(1 - k2 * s2), pol) / (3 * ellint_k_imp(k, pol));
+    return invert ? T(-result) : result;
+}
+
+} // detail
+
+template <class T1, class T2, class Policy>
+inline typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi, const Policy& pol)
+{
+   typedef typename tools::promote_args<T1, T2>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::jacobi_zeta_imp(static_cast<value_type>(phi), static_cast<value_type>(k), pol), "boost::math::jacobi_zeta<%1%>(%1%,%1%)");
+}
+
+template <class T1, class T2>
+inline typename tools::promote_args<T1, T2>::type jacobi_zeta(T1 k, T2 phi)
+{
+   return boost::math::jacobi_zeta(k, phi, policies::policy<>());
+}
+
+}} // namespaces
+
+#endif // BOOST_MATH_ELLINT_D_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/polygamma.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2013 Nikhar Agrawal
+//  Copyright 2013 Christopher Kormanyos
+//  Copyright 2014 John Maddock
+//  Copyright 2013 Paul Bristow
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _BOOST_POLYGAMMA_2013_07_30_HPP_
+  #define _BOOST_POLYGAMMA_2013_07_30_HPP_
+
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/math/special_functions/detail/polygamma.hpp>
+#include <boost/math/special_functions/trigamma.hpp>
+
+namespace boost { namespace math {
+
+  
+  template<class T, class Policy>
+  inline typename tools::promote_args<T>::type polygamma(const int n, T x, const Policy& pol)
+  {
+     //
+     // Filter off special cases right at the start:
+     //
+     if(n == 0)
+        return boost::math::digamma(x, pol);
+     if(n == 1)
+        return boost::math::trigamma(x, pol);
+     //
+     // We've found some standard library functions to misbehave if any FPU exception flags
+     // are set prior to their call, this code will clear those flags, then reset them
+     // on exit:
+     //
+     BOOST_FPU_EXCEPTION_GUARD
+     //
+     // The type of the result - the common type of T and U after
+     // any integer types have been promoted to double:
+     //
+     typedef typename tools::promote_args<T>::type result_type;
+     //
+     // The type used for the calculation.  This may be a wider type than
+     // the result in order to ensure full precision:
+     //
+     typedef typename policies::evaluation<result_type, Policy>::type value_type;
+     //
+     // The type of the policy to forward to the actual implementation.
+     // We disable promotion of float and double as that's [possibly]
+     // happened already in the line above.  Also reset to the default
+     // any policies we don't use (reduces code bloat if we're called
+     // multiple times with differing policies we don't actually use).
+     // Also normalise the type, again to reduce code bloat in case we're
+     // called multiple times with functionally identical policies that happen
+     // to be different types.
+     //
+     typedef typename policies::normalise<
+        Policy,
+        policies::promote_float<false>,
+        policies::promote_double<false>,
+        policies::discrete_quantile<>,
+        policies::assert_undefined<> >::type forwarding_policy;
+     //
+     // Whew.  Now we can make the actual call to the implementation.
+     // Arguments are explicitly cast to the evaluation type, and the result
+     // passed through checked_narrowing_cast which handles things like overflow
+     // according to the policy passed:
+     //
+     return policies::checked_narrowing_cast<result_type, forwarding_policy>(
+        detail::polygamma_imp(n, static_cast<value_type>(x), forwarding_policy()),
+        "boost::math::polygamma<%1%>(int, %1%)");
+  }
+
+  template<class T>
+  inline typename tools::promote_args<T>::type polygamma(const int n, T x)
+  {
+      return boost::math::polygamma(n, x, policies::policy<>());
+  }
+
+} } // namespace boost::math
+
+#endif // _BOOST_BERNOULLI_2013_05_30_HPP_
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/math/special_functions/trigamma.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,469 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SF_TRIGAMMA_HPP
+#define BOOST_MATH_SF_TRIGAMMA_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/tools/series.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <boost/mpl/comparison.hpp>
+#include <boost/math/tools/big_constant.hpp>
+#include <boost/math/special_functions/polygamma.hpp>
+
+namespace boost{
+namespace math{
+namespace detail{
+
+template<class T, class Policy>
+T polygamma_imp(const int n, T x, const Policy &pol);
+
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<53>*, const Policy&)
+{
+   // Max error in interpolated form: 3.736e-017
+   static const T offset = BOOST_MATH_BIG_CONSTANT(T, 53, 2.1093254089355469);
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, -1.1093280605946045),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -3.8310674472619321),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -3.3703848401898283),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.28080574467981213),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.6638069578676164),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.64468386819102836),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 3.4535389668541151),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 4.5208926987851437),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.7012734178351534),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.64468798399785611),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.20314516859987728e-6),
+   };
+   // Max error in interpolated form: 1.159e-017
+   static const T P_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.13803835004508849e-7),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.50000049158540261),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.6077979838469348),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.5645435828098254),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.0534873203680393),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.74566981111565923),
+   };
+   static const T Q_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 53, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.8822787662376169),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 4.1681660554090917),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 2.7853527819234466),
+      BOOST_MATH_BIG_CONSTANT(T, 53, 0.74967671848044792),
+      BOOST_MATH_BIG_CONSTANT(T, 53, -0.00057069112416246805),
+   };
+   // Maximum Deviation Found:                     6.896e-018
+   // Expected Error Term :                       -6.895e-018
+   // Maximum Relative Change in Control Points :  8.497e-004
+   static const T P_4_inf[] = {
+      0.68947581948701249e-17L,
+      0.49999999999998975L,
+      1.0177274392923795L,
+      2.498208511343429L,
+      2.1921221359427595L,
+      1.5897035272532764L,
+      0.40154388356961734L,
+   };
+   static const T Q_4_inf[] = {
+      1.0L,
+      1.7021215452463932L,
+      4.4290431747556469L,
+      2.9745631894384922L,
+      2.3013614809773616L,
+      0.28360399799075752L,
+      0.022892987908906897L,
+   };
+
+   if(x <= 2)
+   {
+      return (offset + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 4)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_2_4, y) / tools::evaluate_polynomial(Q_2_4, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_4_inf, y) / tools::evaluate_polynomial(Q_4_inf, y)) / x;
+}
+   
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<64>*, const Policy&)
+{
+   // Max error in interpolated form: 1.178e-020
+   static const T offset_1_2 = BOOST_MATH_BIG_CONSTANT(T, 64, 2.109325408935546875);
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -1.10932535608960258341),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -4.18793841543017129052),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -4.63865531898487734531),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.919832884430500908047),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.68074038333180423012),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.21172611429185622377),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.259635673503366427284),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.77521119359546982995),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 5.664338024578956321),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 4.25995134879278028361),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.62956638448940402182),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.259635512844691089868),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.629642219810618032207e-8),
+   };
+   // Max error in interpolated form: 3.912e-020
+   static const T P_2_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.387540035162952880976e-11),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.500000000276430504),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.21926880986360957306),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 10.2550347708483445775),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 18.9002075150709144043),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 21.0357215832399705625),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 13.4346512182925923978),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.98656291026448279118),
+   };
+   static const T Q_2_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 6.10520430478613667724),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 18.475001060603645512),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 31.7087534567758405638),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 31.908814523890465398),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 17.4175479039227084798),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.98749106958394941276),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.000115917322224411128566),
+   };
+   // Maximum Deviation Found:                     2.635e-020
+   // Expected Error Term :                        2.635e-020
+   // Maximum Relative Change in Control Points :  1.791e-003
+   static const T P_8_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.263527875092466899848e-19),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.500000000000000058145),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0730121433777364138677),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.94505878379957149534),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.0517092358874932620529),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.07995383547483921121),
+   };
+   static const T Q_8_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 64, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.187309046577818095504),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 3.95255391645238842975),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -1.14743283327078949087),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 2.52989799376344914499),
+      BOOST_MATH_BIG_CONSTANT(T, 64, -0.627414303172402506396),
+      BOOST_MATH_BIG_CONSTANT(T, 64, 0.141554248216425512536),
+   };
+
+   if(x <= 2)
+   {
+      return (offset_1_2 + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 8)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_2_8, y) / tools::evaluate_polynomial(Q_2_8, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_8_inf, y) / tools::evaluate_polynomial(Q_8_inf, y)) / x;
+}
+
+template <class T, class Policy>
+T trigamma_prec(T x, const mpl::int_<113>*, const Policy&)
+{
+   // Max error in interpolated form: 1.916e-035
+
+   static const T P_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.999999999999999082554457936871832533),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -4.71237311120865266379041700054847734),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -7.94125711970499027763789342500817316),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -5.74657746697664735258222071695644535),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.404213349456398905981223965160595687),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.47877781178642876561595890095758896),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.07714151702455125992166949812126433),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.858877899162360138844032265418028567),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.20499222604410032375789018837922397),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0272103140348194747360175268778415049),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0015764849020876949848954081173520686),
+   };
+   static const T Q_1_2[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.71237311120863419878375031457715223),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.58619118655339853449127952145877467),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 11.0940067269829372437561421279054968),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.09075424749327792073276309969037885),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.87705890159891405185343806884451286),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.22758678701914477836330837816976782),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.249092040606385004109672077814668716),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0295750413900655597027079600025569048),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00157648490200498142247694709728858139),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.161264050344059471721062360645432809e-14),
+   };
+
+   // Max error in interpolated form: 8.958e-035
+   static const T P_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -2.55843734739907925764326773972215085),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -12.2830208240542011967952466273455887),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -23.9195022162767993526575786066414403),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -24.9256431504823483094158828285470862),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -14.7979122765478779075108064826412285),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -4.46654453928610666393276765059122272),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0191439033405649675717082465687845002),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.515412052554351265708917209749037352),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.195378348786064304378247325360320038),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0334761282624174313035014426794245393),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.002373665205942206348500250056602687),
+   };
+   static const T Q_2_4[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.80098558454419907830670928248659245),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.99220727843170133895059300223445265),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 11.8896146167631330735386697123464976),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.96613256683809091593793565879092581),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 4.47254136149624110878909334574485751),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.48600982028196527372434773913633152),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.319570735766764237068541501137990078),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0407358345787680953107374215319322066),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.00237366520593271641375755486420859837),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.239554887903526152679337256236302116e-15),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.294749244740618656265237072002026314e-17),
+   };
+
+   static const T y_offset_2_4 = BOOST_MATH_BIG_CONSTANT(T, 113, 3.558437347412109375);
+
+   // Max error in interpolated form: 4.319e-035
+   static const T P_4_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.166626112697021464248967707021688845e-16),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.499999999999997739552090249208808197),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 6.40270945019053817915772473771553187),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 41.3833374155000608013677627389343329),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 166.803341854562809335667241074035245),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 453.39964786925369319960722793414521),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 851.153712317697055375935433362983944),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1097.70657567285059133109286478004458),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 938.431232478455316020076349367632922),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 487.268001604651932322080970189930074),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 119.953445242335730062471193124820659),
+   };
+   static const T Q_4_8[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 12.4720855670474488978638945855932398),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 78.6093129753298570701376952709727391),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 307.470246050318322489781182863190127),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 805.140686101151538537565264188630079),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1439.12019760292146454787601409644413),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1735.6105285756048831268586001383127),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1348.32500712856328019355198611280536),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 607.225985860570846699704222144650563),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 119.952317857277045332558673164517227),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.000140165918355036060868680809129436084),
+   };
+
+   // Maximum Deviation Found:                     2.867e-035
+   // Expected Error Term :                        2.866e-035
+   // Maximum Relative Change in Control Points :  2.662e-004
+   static const T P_8_16[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.184828315274146610610872315609837439e-19),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.500000000000000004122475157735807738),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.02533865247313349284875558880415875),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 13.5995927517457371243039532492642734),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 35.3132224283087906757037999452941588),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 67.1639424550714159157603179911505619),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 83.5767733658513967581959839367419891),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 71.073491212235705900866411319363501),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 35.8621515614725564575893663483998663),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.72152231639983491987779743154333318),
+   };
+   static const T Q_8_16[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 5.71734397161293452310624822415866372),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 25.293404179620438179337103263274815),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 62.2619767967468199111077640625328469),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 113.955048909238993473389714972250235),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 130.807138328938966981862203944329408),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 102.423146902337654110717764213057753),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 44.0424772805245202514468199602123565),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 8.89898032477904072082994913461386099),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -0.0296627336872039988632793863671456398),
+   };
+   // Maximum Deviation Found:                     1.079e-035
+   // Expected Error Term :                       -1.079e-035
+   // Maximum Relative Change in Control Points :  7.884e-003
+   static const T P_16_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.500000000000000000000000000000087317),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.345625669885456215194494735902663968),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 9.62895499360842232127552650044647769),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 3.5936085382439026269301003761320812),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 49.459599118438883265036646019410669),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 7.77519237321893917784735690560496607),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 74.4536074488178075948642351179304121),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.75209340397069050436806159297952699),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 23.9292359711471667884504840186561598),
+   };
+   static const T Q_16_inf[] = {
+      BOOST_MATH_BIG_CONSTANT(T, 113, 1.0),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.357918006437579097055656138920742037),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 19.1386039850709849435325005484512944),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 0.874349081464143606016221431763364517),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 98.6516097434855572678195488061432509),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -16.1051972833382893468655223662534306),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 154.316860216253720989145047141653727),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -40.2026880424378986053105969312264534),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 60.1679136674264778074736441126810223),
+      BOOST_MATH_BIG_CONSTANT(T, 113, -13.3414844622256422644504472438320114),
+      BOOST_MATH_BIG_CONSTANT(T, 113, 2.53795636200649908779512969030363442),
+   };
+
+   if(x <= 2)
+   {
+      return (2 + boost::math::tools::evaluate_polynomial(P_1_2, x) / tools::evaluate_polynomial(Q_1_2, x)) / (x * x);
+   }
+   else if(x <= 4)
+   {
+      return (y_offset_2_4 + boost::math::tools::evaluate_polynomial(P_2_4, x) / tools::evaluate_polynomial(Q_2_4, x)) / (x * x);
+   }
+   else if(x <= 8)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_4_8, y) / tools::evaluate_polynomial(Q_4_8, y)) / x;
+   }
+   else if(x <= 16)
+   {
+      T y = 1 / x;
+      return (1 + tools::evaluate_polynomial(P_8_16, y) / tools::evaluate_polynomial(Q_8_16, y)) / x;
+   }
+   T y = 1 / x;
+   return (1 + tools::evaluate_polynomial(P_16_inf, y) / tools::evaluate_polynomial(Q_16_inf, y)) / x;
+}
+
+template <class T, class Tag, class Policy>
+T trigamma_imp(T x, const Tag* t, const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   T result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x <= 0)
+   {
+      // Reflect:
+      T z = 1 - x;
+      // Argument reduction for tan:
+      if(floor(x) == x)
+      {
+         return policies::raise_pole_error<T>("boost::math::trigamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      T s = fabs(x) < fabs(z) ? boost::math::sin_pi(x, pol) : boost::math::sin_pi(z, pol);
+      return -trigamma_imp(z, t, pol) + boost::math::pow<2>(constants::pi<T>()) / (s * s);
+   }
+   if(x < 1)
+   {
+      result = 1 / (x * x);
+      x += 1;
+   }
+   return result + trigamma_prec(x, t, pol);
+}
+
+template <class T, class Policy>
+T trigamma_imp(T x, const mpl::int_<0>*, const Policy& pol)
+{
+   return polygamma_imp(1, x, pol);
+}
+//
+// Initializer: ensure all our constants are initialized prior to the first call of main:
+//
+template <class T, class Policy>
+struct trigamma_initializer
+{
+   struct init
+   {
+      init()
+      {
+         typedef typename policies::precision<T, Policy>::type precision_type;
+         do_init(mpl::bool_<precision_type::value && (precision_type::value <= 113)>());
+      }
+      void do_init(const mpl::true_&)
+      {
+         boost::math::trigamma(T(2.5), Policy());
+      }
+      void do_init(const mpl::false_&){}
+      void force_instantiate()const{}
+   };
+   static const init initializer;
+   static void force_instantiate()
+   {
+      initializer.force_instantiate();
+   }
+};
+
+template <class T, class Policy>
+const typename trigamma_initializer<T, Policy>::init trigamma_initializer<T, Policy>::initializer;
+
+} // namespace detail
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   trigamma(T x, const Policy&)
+{
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::precision<T, Policy>::type precision_type;
+   typedef typename mpl::if_<
+      mpl::or_<
+         mpl::less_equal<precision_type, mpl::int_<0> >,
+         mpl::greater<precision_type, mpl::int_<114> >
+      >,
+      mpl::int_<0>,
+      typename mpl::if_<
+         mpl::less<precision_type, mpl::int_<54> >,
+         mpl::int_<53>,
+         typename mpl::if_<
+            mpl::less<precision_type, mpl::int_<65> >,
+            mpl::int_<64>,
+            mpl::int_<113>
+         >::type
+      >::type
+   >::type tag_type;
+
+   typedef typename policies::normalise<
+      Policy,
+      policies::promote_float<false>,
+      policies::promote_double<false>,
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   // Force initialization of constants:
+   detail::trigamma_initializer<value_type, forwarding_policy>::force_instantiate();
+
+   return policies::checked_narrowing_cast<result_type, Policy>(detail::trigamma_imp(
+      static_cast<value_type>(x),
+      static_cast<const tag_type*>(0), forwarding_policy()), "boost::math::trigamma<%1%>(%1%)");
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type 
+   trigamma(T x)
+{
+   return trigamma(x, policies::policy<>());
+}
+
+} // namespace math
+} // namespace boost
+#endif
+
--- a/DEPENDENCIES/generic/include/boost/math/tools/remez.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,667 +0,0 @@
-//  (C) Copyright John Maddock 2006.
-//  Use, modification and distribution are subject to the
-//  Boost Software License, Version 1.0. (See accompanying file
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_MATH_TOOLS_REMEZ_HPP
-#define BOOST_MATH_TOOLS_REMEZ_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <boost/math/tools/solve.hpp>
-#include <boost/math/tools/minima.hpp>
-#include <boost/math/tools/roots.hpp>
-#include <boost/math/tools/polynomial.hpp>
-#include <boost/function/function1.hpp>
-#include <boost/scoped_array.hpp>
-#include <boost/math/constants/constants.hpp>
-#include <boost/math/policies/policy.hpp>
-
-namespace boost{ namespace math{ namespace tools{
-
-namespace detail{
-
-//
-// The error function: the difference between F(x) and
-// the current approximation.  This is the function
-// for which we must find the extema.
-//
-template <class T>
-struct remez_error_function
-{
-   typedef boost::function1<T, T const &> function_type;
-public:
-   remez_error_function(
-      function_type f_, 
-      const polynomial<T>& n, 
-      const polynomial<T>& d, 
-      bool rel_err)
-         : f(f_), numerator(n), denominator(d), rel_error(rel_err) {}
-
-   T operator()(const T& z)const
-   {
-      T y = f(z);
-      T abs = y - (numerator.evaluate(z) / denominator.evaluate(z));
-      T err;
-      if(rel_error)
-      {
-         if(y != 0)
-            err = abs / fabs(y);
-         else if(0 == abs)
-         {
-            // we must be at a root, or it's not recoverable:
-            BOOST_ASSERT(0 == abs);
-            err = 0;
-         }
-         else
-         {
-            // We have a divide by zero!
-            // Lets assume that f(x) is zero as a result of
-            // internal cancellation error that occurs as a result
-            // of shifting a root at point z to the origin so that
-            // the approximation can be "pinned" to pass through
-            // the origin: in that case it really
-            // won't matter what our approximation calculates here
-            // as long as it's a small number, return the absolute error:
-            err = abs;
-         }
-      }
-      else
-         err = abs;
-      return err;
-   }
-private:
-   function_type f;
-   polynomial<T> numerator;
-   polynomial<T> denominator;
-   bool rel_error;
-};
-//
-// This function adapts the error function so that it's minima
-// are the extema of the error function.  We can find the minima
-// with standard techniques.
-//
-template <class T>
-struct remez_max_error_function
-{
-   remez_max_error_function(const remez_error_function<T>& f)
-      : func(f) {}
-
-   T operator()(const T& x)
-   {
-      BOOST_MATH_STD_USING
-      return -fabs(func(x));
-   }
-private:
-   remez_error_function<T> func;
-};
-
-} // detail
-
-template <class T>
-class remez_minimax
-{
-public:
-   typedef boost::function1<T, T const &> function_type;
-   typedef boost::numeric::ublas::vector<T> vector_type;
-   typedef boost::numeric::ublas::matrix<T> matrix_type;
-
-   remez_minimax(function_type f, unsigned oN, unsigned oD, T a, T b, bool pin = true, bool rel_err = false, int sk = 0, int bits = 0);
-   remez_minimax(function_type f, unsigned oN, unsigned oD, T a, T b, bool pin, bool rel_err, int sk, int bits, const vector_type& points);
-
-   void reset(unsigned oN, unsigned oD, T a, T b, bool pin = true, bool rel_err = false, int sk = 0, int bits = 0);
-   void reset(unsigned oN, unsigned oD, T a, T b, bool pin, bool rel_err, int sk, int bits, const vector_type& points);
-
-   void set_brake(int b)
-   {
-      BOOST_ASSERT(b < 100);
-      BOOST_ASSERT(b >= 0);
-      m_brake = b;
-   }
-
-   T iterate();
-
-   polynomial<T> denominator()const;
-   polynomial<T> numerator()const;
-
-   vector_type const& chebyshev_points()const
-   {
-      return control_points;
-   }
-
-   vector_type const& zero_points()const
-   {
-      return zeros;
-   }
-
-   T error_term()const
-   {
-      return solution[solution.size() - 1];
-   }
-   T max_error()const
-   {
-      return m_max_error;
-   }
-   T max_change()const
-   {
-      return m_max_change;
-   }
-   void rotate()
-   {
-      --orderN;
-      ++orderD;
-   }
-   void rescale(T a, T b)
-   {
-      T scale = (b - a) / (max - min);
-      for(unsigned i = 0; i < control_points.size(); ++i)
-      {
-         control_points[i] = (control_points[i] - min) * scale + a;
-      }
-      min = a;
-      max = b;
-   }
-private:
-
-   void init_chebyshev();
-
-   function_type func;            // The function to approximate.
-   vector_type control_points;    // Current control points to be used for the next iteration.
-   vector_type solution;          // Solution from the last iteration contains all unknowns including the error term.
-   vector_type zeros;             // Location of points of zero error from last iteration, plus the two end points.
-   vector_type maxima;            // Location of maxima of the error function, actually contains the control points used for the last iteration.
-   T m_max_error;                 // Maximum error found in last approximation.
-   T m_max_change;                // Maximum change in location of control points after last iteration.
-   unsigned orderN;               // Order of the numerator polynomial.
-   unsigned orderD;               // Order of the denominator polynomial.
-   T min, max;                    // End points of the range to optimise over.
-   bool rel_error;                // If true optimise for relative not absolute error.
-   bool pinned;                   // If true the approximation is "pinned" to go through the origin.
-   unsigned unknowns;             // Total number of unknowns.
-   int m_precision;               // Number of bits precision to which the zeros and maxima are found.
-   T m_max_change_history[2];     // Past history of changes to control points.
-   int m_brake;                     // amount to break by in percentage points.
-   int m_skew;                      // amount to skew starting points by in percentage points: -100-100
-};
-
-#ifndef BRAKE
-#define BRAKE 0
-#endif
-#ifndef SKEW
-#define SKEW 0
-#endif
-
-template <class T>
-void remez_minimax<T>::init_chebyshev()
-{
-   BOOST_MATH_STD_USING
-   //
-   // Fill in the zeros:
-   //
-   unsigned terms = pinned ? orderD + orderN : orderD + orderN + 1;
-
-   for(unsigned i = 0; i < terms; ++i)
-   {
-      T cheb = cos((2 * terms - 1 - 2 * i) * constants::pi<T>() / (2 * terms));
-      cheb += 1;
-      cheb /= 2;
-      if(m_skew != 0)
-      {
-         T p = static_cast<T>(200 + m_skew) / 200;
-         cheb = pow(cheb, p);
-      }
-      cheb *= (max - min);
-      cheb += min;
-      zeros[i+1] = cheb;
-   }
-   zeros[0] = min;
-   zeros[unknowns] = max;
-   // perform a regular interpolation fit:
-   matrix_type A(terms, terms);
-   vector_type b(terms);
-   // fill in the y values:
-   for(unsigned i = 0; i < b.size(); ++i)
-   {
-      b[i] = func(zeros[i+1]);
-   }
-   // fill in powers of x evaluated at each of the control points:
-   unsigned offsetN = pinned ? 0 : 1;
-   unsigned offsetD = offsetN + orderN;
-   unsigned maxorder = (std::max)(orderN, orderD);
-   for(unsigned i = 0; i < b.size(); ++i)
-   {
-      T x0 = zeros[i+1];
-      T x = x0;
-      if(!pinned)
-         A(i, 0) = 1;
-      for(unsigned j = 0; j < maxorder; ++j)
-      {
-         if(j < orderN)
-            A(i, j + offsetN) = x;
-         if(j < orderD)
-         {
-            A(i, j + offsetD) = -x * b[i];
-         }
-         x *= x0;
-      }
-   }
-   //
-   // Now go ahead and solve the expression to get our solution:
-   //
-   vector_type l_solution = boost::math::tools::solve(A, b);
-   // need to add a "fake" error term:
-   l_solution.resize(unknowns);
-   l_solution[unknowns-1] = 0;
-   solution = l_solution;
-   //
-   // Now find all the extrema of the error function:
-   //
-   detail::remez_error_function<T> Err(func, this->numerator(), this->denominator(), rel_error);
-   detail::remez_max_error_function<T> Ex(Err);
-   m_max_error = 0;
-   int max_err_location = 0;
-   for(unsigned i = 0; i < unknowns; ++i)
-   {
-      std::pair<T, T> r = brent_find_minima(Ex, zeros[i], zeros[i+1], m_precision);
-      maxima[i] = r.first;
-      T rel_err = fabs(r.second);
-      if(rel_err > m_max_error)
-      {
-         m_max_error = fabs(r.second);
-         max_err_location = i;
-      }
-   }
-   control_points = maxima;
-}
-
-template <class T>
-void remez_minimax<T>::reset(
-         unsigned oN, 
-         unsigned oD, 
-         T a, 
-         T b, 
-         bool pin, 
-         bool rel_err, 
-         int sk,
-         int bits)
-{
-   control_points = vector_type(oN + oD + (pin ? 1 : 2));
-   solution = control_points;
-   zeros = vector_type(oN + oD + (pin ? 2 : 3));
-   maxima = control_points;
-   orderN = oN;
-   orderD = oD;
-   rel_error = rel_err;
-   pinned = pin;
-   m_skew = sk;
-   min = a;
-   max = b;
-   m_max_error = 0;
-   unknowns = orderN + orderD + (pinned ? 1 : 2);
-   // guess our initial control points:
-   control_points[0] = min;
-   control_points[unknowns - 1] = max;
-   T interval = (max - min) / (unknowns - 1);
-   T spot = min + interval;
-   for(unsigned i = 1; i < control_points.size(); ++i)
-   {
-      control_points[i] = spot;
-      spot += interval;
-   }
-   solution[unknowns - 1] = 0;
-   m_max_error = 0;
-   if(bits == 0)
-   {
-      // don't bother about more than float precision:
-      m_precision = (std::min)(24, (boost::math::policies::digits<T, boost::math::policies::policy<> >() / 2) - 2);
-   }
-   else
-   {
-      // can't be more accurate than half the bits of T:
-      m_precision = (std::min)(bits, (boost::math::policies::digits<T, boost::math::policies::policy<> >() / 2) - 2);
-   }
-   m_max_change_history[0] = m_max_change_history[1] = 1;
-   init_chebyshev();
-   // do one iteration whatever:
-   //iterate();
-}
-
-template <class T>
-inline remez_minimax<T>::remez_minimax(
-         typename remez_minimax<T>::function_type f, 
-         unsigned oN, 
-         unsigned oD, 
-         T a, 
-         T b, 
-         bool pin, 
-         bool rel_err, 
-         int sk,
-         int bits)
-   : func(f) 
-{
-   m_brake = 0;
-   reset(oN, oD, a, b, pin, rel_err, sk, bits);
-}
-
-template <class T>
-void remez_minimax<T>::reset(
-         unsigned oN, 
-         unsigned oD, 
-         T a, 
-         T b, 
-         bool pin, 
-         bool rel_err, 
-         int sk,
-         int bits,
-         const vector_type& points)
-{
-   control_points = vector_type(oN + oD + (pin ? 1 : 2));
-   solution = control_points;
-   zeros = vector_type(oN + oD + (pin ? 2 : 3));
-   maxima = control_points;
-   orderN = oN;
-   orderD = oD;
-   rel_error = rel_err;
-   pinned = pin;
-   m_skew = sk;
-   min = a;
-   max = b;
-   m_max_error = 0;
-   unknowns = orderN + orderD + (pinned ? 1 : 2);
-   control_points = points;
-   solution[unknowns - 1] = 0;
-   m_max_error = 0;
-   if(bits == 0)
-   {
-      // don't bother about more than float precision:
-      m_precision = (std::min)(24, (boost::math::policies::digits<T, boost::math::policies::policy<> >() / 2) - 2);
-   }
-   else
-   {
-      // can't be more accurate than half the bits of T:
-      m_precision = (std::min)(bits, (boost::math::policies::digits<T, boost::math::policies::policy<> >() / 2) - 2);
-   }
-   m_max_change_history[0] = m_max_change_history[1] = 1;
-   // do one iteration whatever:
-   //iterate();
-}
-
-template <class T>
-inline remez_minimax<T>::remez_minimax(
-         typename remez_minimax<T>::function_type f, 
-         unsigned oN, 
-         unsigned oD, 
-         T a, 
-         T b, 
-         bool pin, 
-         bool rel_err, 
-         int sk,
-         int bits,
-         const vector_type& points)
-   : func(f)
-{
-   m_brake = 0;
-   reset(oN, oD, a, b, pin, rel_err, sk, bits, points);
-}
-
-template <class T>
-T remez_minimax<T>::iterate()
-{
-   BOOST_MATH_STD_USING
-   matrix_type A(unknowns, unknowns);
-   vector_type b(unknowns);
-
-   // fill in evaluation of f(x) at each of the control points:
-   for(unsigned i = 0; i < b.size(); ++i)
-   {
-      // take care that none of our control points are at the origin:
-      if(pinned && (control_points[i] == 0))
-      {
-         if(i)
-            control_points[i] = control_points[i-1] / 3;
-         else
-            control_points[i] = control_points[i+1] / 3;
-      }
-      b[i] = func(control_points[i]);
-   }
-
-   T err_err;
-   unsigned convergence_count = 0;
-   do{
-      // fill in powers of x evaluated at each of the control points:
-      int sign = 1;
-      unsigned offsetN = pinned ? 0 : 1;
-      unsigned offsetD = offsetN + orderN;
-      unsigned maxorder = (std::max)(orderN, orderD);
-      T Elast = solution[unknowns - 1];
-
-      for(unsigned i = 0; i < b.size(); ++i)
-      {
-         T x0 = control_points[i];
-         T x = x0;
-         if(!pinned)
-            A(i, 0) = 1;
-         for(unsigned j = 0; j < maxorder; ++j)
-         {
-            if(j < orderN)
-               A(i, j + offsetN) = x;
-            if(j < orderD)
-            {
-               T mult = rel_error ? T(b[i] - sign * fabs(b[i]) * Elast): T(b[i] - sign * Elast);
-               A(i, j + offsetD) = -x * mult;
-            }
-            x *= x0;
-         }
-         // The last variable to be solved for is the error term, 
-         // sign changes with each control point:
-         T E = rel_error ? T(sign * fabs(b[i])) : T(sign);
-         A(i, unknowns - 1) = E;
-         sign = -sign;
-      }
-
-   #ifdef BOOST_MATH_INSTRUMENT
-      for(unsigned i = 0; i < b.size(); ++i)
-         std::cout << b[i] << " ";
-      std::cout << "\n\n";
-      for(unsigned i = 0; i < b.size(); ++i)
-      {
-         for(unsigned j = 0; j < b.size(); ++ j)
-            std::cout << A(i, j) << " ";
-         std::cout << "\n";
-      }
-      std::cout << std::endl;
-   #endif
-      //
-      // Now go ahead and solve the expression to get our solution:
-      //
-      solution = boost::math::tools::solve(A, b);
-
-      err_err = (Elast != 0) ? T(fabs((fabs(solution[unknowns-1]) - fabs(Elast)) / fabs(Elast))) : T(1);
-   }while(orderD && (convergence_count++ < 80) && (err_err > 0.001));
-
-   //
-   // Perform a sanity check to verify that the solution to the equations
-   // is not so much in error as to be useless.  The matrix inversion can
-   // be very close to singular, so this can be a real problem.
-   //
-   vector_type sanity = prod(A, solution);
-   for(unsigned i = 0; i < b.size(); ++i)
-   {
-      T err = fabs((b[i] - sanity[i]) / fabs(b[i]));
-      if(err > sqrt(epsilon<T>()))
-      {
-         std::cerr << "Sanity check failed: more than half the digits in the found solution are in error." << std::endl;
-      }
-   }
-
-   //
-   // Next comes another sanity check, we want to verify that all the control
-   // points do actually alternate in sign, in practice we may have 
-   // additional roots in the error function that cause this to fail.
-   // Failure here is always fatal: even though this code attempts to correct
-   // the problem it usually only postpones the inevitable.
-   //
-   polynomial<T> num, denom;
-   num = this->numerator();
-   denom = this->denominator();
-   T e1 = b[0] - num.evaluate(control_points[0]) / denom.evaluate(control_points[0]);
-#ifdef BOOST_MATH_INSTRUMENT
-   std::cout << e1;
-#endif
-   for(unsigned i = 1; i < b.size(); ++i)
-   {
-      T e2 = b[i] - num.evaluate(control_points[i]) / denom.evaluate(control_points[i]);
-#ifdef BOOST_MATH_INSTRUMENT
-      std::cout << " " << e2;
-#endif
-      if(e2 * e1 > 0)
-      {
-         std::cerr << std::flush << "Basic sanity check failed: Error term does not alternate in sign, non-recoverable error may follow..." << std::endl;
-         T perturbation = 0.05;
-         do{
-            T point = control_points[i] * (1 - perturbation) + control_points[i-1] * perturbation;
-            e2 = func(point) - num.evaluate(point) / denom.evaluate(point);
-            if(e2 * e1 < 0)
-            {
-               control_points[i] = point;
-               break;
-            }
-            perturbation += 0.05;
-         }while(perturbation < 0.8);
-
-         if((e2 * e1 > 0) && (i + 1 < b.size()))
-         {
-            perturbation = 0.05;
-            do{
-               T point = control_points[i] * (1 - perturbation) + control_points[i+1] * perturbation;
-               e2 = func(point) - num.evaluate(point) / denom.evaluate(point);
-               if(e2 * e1 < 0)
-               {
-                  control_points[i] = point;
-                  break;
-               }
-               perturbation += 0.05;
-            }while(perturbation < 0.8);
-         }
-
-      }
-      e1 = e2;
-   }
-
-#ifdef BOOST_MATH_INSTRUMENT
-   for(unsigned i = 0; i < solution.size(); ++i)
-      std::cout << solution[i] << " ";
-   std::cout << std::endl << this->numerator() << std::endl;
-   std::cout << this->denominator() << std::endl;
-   std::cout << std::endl;
-#endif
-
-   //
-   // The next step is to find all the intervals in which our maxima
-   // lie:
-   //
-   detail::remez_error_function<T> Err(func, this->numerator(), this->denominator(), rel_error);
-   zeros[0] = min;
-   zeros[unknowns] = max;
-   for(unsigned i = 1; i < control_points.size(); ++i)
-   {
-      eps_tolerance<T> tol(m_precision);
-      boost::uintmax_t max_iter = 1000;
-      std::pair<T, T> p = toms748_solve(
-         Err, 
-         control_points[i-1], 
-         control_points[i], 
-         tol, 
-         max_iter);
-      zeros[i] = (p.first + p.second) / 2;
-      //zeros[i] = bisect(Err, control_points[i-1], control_points[i], m_precision);
-   }
-   //
-   // Now find all the extrema of the error function:
-   //
-   detail::remez_max_error_function<T> Ex(Err);
-   m_max_error = 0;
-   int max_err_location = 0;
-   for(unsigned i = 0; i < unknowns; ++i)
-   {
-      std::pair<T, T> r = brent_find_minima(Ex, zeros[i], zeros[i+1], m_precision);
-      maxima[i] = r.first;
-      T rel_err = fabs(r.second);
-      if(rel_err > m_max_error)
-      {
-         m_max_error = fabs(r.second);
-         max_err_location = i;
-      }
-   }
-   //
-   // Almost done now! we just need to set our control points
-   // to the extrema, and calculate how much each point has changed
-   // (this will be our termination condition):
-   //
-   swap(control_points, maxima);
-   m_max_change = 0;
-   int max_change_location = 0;
-   for(unsigned i = 0; i < unknowns; ++i)
-   {
-      control_points[i] = (control_points[i] * (100 - m_brake) + maxima[i] * m_brake) / 100;
-      T change = fabs((control_points[i] - maxima[i]) / control_points[i]);
-#if 0
-      if(change > m_max_change_history[1])
-      {
-         // divergence!!! try capping the change:
-         std::cerr << "Possible divergent step, change will be capped!!" << std::endl;
-         change = m_max_change_history[1];
-         if(control_points[i] < maxima[i])
-            control_points[i] = maxima[i] - change * maxima[i];
-         else
-            control_points[i] = maxima[i] + change * maxima[i];
-      }
-#endif
-      if(change > m_max_change)
-      {
-         m_max_change = change;
-         max_change_location = i;
-      }
-   }
-   //
-   // store max change information:
-   //
-   m_max_change_history[0] = m_max_change_history[1];
-   m_max_change_history[1] = fabs(m_max_change);
-
-   return m_max_change;
-}
-
-template <class T>
-polynomial<T> remez_minimax<T>::numerator()const
-{
-   boost::scoped_array<T> a(new T[orderN + 1]);
-   if(pinned)
-      a[0] = 0;
-   unsigned terms = pinned ? orderN : orderN + 1;
-   for(unsigned i = 0; i < terms; ++i)
-      a[pinned ? i+1 : i] = solution[i];
-   return boost::math::tools::polynomial<T>(&a[0], orderN);
-}
-
-template <class T>
-polynomial<T> remez_minimax<T>::denominator()const
-{
-   unsigned terms = orderD + 1;
-   unsigned offsetD = pinned ? orderN : (orderN + 1);
-   boost::scoped_array<T> a(new T[terms]);
-   a[0] = 1;
-   for(unsigned i = 0; i < orderD; ++i)
-      a[i+1] = solution[i + offsetD];
-   return boost::math::tools::polynomial<T>(&a[0], orderD);
-}
-
-
-}}} // namespaces
-
-#endif // BOOST_MATH_TOOLS_REMEZ_HPP
-
-
-
--- a/DEPENDENCIES/generic/include/boost/math/tools/solve.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-//  (C) Copyright John Maddock 2006.
-//  Use, modification and distribution are subject to the
-//  Boost Software License, Version 1.0. (See accompanying file
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_MATH_TOOLS_SOLVE_HPP
-#define BOOST_MATH_TOOLS_SOLVE_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <boost/config.hpp>
-#include <boost/assert.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996 4267 4244)
-#endif
-
-#include <boost/numeric/ublas/lu.hpp>
-#include <boost/numeric/ublas/matrix.hpp>
-#include <boost/numeric/ublas/vector.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{ namespace math{ namespace tools{
-
-//
-// Find x such that Ax = b
-//
-// Caution: this uses undocumented, and untested ublas code,
-// however short of writing our own LU-decompostion code
-// it's the only game in town.
-//
-template <class T>
-boost::numeric::ublas::vector<T> solve(
-          const boost::numeric::ublas::matrix<T>& A_,
-          const boost::numeric::ublas::vector<T>& b_)
-{
-   //BOOST_ASSERT(A_.size() == b_.size());
-
-   boost::numeric::ublas::matrix<T> A(A_);
-   boost::numeric::ublas::vector<T> b(b_);
-   boost::numeric::ublas::permutation_matrix<> piv(b.size());
-   lu_factorize(A, piv);
-   lu_substitute(A, piv, b);
-   //
-   // iterate to reduce error:
-   //
-   boost::numeric::ublas::vector<T> delta(b.size());
-   for(unsigned i = 0; i < 1; ++i)
-   {
-      noalias(delta) = prod(A_, b);
-      delta -= b_;
-      lu_substitute(A, piv, delta);
-      b -= delta;
-
-      T max_error = 0;
-
-      for(unsigned i = 0; i < delta.size(); ++i)
-      {
-         T err = fabs(delta[i] / b[i]);
-         if(err > max_error)
-            max_error = err;
-      }
-      //std::cout << "Max change in LU error correction: " << max_error << std::endl;
-   }
-
-   return b;
-}
-
-}}} // namespaces
-
-#endif // BOOST_MATH_TOOLS_SOLVE_HPP
-
-
--- a/DEPENDENCIES/generic/include/boost/math/tools/test.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,334 +0,0 @@
-//  (C) Copyright John Maddock 2006.
-//  Use, modification and distribution are subject to the
-//  Boost Software License, Version 1.0. (See accompanying file
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_MATH_TOOLS_TEST_HPP
-#define BOOST_MATH_TOOLS_TEST_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <boost/math/tools/config.hpp>
-#include <boost/math/tools/stats.hpp>
-#include <boost/math/special_functions/fpclassify.hpp>
-#include <boost/test/test_tools.hpp>
-#include <stdexcept>
-#include <iostream>
-#include <iomanip>
-
-namespace boost{ namespace math{ namespace tools{
-
-template <class T>
-struct test_result
-{
-private:
-   boost::math::tools::stats<T> stat;   // Statistics for the test.
-   unsigned worst_case;                 // Index of the worst case test.
-public:
-   test_result() { worst_case = 0; }
-   void set_worst(int i){ worst_case = i; }
-   void add(const T& point){ stat.add(point); }
-   // accessors:
-   unsigned worst()const{ return worst_case; }
-   T min BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return (stat.min)(); }
-   T max BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return (stat.max)(); }
-   T total()const{ return stat.total(); }
-   T mean()const{ return stat.mean(); }
-   boost::uintmax_t count()const{ return stat.count(); }
-   T variance()const{ return stat.variance(); }
-   T variance1()const{ return stat.variance1(); }
-   T rms()const{ return stat.rms(); }
-
-   test_result& operator+=(const test_result& t)
-   {
-      if((t.stat.max)() > (stat.max)())
-         worst_case = t.worst_case;
-      stat += t.stat;
-      return *this;
-   }
-};
-
-template <class T>
-struct calculate_result_type
-{
-   typedef typename T::value_type row_type;
-   typedef typename row_type::value_type value_type;
-};
-
-template <class T>
-T relative_error(T a, T b)
-{
-   BOOST_MATH_STD_USING
-#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   //
-   // If math.h has no long double support we can't rely
-   // on the math functions generating exponents outside
-   // the range of a double:
-   //
-   T min_val = (std::max)(
-      tools::min_value<T>(),
-      static_cast<T>((std::numeric_limits<double>::min)()));
-   T max_val = (std::min)(
-      tools::max_value<T>(),
-      static_cast<T>((std::numeric_limits<double>::max)()));
-#else
-   T min_val = tools::min_value<T>();
-   T max_val = tools::max_value<T>();
-#endif
-
-   if((a != 0) && (b != 0))
-   {
-      // TODO: use isfinite:
-      if(fabs(b) >= max_val)
-      {
-         if(fabs(a) >= max_val)
-            return 0;  // one infinity is as good as another!
-      }
-      // If the result is denormalised, treat all denorms as equivalent:
-      if((a < min_val) && (a > 0))
-         a = min_val;
-      else if((a > -min_val) && (a < 0))
-         a = -min_val;
-      if((b < min_val) && (b > 0))
-         b = min_val;
-      else if((b > -min_val) && (b < 0))
-         b = -min_val;
-      return (std::max)(fabs((a-b)/a), fabs((a-b)/b));
-   }
-
-   // Handle special case where one or both are zero:
-   if(min_val == 0)
-      return fabs(a-b);
-   if(fabs(a) < min_val)
-      a = min_val;
-   if(fabs(b) < min_val)
-      b = min_val;
-   return (std::max)(fabs((a-b)/a), fabs((a-b)/b));
-}
-
-#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
-template <>
-inline double relative_error<double>(double a, double b)
-{
-   BOOST_MATH_STD_USING
-   //
-   // On Mac OS X we evaluate "double" functions at "long double" precision,
-   // but "long double" actually has a very slightly narrower range than "double"!  
-   // Therefore use the range of "long double" as our limits since results outside
-   // that range may have been truncated to 0 or INF:
-   //
-   double min_val = (std::max)((double)tools::min_value<long double>(), tools::min_value<double>());
-   double max_val = (std::min)((double)tools::max_value<long double>(), tools::max_value<double>());
-
-   if((a != 0) && (b != 0))
-   {
-      // TODO: use isfinite:
-      if(b > max_val)
-      {
-         if(a > max_val)
-            return 0;  // one infinity is as good as another!
-      }
-      // If the result is denormalised, treat all denorms as equivalent:
-      if((a < min_val) && (a > 0))
-         a = min_val;
-      else if((a > -min_val) && (a < 0))
-         a = -min_val;
-      if((b < min_val) && (b > 0))
-         b = min_val;
-      else if((b > -min_val) && (b < 0))
-         b = -min_val;
-      return (std::max)(fabs((a-b)/a), fabs((a-b)/b));
-   }
-
-   // Handle special case where one or both are zero:
-   if(min_val == 0)
-      return fabs(a-b);
-   if(fabs(a) < min_val)
-      a = min_val;
-   if(fabs(b) < min_val)
-      b = min_val;
-   return (std::max)(fabs((a-b)/a), fabs((a-b)/b));
-}
-#endif
-
-template <class T>
-void set_output_precision(T)
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-   if(std::numeric_limits<T>::digits10)
-   {
-      std::cout << std::setprecision(std::numeric_limits<T>::digits10 + 2);
-   }
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class Seq>
-void print_row(const Seq& row)
-{
-   set_output_precision(row[0]);
-   for(unsigned i = 0; i < row.size(); ++i)
-   {
-      if(i)
-         std::cout << ", ";
-      std::cout << row[i];
-   }
-   std::cout << std::endl;
-}
-
-//
-// Function test accepts an matrix of input values (probably a 2D boost::array)
-// and calls two functors for each row in the array - one calculates a value
-// to test, and one extracts the expected value from the array (or possibly
-// calculates it at high precision).  The two functors are usually simple lambda
-// expressions.
-//
-template <class A, class F1, class F2>
-test_result<typename calculate_result_type<A>::value_type> test(const A& a, F1 test_func, F2 expect_func)
-{
-   typedef typename A::value_type         row_type;
-   typedef typename row_type::value_type  value_type;
-
-   test_result<value_type> result;
-
-   for(unsigned i = 0; i < a.size(); ++i)
-   {
-      const row_type& row = a[i];
-      value_type point;
-      try
-      {
-         point = test_func(row);
-      }
-      catch(const std::underflow_error&)
-      {
-         point = 0;
-      }
-      catch(const std::overflow_error&)
-      {
-         point = std::numeric_limits<value_type>::has_infinity ? 
-            std::numeric_limits<value_type>::infinity()
-            : tools::max_value<value_type>();
-      }
-      catch(const std::exception& e)
-      {
-         std::cerr << e.what() << std::endl;
-         print_row(row);
-         BOOST_ERROR("Unexpected exception.");
-         // so we don't get further errors:
-         point = expect_func(row);
-      }
-      value_type expected = expect_func(row);
-      value_type err = relative_error(point, expected);
-#ifdef BOOST_INSTRUMENT
-      if(err != 0)
-      {
-         std::cout << row[0] << " " << err;
-         if(std::numeric_limits<value_type>::is_specialized)
-         {
-            std::cout << " (" << err / std::numeric_limits<value_type>::epsilon() << "eps)";
-         }
-         std::cout << std::endl;
-      }
-#endif
-      if(!(boost::math::isfinite)(point) && (boost::math::isfinite)(expected))
-      {
-         std::cout << "CAUTION: Found non-finite result, when a finite value was expected at entry " << i << "\n";
-         std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl;
-         print_row(row);
-         BOOST_ERROR("Unexpected non-finite result");
-      }
-      if(err > 0.5)
-      {
-         std::cout << "CAUTION: Gross error found at entry " << i << ".\n";
-         std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl;
-         print_row(row);
-         BOOST_ERROR("Gross error");
-      }
-      result.add(err);
-      if((result.max)() == err)
-         result.set_worst(i);
-   }
-   return result;
-}
-
-template <class Real, class A, class F1, class F2>
-test_result<Real> test_hetero(const A& a, F1 test_func, F2 expect_func)
-{
-   typedef typename A::value_type         row_type;
-   typedef Real                          value_type;
-
-   test_result<value_type> result;
-
-   for(unsigned i = 0; i < a.size(); ++i)
-   {
-      const row_type& row = a[i];
-      value_type point;
-      try
-      {
-         point = test_func(row);
-      }
-      catch(const std::underflow_error&)
-      {
-         point = 0;
-      }
-      catch(const std::overflow_error&)
-      {
-         point = std::numeric_limits<value_type>::has_infinity ? 
-            std::numeric_limits<value_type>::infinity()
-            : tools::max_value<value_type>();
-      }
-      catch(const std::exception& e)
-      {
-         std::cerr << e.what() << std::endl;
-         print_row(row);
-         BOOST_ERROR("Unexpected exception.");
-         // so we don't get further errors:
-         point = expect_func(row);
-      }
-      value_type expected = expect_func(row);
-      value_type err = relative_error(point, expected);
-#ifdef BOOST_INSTRUMENT
-      if(err != 0)
-      {
-         std::cout << row[0] << " " << err;
-         if(std::numeric_limits<value_type>::is_specialized)
-         {
-            std::cout << " (" << err / std::numeric_limits<value_type>::epsilon() << "eps)";
-         }
-         std::cout << std::endl;
-      }
-#endif
-      if(!(boost::math::isfinite)(point) && (boost::math::isfinite)(expected))
-      {
-         std::cout << "CAUTION: Found non-finite result, when a finite value was expected at entry " << i << "\n";
-         std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl;
-         print_row(row);
-         BOOST_ERROR("Unexpected non-finite result");
-      }
-      if(err > 0.5)
-      {
-         std::cout << "CAUTION: Gross error found at entry " << i << ".\n";
-         std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl;
-         print_row(row);
-         BOOST_ERROR("Gross error");
-      }
-      result.add(err);
-      if((result.max)() == err)
-         result.set_worst(i);
-   }
-   return result;
-}
-
-} // namespace tools
-} // namespace math
-} // namespace boost
-
-#endif
-
-
--- a/DEPENDENCIES/generic/include/boost/math/tools/test_data.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,767 +0,0 @@
-//  (C) Copyright John Maddock 2006.
-//  Use, modification and distribution are subject to the
-//  Boost Software License, Version 1.0. (See accompanying file
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_MATH_TOOLS_TEST_DATA_HPP
-#define BOOST_MATH_TOOLS_TEST_DATA_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <boost/math/tools/config.hpp>
-#include <boost/assert.hpp>
-#ifdef BOOST_MSVC
-#  pragma warning(push)
-#  pragma warning(disable: 4127 4701 4512)
-#  pragma warning(disable: 4130) // '==' : logical operation on address of string constant.
-#endif
-#include <boost/algorithm/string/trim.hpp>
-#include <boost/lexical_cast.hpp>
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-#include <boost/type_traits/is_floating_point.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/integral_constant.hpp>
-#include <boost/tr1/random.hpp>
-#include <boost/math/tools/tuple.hpp>
-#include <boost/math/tools/real_cast.hpp>
-
-#include <set>
-#include <vector>
-#include <iostream>
-
-#ifdef BOOST_MSVC
-#  pragma warning(push)
-#  pragma warning(disable: 4130) // '==' : logical operation on address of string constant.
-// Used as a warning with BOOST_ASSERT
-#endif
-
-namespace boost{ namespace math{ namespace tools{
-
-enum parameter_type
-{
-   random_in_range = 0,
-   periodic_in_range = 1,
-   power_series = 2,
-   dummy_param = 0x80
-};
-
-parameter_type operator | (parameter_type a, parameter_type b)
-{
-   return static_cast<parameter_type>((int)a|(int)b);
-}
-parameter_type& operator |= (parameter_type& a, parameter_type b)
-{
-   a = static_cast<parameter_type>(a|b);
-   return a;
-}
-
-//
-// If type == random_in_range then
-// z1 and r2 are the endpoints of the half open range and n1 is the number of points.
-//
-// If type == periodic_in_range then
-// z1 and r2 are the endpoints of the half open range and n1 is the number of points.
-//
-// If type == power_series then
-// n1 and n2 are the endpoints of the exponents (closed range) and z1 is the basis.
-//
-// If type & dummy_param then this data is ignored and not stored in the output, it
-// is passed to the generator function however which can do with it as it sees fit.
-//
-template <class T>
-struct parameter_info
-{
-   parameter_type type;
-   T z1, z2;
-   int n1, n2;
-};
-
-template <class T>
-inline parameter_info<T> make_random_param(T start_range, T end_range, int n_points)
-{
-   parameter_info<T> result = { random_in_range, start_range, end_range, n_points, 0 };
-   return result;
-}
-
-template <class T>
-inline parameter_info<T> make_periodic_param(T start_range, T end_range, int n_points)
-{
-   parameter_info<T> result = { periodic_in_range, start_range, end_range, n_points, 0 };
-   return result;
-}
-
-template <class T>
-inline parameter_info<T> make_power_param(T basis, int start_exponent, int end_exponent)
-{
-   parameter_info<T> result = { power_series, basis, 0, start_exponent, end_exponent };
-   return result;
-}
-
-namespace detail{
-
-template <class Seq, class Item, int N>
-inline void unpack_and_append_tuple(Seq& s,
-                                    const Item& data,
-                                    const boost::integral_constant<int, N>&,
-                                    const boost::false_type&)
-{
-   // termimation condition nothing to do here
-}
-
-template <class Seq, class Item, int N>
-inline void unpack_and_append_tuple(Seq& s,
-                                    const Item& data,
-                                    const boost::integral_constant<int, N>&,
-                                    const boost::true_type&)
-{
-   // extract the N'th element, append, and recurse:
-   typedef typename Seq::value_type value_type;
-   value_type val = boost::math::get<N>(data);
-   s.push_back(val);
-
-   typedef boost::integral_constant<int, N+1> next_value;
-   typedef boost::integral_constant<bool, (boost::math::tuple_size<Item>::value > N+1)> terminate;
-
-   unpack_and_append_tuple(s, data, next_value(), terminate());
-}
-
-template <class Seq, class Item>
-inline void unpack_and_append(Seq& s, const Item& data, const boost::true_type&)
-{
-   s.push_back(data);
-}
-
-template <class Seq, class Item>
-inline void unpack_and_append(Seq& s, const Item& data, const boost::false_type&)
-{
-   // Item had better be a tuple-like type or we've had it!!!!
-   typedef boost::integral_constant<int, 0> next_value;
-   typedef boost::integral_constant<bool, (boost::math::tuple_size<Item>::value > 0)> terminate;
-
-   unpack_and_append_tuple(s, data, next_value(), terminate());
-}
-
-template <class Seq, class Item>
-inline void unpack_and_append(Seq& s, const Item& data)
-{
-   typedef typename Seq::value_type value_type;
-   unpack_and_append(s, data, ::boost::is_convertible<Item, value_type>());
-}
-
-} // detail
-
-template <class T>
-class test_data
-{
-public:
-   typedef std::vector<T> row_type;
-   typedef row_type value_type;
-private:
-   typedef std::set<row_type> container_type;
-public:
-   typedef typename container_type::reference reference;
-   typedef typename container_type::const_reference const_reference;
-   typedef typename container_type::iterator iterator;
-   typedef typename container_type::const_iterator const_iterator;
-   typedef typename container_type::difference_type difference_type;
-   typedef typename container_type::size_type size_type;
-
-   // creation:
-   test_data(){}
-   template <class F>
-   test_data(F func, const parameter_info<T>& arg1)
-   {
-      insert(func, arg1);
-   }
-
-   // insertion:
-   template <class F>
-   test_data& insert(F func, const parameter_info<T>& arg1)
-   {
-      // generate data for single argument functor F
-
-      typedef typename std::set<T>::const_iterator it_type;
-
-      std::set<T> points;
-      create_test_points(points, arg1);
-      it_type a = points.begin();
-      it_type b = points.end();
-      row_type row;
-      while(a != b)
-      {
-         if((arg1.type & dummy_param) == 0)
-            row.push_back(*a);
-         try{
-            // domain_error exceptions from func are swallowed
-            // and this data point is ignored:
-            boost::math::tools::detail::unpack_and_append(row, func(*a));
-            m_data.insert(row);
-         }
-         catch(const std::domain_error&){}
-         row.clear();
-         ++a;
-      }
-      return *this;
-   }
-
-   template <class F>
-   test_data& insert(F func, const parameter_info<T>& arg1, const parameter_info<T>& arg2)
-   {
-      // generate data for 2-argument functor F
-
-      typedef typename std::set<T>::const_iterator it_type;
-
-      std::set<T> points1, points2;
-      create_test_points(points1, arg1);
-      create_test_points(points2, arg2);
-      it_type a = points1.begin();
-      it_type b = points1.end();
-      row_type row;
-      while(a != b)
-      {
-         it_type c = points2.begin();
-         it_type d = points2.end();
-         while(c != d)
-         {
-            if((arg1.type & dummy_param) == 0)
-               row.push_back(*a);
-            if((arg2.type & dummy_param) == 0)
-               row.push_back(*c);
-            try{
-               // domain_error exceptions from func are swallowed
-               // and this data point is ignored:
-               detail::unpack_and_append(row, func(*a, *c));
-               m_data.insert(row);
-            }
-            catch(const std::domain_error&){}
-            row.clear();
-            ++c;
-         }
-         ++a;
-      }
-      return *this;
-   }
-
-   template <class F>
-   test_data& insert(F func, const parameter_info<T>& arg1, const parameter_info<T>& arg2, const parameter_info<T>& arg3)
-   {
-      // generate data for 3-argument functor F
-
-      typedef typename std::set<T>::const_iterator it_type;
-
-      std::set<T> points1, points2, points3;
-      create_test_points(points1, arg1);
-      create_test_points(points2, arg2);
-      create_test_points(points3, arg3);
-      it_type a = points1.begin();
-      it_type b = points1.end();
-      row_type row;
-      while(a != b)
-      {
-         it_type c = points2.begin();
-         it_type d = points2.end();
-         while(c != d)
-         {
-            it_type e = points3.begin();
-            it_type f = points3.end();
-            while(e != f)
-            {
-               if((arg1.type & dummy_param) == 0)
-                  row.push_back(*a);
-               if((arg2.type & dummy_param) == 0)
-                  row.push_back(*c);
-               if((arg3.type & dummy_param) == 0)
-                  row.push_back(*e);
-               try{
-                  // domain_error exceptions from func are swallowed
-                  // and this data point is ignored:
-                  detail::unpack_and_append(row, func(*a, *c, *e));
-                  m_data.insert(row);
-               }
-               catch(const std::domain_error&){}
-               row.clear();
-               ++e;
-            }
-            ++c;
-         }
-         ++a;
-      }
-      return *this;
-   }
-
-   void clear(){ m_data.clear(); }
-
-   // access:
-   iterator begin() { return m_data.begin(); }
-   iterator end() { return m_data.end(); }
-   const_iterator begin()const { return m_data.begin(); }
-   const_iterator end()const { return m_data.end(); }
-   bool operator==(const test_data& d)const{ return m_data == d.m_data; }
-   bool operator!=(const test_data& d)const{ return m_data != d.m_data; }
-   void swap(test_data& other){ m_data.swap(other.m_data); }
-   size_type size()const{ return m_data.size(); }
-   size_type max_size()const{ return m_data.max_size(); }
-   bool empty()const{ return m_data.empty(); }
-
-   bool operator < (const test_data& dat)const{ return m_data < dat.m_data; }
-   bool operator <= (const test_data& dat)const{ return m_data <= dat.m_data; }
-   bool operator > (const test_data& dat)const{ return m_data > dat.m_data; }
-   bool operator >= (const test_data& dat)const{ return m_data >= dat.m_data; }
-
-private:
-   void create_test_points(std::set<T>& points, const parameter_info<T>& arg1);
-   std::set<row_type> m_data;
-
-   static float extern_val;
-   static float truncate_to_float(float const * pf);
-   static float truncate_to_float(float c){ return truncate_to_float(&c); }
-};
-
-//
-// This code exists to bemuse the compiler's optimizer and force a
-// truncation to float-precision only:
-//
-template <class T>
-inline float test_data<T>::truncate_to_float(float const * pf)
-{
-   BOOST_MATH_STD_USING
-   int expon;
-   float f = floor(ldexp(frexp(*pf, &expon), 22));
-   f = ldexp(f, expon - 22);
-   return f;
-
-   //extern_val = *pf;
-   //return *pf;
-}
-
-template <class T>
-float test_data<T>::extern_val = 0;
-
-template <class T>
-void test_data<T>::create_test_points(std::set<T>& points, const parameter_info<T>& arg1)
-{
-   BOOST_MATH_STD_USING
-   //
-   // Generate a set of test points as requested, try and generate points
-   // at only float precision: otherwise when testing float versions of functions
-   // there will be a rounding error in our input values which throws off the results
-   // (Garbage in garbage out etc).
-   //
-   switch(arg1.type & 0x7F)
-   {
-   case random_in_range:
-      {
-         BOOST_ASSERT(arg1.z1 < arg1.z2);
-         BOOST_ASSERT(arg1.n1 > 0);
-         typedef float random_type;
-
-         std::tr1::mt19937 rnd;
-         std::tr1::uniform_real<random_type> ur_a(real_cast<random_type>(arg1.z1), real_cast<random_type>(arg1.z2));
-         std::tr1::variate_generator<std::tr1::mt19937, std::tr1::uniform_real<random_type> > gen(rnd, ur_a);
-
-         for(int i = 0; i < arg1.n1; ++i)
-         {
-            random_type r = gen();
-            points.insert(truncate_to_float(r));
-         }
-     }
-      break;
-   case periodic_in_range:
-      {
-         BOOST_ASSERT(arg1.z1 < arg1.z2);
-         BOOST_ASSERT(arg1.n1 > 0);
-         float interval = real_cast<float>((arg1.z2 - arg1.z1) / arg1.n1);
-         T val = arg1.z1;
-         while(val < arg1.z2)
-         {
-            points.insert(truncate_to_float(real_cast<float>(val)));
-            val += interval;
-         }
-      }
-      break;
-   case power_series:
-      {
-         BOOST_ASSERT(arg1.n1 < arg1.n2);
-
-         typedef float random_type;
-         typedef typename boost::mpl::if_<
-            ::boost::is_floating_point<T>,
-            T, long double>::type power_type;
-
-         std::tr1::mt19937 rnd;
-         std::tr1::uniform_real<random_type> ur_a(1.0, 2.0);
-         std::tr1::variate_generator<std::tr1::mt19937, std::tr1::uniform_real<random_type> > gen(rnd, ur_a);
-
-         for(int power = arg1.n1; power <= arg1.n2; ++power)
-         {
-            random_type r = gen();
-            power_type p = ldexp(static_cast<power_type>(r), power);
-            points.insert(truncate_to_float(real_cast<float>(arg1.z1 + p)));
-         }
-      }
-      break;
-   default:
-      BOOST_ASSERT(0 == "Invalid parameter_info object");
-      // Assert will fail if get here.
-      // Triggers warning 4130) // '==' : logical operation on address of string constant.
-   }
-}
-
-//
-// Prompt a user for information on a parameter range:
-//
-template <class T>
-bool get_user_parameter_info(parameter_info<T>& info, const char* param_name)
-{
-#ifdef BOOST_MSVC
-#  pragma warning(push)
-#  pragma warning(disable: 4127)
-#endif
-   std::string line;
-   do{
-      std::cout << "What kind of distribution do you require for parameter " << param_name << "?\n"
-         "Choices are:\n"
-         "  r     Random values in a half open range\n"
-         "  p     Evenly spaced periodic values in a half open range\n"
-         "  e     Exponential power series at a particular point: a + 2^b for some range of b\n"
-         "[Default=r]";
-
-      std::getline(std::cin, line);
-      boost::algorithm::trim(line);
-
-      if(line == "r")
-      {
-         info.type = random_in_range;
-         break;
-      }
-      else if(line == "p")
-      {
-         info.type = periodic_in_range;
-         break;
-      }
-      else if(line == "e")
-      {
-         info.type = power_series;
-         break;
-      }
-      else if(line == "")
-      {
-         info.type = random_in_range;
-         break;
-      }
-      //
-      // Ooops, not a valid input....
-      //
-      std::cout << "Sorry don't recognise \"" << line << "\" as a valid input\n"
-         "do you want to try again [y/n]?";
-      std::getline(std::cin, line);
-      boost::algorithm::trim(line);
-      if(line == "n")
-         return false;
-      else if(line == "y")
-         continue;
-      std::cout << "Sorry don't recognise that either, giving up...\n\n";
-      return false;
-   }while(true);
-
-   switch(info.type & ~dummy_param)
-   {
-   case random_in_range:
-   case periodic_in_range:
-      // get start and end points of range:
-      do{
-         std::cout << "Data will be in the half open range a <= x < b,\n"
-            "enter value for the start point fo the range [default=0]:";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         if(line == "")
-         {
-            info.z1 = 0;
-            break;
-         }
-         try{
-            info.z1 = boost::lexical_cast<T>(line);
-            break;
-         }
-         catch(const boost::bad_lexical_cast&)
-         {
-            std::cout << "Sorry, that was not valid input, try again [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-      }while(true);
-      do{
-         std::cout << "Enter value for the end point fo the range [default=1]:";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         if(line == "")
-         {
-            info.z2 = 1;
-         }
-         else
-         {
-            try
-            {
-               info.z2 = boost::lexical_cast<T>(line);
-            }
-            catch(const boost::bad_lexical_cast&)
-            {
-               std::cout << "Sorry, that was not valid input, try again [y/n]?";
-               std::getline(std::cin, line);
-               boost::algorithm::trim(line);
-               if(line == "y")
-                  continue;
-               if(line == "n")
-                  return false;
-               std::cout << "Sorry don't recognise that either, giving up...\n\n";
-               return false;
-            }
-         }
-         if(info.z1 >= info.z2)
-         {
-            std::cout << "The end point of the range was <= the start point\n"
-               "try a different value for the endpoint [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-         break;
-      }while(true);
-      do{
-         // get the number of points:
-         std::cout << "How many data points do you want?";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         try{
-            info.n1 = boost::lexical_cast<int>(line);
-            info.n2 = 0;
-            if(info.n1 <= 0)
-            {
-               std::cout << "The number of points should be > 0\n"
-                  "try again [y/n]?";
-               std::getline(std::cin, line);
-               boost::algorithm::trim(line);
-               if(line == "y")
-                  continue;
-               if(line == "n")
-                  return false;
-               std::cout << "Sorry don't recognise that either, giving up...\n\n";
-               return false;
-            }
-            break;
-         }
-         catch(const boost::bad_lexical_cast&)
-         {
-            std::cout << "Sorry, that was not valid input, try again [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-      }while(true);
-      break;
-   case power_series:
-      // get start and end points of range:
-      info.z2 = 0;
-      do{
-         std::cout << "Data will be in the form a + r*2^b\n"
-            "for random value r,\n"
-            "enter value for the point a [default=0]:";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         if(line == "")
-         {
-            info.z1 = 0;
-            break;
-         }
-         try{
-            info.z1 = boost::lexical_cast<T>(line);
-            break;
-         }
-         catch(const boost::bad_lexical_cast&)
-         {
-            std::cout << "Sorry, that was not valid input, try again [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-      }while(true);
-
-      do{
-         std::cout << "Data will be in the form a + r*2^b\n"
-            "for random value r,\n"
-            "enter value for the starting exponent b:";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         try{
-            info.n1 = boost::lexical_cast<int>(line);
-            break;
-         }
-         catch(const boost::bad_lexical_cast&)
-         {
-            std::cout << "Sorry, that was not valid input, try again [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-      }while(true);
-
-      do{
-         std::cout << "Data will be in the form a + r*2^b\n"
-            "for random value r,\n"
-            "enter value for the ending exponent b:";
-         std::getline(std::cin, line);
-         boost::algorithm::trim(line);
-         try{
-            info.n2 = boost::lexical_cast<int>(line);
-            break;
-         }
-         catch(const boost::bad_lexical_cast&)
-         {
-            std::cout << "Sorry, that was not valid input, try again [y/n]?";
-            std::getline(std::cin, line);
-            boost::algorithm::trim(line);
-            if(line == "y")
-               continue;
-            if(line == "n")
-               return false;
-            std::cout << "Sorry don't recognise that either, giving up...\n\n";
-            return false;
-         }
-      }while(true);
-
-      break;
-   default:
-      BOOST_ASSERT(0); // should never get here!!
-   }
-
-   return true;
-#ifdef BOOST_MSVC
-#  pragma warning(pop)
-#endif
-}
-
-template <class charT, class traits, class T>
-inline std::basic_ostream<charT, traits>& write_csv(std::basic_ostream<charT, traits>& os,
-                                             const test_data<T>& data)
-{
-   const charT defarg[] = { ',', ' ', '\0' };
-   return write_csv(os, data, defarg);
-}
-
-template <class charT, class traits, class T>
-std::basic_ostream<charT, traits>& write_csv(std::basic_ostream<charT, traits>& os,
-                                             const test_data<T>& data,
-                                             const charT* separator)
-{
-   typedef typename test_data<T>::const_iterator it_type;
-   typedef typename test_data<T>::value_type value_type;
-   typedef typename value_type::const_iterator value_type_iterator;
-   it_type a, b;
-   a = data.begin();
-   b = data.end();
-   while(a != b)
-   {
-      value_type_iterator x, y;
-      bool sep = false;
-      x = a->begin();
-      y = a->end();
-      while(x != y)
-      {
-         if(sep)
-            os << separator;
-         os << *x;
-         sep = true;
-         ++x;
-      }
-      os << std::endl;
-      ++a;
-   }
-   return os;
-}
-
-template <class T>
-std::ostream& write_code(std::ostream& os,
-                         const test_data<T>& data,
-                         const char* name)
-{
-   typedef typename test_data<T>::const_iterator it_type;
-   typedef typename test_data<T>::value_type value_type;
-   typedef typename value_type::const_iterator value_type_iterator;
-
-   BOOST_ASSERT(os.good());
-
-   it_type a, b;
-   a = data.begin();
-   b = data.end();
-   if(a == b)
-      return os;
-
-   os << "#ifndef SC_\n#  define SC_(x) static_cast<T>(BOOST_JOIN(x, L))\n#endif\n"
-   "   static const boost::array<boost::array<T, "
-   << a->size() << ">, " << data.size() << "> " << name << " = {{\n";
-
-   while(a != b)
-   {
-      if(a != data.begin())
-         os << ", \n";
-
-      value_type_iterator x, y;
-      x = a->begin();
-      y = a->end();
-      os << "      { ";
-      while(x != y)
-      {
-         if(x != a->begin())
-            os << ", ";
-         os << "SC_(" << *x << ")";
-         ++x;
-      }
-      os << " }";
-      ++a;
-   }
-   os << "\n   }};\n//#undef SC_\n\n";
-   return os;
-}
-
-} // namespace tools
-} // namespace math
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-
-#endif // BOOST_MATH_TOOLS_TEST_DATA_HPP
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/adl_move_swap.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,233 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
+// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_ADL_MOVE_SWAP_HPP
+#define BOOST_MOVE_ADL_MOVE_SWAP_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//Based on Boost.Core's swap.
+//Many thanks to Steven Watanabe, Joseph Gauterin and Niels Dekker.
+
+#include <boost/config.hpp>
+#include <cstddef> //for std::size_t
+
+//Try to avoid including <algorithm>, as it's quite big
+#if defined(_MSC_VER) && defined(BOOST_DINKUMWARE_STDLIB)
+   #include <utility>   //Dinkum libraries define std::swap in utility which is lighter than algorithm
+#elif defined(BOOST_GNU_STDLIB)
+   //For non-GCC compilers, where GNUC version is not very reliable, or old GCC versions
+   //use the good old stl_algobase header, which is quite lightweight
+   #if !defined(BOOST_GCC) || ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 3)))
+      #include <bits/stl_algobase.h>
+   #elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)
+      //In GCC 4.3 a tiny stl_move.h was created with swap and move utilities
+      #include <bits/stl_move.h>
+   #else
+      //In GCC 4.4 stl_move.h was renamed to move.h
+      #include <bits/move.h>
+   #endif
+#elif defined(_LIBCPP_VERSION)
+   #include <type_traits>  //The initial import of libc++ defines std::swap and still there
+#elif __cplusplus >= 201103L
+   #include <utility>    //Fallback for C++ >= 2011
+#else
+   #include <algorithm>  //Fallback for C++98/03
+#endif
+
+#include <boost/move/utility_core.hpp> //for boost::move
+
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+namespace boost_move_member_swap {
+
+struct dont_care
+{
+   dont_care(...);
+};
+
+struct private_type
+{
+   static private_type p;
+   private_type const &operator,(int) const;
+};
+
+typedef char yes_type;            
+struct no_type{ char dummy[2]; }; 
+
+template<typename T>
+no_type is_private_type(T const &);
+
+yes_type is_private_type(private_type const &);
+
+template <typename Type>
+class has_member_function_named_swap
+{
+   struct BaseMixin
+   {
+      void swap();
+   };
+
+   struct Base : public Type, public BaseMixin { Base(); };
+   template <typename T, T t> class Helper{};
+
+   template <typename U>
+   static no_type deduce(U*, Helper<void (BaseMixin::*)(), &U::swap>* = 0);
+   static yes_type deduce(...);
+
+   public:
+   static const bool value = sizeof(yes_type) == sizeof(deduce((Base*)(0)));
+};
+
+template<typename Fun, bool HasFunc>
+struct has_member_swap_impl
+{
+   static const bool value = false;
+};
+
+template<typename Fun>
+struct has_member_swap_impl<Fun, true>
+{
+   struct FunWrap : Fun
+   {
+      FunWrap();
+
+      using Fun::swap;
+      private_type swap(dont_care) const;
+   };
+
+   static Fun &declval_fun();
+   static FunWrap declval_wrap();
+
+   static bool const value =
+      sizeof(no_type) == sizeof(is_private_type( (declval_wrap().swap(declval_fun()), 0)) );
+};
+
+template<typename Fun>
+struct has_member_swap : public has_member_swap_impl
+      <Fun, has_member_function_named_swap<Fun>::value>
+{};
+
+}  //namespace boost_move_member_swap
+
+namespace boost_move_adl_swap{
+
+template<class P1, class P2, bool = P1::value>
+struct and_op_impl
+{  static const bool value = false; };
+
+template<class P1, class P2>
+struct and_op_impl<P1, P2, true>
+{  static const bool value = P2::value;   };
+
+template<class P1, class P2>
+struct and_op
+   : and_op_impl<P1, P2>
+{};
+
+//////
+
+template<class P1, class P2, bool = P1::value>
+struct and_op_not_impl
+{  static const bool value = false; };
+
+template<class P1, class P2>
+struct and_op_not_impl<P1, P2, true>
+{  static const bool value = !P2::value;   };
+
+template<class P1, class P2>
+struct and_op_not
+   : and_op_not_impl<P1, P2>
+{};
+
+template<class T>
+void swap_proxy(T& x, T& y, typename boost::move_detail::enable_if_c<!boost::move_detail::has_move_emulation_enabled_impl<T>::value>::type* = 0)
+{
+   //use std::swap if argument dependent lookup fails
+   //Use using directive ("using namespace xxx;") instead as some older compilers
+   //don't do ADL with using declarations ("using ns::func;").
+   using namespace std;
+   swap(x, y);
+}
+
+template<class T>
+void swap_proxy(T& x, T& y
+               , typename boost::move_detail::enable_if< and_op_not_impl<boost::move_detail::has_move_emulation_enabled_impl<T>
+                                                                        , boost_move_member_swap::has_member_swap<T> >
+                                                       >::type* = 0)
+{  T t(::boost::move(x)); x = ::boost::move(y); y = ::boost::move(t);  }
+
+template<class T>
+void swap_proxy(T& x, T& y
+               , typename boost::move_detail::enable_if< and_op_impl< boost::move_detail::has_move_emulation_enabled_impl<T>
+                                                                    , boost_move_member_swap::has_member_swap<T> >
+                                                       >::type* = 0)
+{  x.swap(y);  }
+
+}  //namespace boost_move_adl_swap{
+
+#else
+
+namespace boost_move_adl_swap{
+
+template<class T>
+void swap_proxy(T& x, T& y)
+{
+   using std::swap;
+   swap(x, y);
+}
+
+}  //namespace boost_move_adl_swap{
+
+#endif   //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+namespace boost_move_adl_swap{
+
+template<class T, std::size_t N>
+void swap_proxy(T (& x)[N], T (& y)[N])
+{
+   for (std::size_t i = 0; i < N; ++i){
+      ::boost_move_adl_swap::swap_proxy(x[i], y[i]);
+   }
+}
+
+}  //namespace boost_move_adl_swap {
+
+#endif   //!defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+
+//! Exchanges the values of a and b, using Argument Dependent Lookup (ADL) to select a
+//! specialized swap function if available. If no specialized swap function is available,
+//! std::swap is used.
+//!
+//! <b>Exception</b>: If T uses Boost.Move's move emulation and the compiler has
+//! no rvalue references then:
+//!
+//!   -  If T has a <code>T::swap(T&)</code> member, that member is called.
+//!   -  Otherwise a move-based swap is called, equivalent to: 
+//!      <code>T t(::boost::move(x)); x = ::boost::move(y); y = ::boost::move(t);</code>.
+template<class T>
+void adl_move_swap(T& x, T& y)
+{
+   ::boost_move_adl_swap::swap_proxy(x, y);
+}
+
+}  //namespace boost{
+
+#endif   //#ifndef BOOST_MOVE_ADL_MOVE_SWAP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/default_delete.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,195 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
+#define BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/static_assert.hpp>
+
+#include <cstddef>   //For std::size_t,std::nullptr_t
+
+//!\file
+//! Describes the default deleter (destruction policy) of <tt>unique_ptr</tt>: <tt>default_delete</tt>.
+
+namespace boost{
+namespace move_upd {
+
+namespace bmupmu = ::boost::move_upmu;
+
+////////////////////////////////////////
+////        enable_def_del
+////////////////////////////////////////
+
+//compatible with a pointer type T*:
+//When either Y* is convertible to T*
+//Y is U[N] and T is U cv []
+template<class U, class T>
+struct def_del_compatible_cond
+   : bmupmu::is_convertible<U*, T*>
+{};
+
+template<class U, class T, std::size_t N>
+struct def_del_compatible_cond<U[N], T[]>
+   : def_del_compatible_cond<U[], T[]>
+{};
+
+template<class U, class T, class Type = bmupmu::nat>
+struct enable_def_del
+   : bmupmu::enable_if_c<def_del_compatible_cond<U, T>::value, Type>
+{};
+
+////////////////////////////////////////
+////        enable_defdel_call
+////////////////////////////////////////
+
+//When 2nd is T[N], 1st(*)[N] shall be convertible to T(*)[N]; 
+//When 2nd is T[],  1st(*)[] shall be convertible to T(*)[]; 
+//Otherwise, 1st* shall be convertible to 2nd*.
+
+template<class U, class T, class Type = bmupmu::nat>
+struct enable_defdel_call
+   : public enable_def_del<U, T, Type>
+{};
+
+template<class U, class T, class Type>
+struct enable_defdel_call<U, T[], Type>
+   : public enable_def_del<U[], T[], Type>
+{};
+
+template<class U, class T, class Type, std::size_t N>
+struct enable_defdel_call<U, T[N], Type>
+   : public enable_def_del<U[N], T[N], Type>
+{};
+
+////////////////////////////////////////
+////     Some bool literal zero conversion utilities
+////////////////////////////////////////
+
+struct bool_conversion {int for_bool; int for_arg(); };
+typedef int bool_conversion::* explicit_bool_arg;
+
+#if !defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_CXX11_DECLTYPE)
+   typedef decltype(nullptr) nullptr_type;
+#elif !defined(BOOST_NO_CXX11_NULLPTR)
+   typedef std::nullptr_t nullptr_type;
+#else
+   typedef int (bool_conversion::*nullptr_type)();
+#endif
+
+}  //namespace move_upd {
+
+namespace movelib {
+
+namespace bmupd = boost::move_upd;
+namespace bmupmu = ::boost::move_upmu;
+
+//!The class template <tt>default_delete</tt> serves as the default deleter
+//!(destruction policy) for the class template <tt>unique_ptr</tt>.
+//!
+//! \tparam T The type to be deleted. It may be an incomplete type
+template <class T>
+struct default_delete
+{
+   //! Default constructor.
+   //!
+   BOOST_CONSTEXPR default_delete()
+   //Avoid "defaulted on its first declaration must not have an exception-specification" error for GCC 4.6
+   #if !defined(BOOST_GCC) || (BOOST_GCC < 40600 && BOOST_GCC >= 40700) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   BOOST_NOEXCEPT
+   #endif
+   #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   = default;
+   #else
+   {};
+   #endif
+
+   #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   default_delete(const default_delete&) BOOST_NOEXCEPT = default;
+   default_delete &operator=(const default_delete&) BOOST_NOEXCEPT = default;
+   #else
+   typedef typename bmupmu::remove_extent<T>::type element_type;
+   #endif
+
+   //! <b>Effects</b>: Constructs a default_delete object from another <tt>default_delete<U></tt> object.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - If T is not an array type and U* is implicitly convertible to T*.
+   //!   - If T is an array type and U* is a more CV qualified pointer to remove_extent<T>::type.
+   template <class U>
+   default_delete(const default_delete<U>&
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_def_del<U BOOST_MOVE_I T>::type* =0)
+      ) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+   }
+
+   //! <b>Effects</b>: Constructs a default_delete object from another <tt>default_delete<U></tt> object.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - If T is not an array type and U* is implicitly convertible to T*.
+   //!   - If T is an array type and U* is a more CV qualified pointer to remove_extent<T>::type.
+   template <class U>
+   BOOST_MOVE_DOC1ST(default_delete&, 
+      typename bmupd::enable_def_del<U BOOST_MOVE_I T BOOST_MOVE_I default_delete &>::type)
+      operator=(const default_delete<U>&) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+      return *this;
+   }
+
+   //! <b>Effects</b>: if T is not an array type, calls <tt>delete</tt> on static_cast<T*>(ptr),
+   //!   otherwise calls <tt>delete[]</tt> on static_cast<remove_extent<T>::type*>(ptr).
+   //!
+   //! <b>Remarks</b>: If U is an incomplete type, the program is ill-formed.
+   //!   This operator shall not participate in overload resolution unless:
+   //!      - T is not an array type and U* is convertible to T*, OR
+   //!      - T is an array type, and remove_cv<U>::type is the same type as
+   //!         remove_cv<remove_extent<T>::type>::type and U* is convertible to remove_extent<T>::type*.
+   template <class U>
+   BOOST_MOVE_DOC1ST(void, typename bmupd::enable_defdel_call<U BOOST_MOVE_I T BOOST_MOVE_I void>::type)
+      operator()(U* ptr) const BOOST_NOEXCEPT
+   {
+      //U must be a complete type
+      BOOST_STATIC_ASSERT(sizeof(U) > 0);
+      //If T is not an array type, U derives from T
+      //and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor<default_delete, U>::value ));
+      element_type * const p = static_cast<element_type*>(ptr);
+      bmupmu::is_array<T>::value ? delete [] p : delete p;
+   }
+
+   //! <b>Effects</b>: Same as <tt>(*this)(static_cast<element_type*>(nullptr))</tt>.
+   //!
+   void operator()(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) const BOOST_NOEXCEPT
+   {  BOOST_STATIC_ASSERT(sizeof(element_type) > 0);  }
+};
+
+}  //namespace movelib {
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_DEFAULT_DELETE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/fwd_macros.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,465 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DETAIL_FWD_MACROS_HPP
+#define BOOST_MOVE_DETAIL_FWD_MACROS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/workaround.hpp>
+
+namespace boost {
+namespace move_detail {
+
+template <typename T> struct unvoid { typedef T type; };
+template <> struct unvoid<void> { struct type { }; };
+template <> struct unvoid<const void> { struct type { }; };
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+#if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG)
+
+namespace boost {
+namespace move_detail {
+
+   template<class T>
+   struct mref;
+
+   template<class T>
+   struct mref<T &>
+   {
+      explicit mref(T &t) : t_(t){}
+      T &t_;
+      T & get() {  return t_;   }
+   };
+
+   template<class T>
+   struct mref
+   {
+      explicit mref(T &&t) : t_(t) {}
+      T &t_;
+      T &&get() {  return ::boost::move(t_);   }
+   };
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#endif   //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+#endif   //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+//BOOST_MOVE_REPEATN(MACRO)
+#define BOOST_MOVE_REPEAT0(MACRO)
+#define BOOST_MOVE_REPEAT1(MACRO) MACRO
+#define BOOST_MOVE_REPEAT2(MACRO) BOOST_MOVE_REPEAT1(MACRO), MACRO
+#define BOOST_MOVE_REPEAT3(MACRO) BOOST_MOVE_REPEAT2(MACRO), MACRO
+#define BOOST_MOVE_REPEAT4(MACRO) BOOST_MOVE_REPEAT3(MACRO), MACRO
+#define BOOST_MOVE_REPEAT5(MACRO) BOOST_MOVE_REPEAT4(MACRO), MACRO
+#define BOOST_MOVE_REPEAT6(MACRO) BOOST_MOVE_REPEAT5(MACRO), MACRO
+#define BOOST_MOVE_REPEAT7(MACRO) BOOST_MOVE_REPEAT6(MACRO), MACRO
+#define BOOST_MOVE_REPEAT8(MACRO) BOOST_MOVE_REPEAT7(MACRO), MACRO
+#define BOOST_MOVE_REPEAT9(MACRO) BOOST_MOVE_REPEAT8(MACRO), MACRO
+
+//BOOST_MOVE_FWDN
+#define BOOST_MOVE_FWD0
+#define BOOST_MOVE_FWD1 ::boost::forward<P0>(p0)
+#define BOOST_MOVE_FWD2 BOOST_MOVE_FWD1, ::boost::forward<P1>(p1)
+#define BOOST_MOVE_FWD3 BOOST_MOVE_FWD2, ::boost::forward<P2>(p2)
+#define BOOST_MOVE_FWD4 BOOST_MOVE_FWD3, ::boost::forward<P3>(p3)
+#define BOOST_MOVE_FWD5 BOOST_MOVE_FWD4, ::boost::forward<P4>(p4)
+#define BOOST_MOVE_FWD6 BOOST_MOVE_FWD5, ::boost::forward<P5>(p5)
+#define BOOST_MOVE_FWD7 BOOST_MOVE_FWD6, ::boost::forward<P6>(p6)
+#define BOOST_MOVE_FWD8 BOOST_MOVE_FWD7, ::boost::forward<P7>(p7)
+#define BOOST_MOVE_FWD9 BOOST_MOVE_FWD8, ::boost::forward<P8>(p8)
+
+//BOOST_MOVE_FWDQN
+#define BOOST_MOVE_FWDQ0
+#define BOOST_MOVE_FWDQ1 ::boost::forward<Q0>(q0)
+#define BOOST_MOVE_FWDQ2 BOOST_MOVE_FWDQ1, ::boost::forward<Q1>(q1)
+#define BOOST_MOVE_FWDQ3 BOOST_MOVE_FWDQ2, ::boost::forward<Q2>(q2)
+#define BOOST_MOVE_FWDQ4 BOOST_MOVE_FWDQ3, ::boost::forward<Q3>(q3)
+#define BOOST_MOVE_FWDQ5 BOOST_MOVE_FWDQ4, ::boost::forward<Q4>(q4)
+#define BOOST_MOVE_FWDQ6 BOOST_MOVE_FWDQ5, ::boost::forward<Q5>(q5)
+#define BOOST_MOVE_FWDQ7 BOOST_MOVE_FWDQ6, ::boost::forward<Q6>(q6)
+#define BOOST_MOVE_FWDQ8 BOOST_MOVE_FWDQ7, ::boost::forward<Q7>(q7)
+#define BOOST_MOVE_FWDQ9 BOOST_MOVE_FWDQ8, ::boost::forward<Q8>(q8)
+
+//BOOST_MOVE_ARGN
+#define BOOST_MOVE_ARG0
+#define BOOST_MOVE_ARG1 p0
+#define BOOST_MOVE_ARG2 BOOST_MOVE_ARG1, p1
+#define BOOST_MOVE_ARG3 BOOST_MOVE_ARG2, p2
+#define BOOST_MOVE_ARG4 BOOST_MOVE_ARG3, p3
+#define BOOST_MOVE_ARG5 BOOST_MOVE_ARG4, p4
+#define BOOST_MOVE_ARG6 BOOST_MOVE_ARG5, p5
+#define BOOST_MOVE_ARG7 BOOST_MOVE_ARG6, p6
+#define BOOST_MOVE_ARG8 BOOST_MOVE_ARG7, p7
+#define BOOST_MOVE_ARG9 BOOST_MOVE_ARG8, p8
+
+//BOOST_MOVE_DECLVALN
+#define BOOST_MOVE_DECLVAL0
+#define BOOST_MOVE_DECLVAL1 ::boost::move_detail::declval<P0>()
+#define BOOST_MOVE_DECLVAL2 BOOST_MOVE_DECLVAL1, ::boost::move_detail::declval<P1>()
+#define BOOST_MOVE_DECLVAL3 BOOST_MOVE_DECLVAL2, ::boost::move_detail::declval<P2>()
+#define BOOST_MOVE_DECLVAL4 BOOST_MOVE_DECLVAL3, ::boost::move_detail::declval<P3>()
+#define BOOST_MOVE_DECLVAL5 BOOST_MOVE_DECLVAL4, ::boost::move_detail::declval<P4>()
+#define BOOST_MOVE_DECLVAL6 BOOST_MOVE_DECLVAL5, ::boost::move_detail::declval<P5>()
+#define BOOST_MOVE_DECLVAL7 BOOST_MOVE_DECLVAL6, ::boost::move_detail::declval<P6>()
+#define BOOST_MOVE_DECLVAL8 BOOST_MOVE_DECLVAL7, ::boost::move_detail::declval<P7>()
+#define BOOST_MOVE_DECLVAL9 BOOST_MOVE_DECLVAL8, ::boost::move_detail::declval<P8>()
+
+#ifdef BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+   #define BOOST_MOVE_MREF(T)    ::boost::move_detail::mref<T>
+   #define BOOST_MOVE_MFWD(N)    ::boost::forward<P##N>(this->m_p##N.get())
+#else
+   #define BOOST_MOVE_MREF(T)    BOOST_FWD_REF(T)
+   #define BOOST_MOVE_MFWD(N)    ::boost::forward<P##N>(this->m_p##N)
+#endif
+#define BOOST_MOVE_MITFWD(N)  *this->m_p##N
+#define BOOST_MOVE_MINC(N)    ++this->m_p##N
+
+//BOOST_MOVE_MFWDN
+#define BOOST_MOVE_MFWD0
+#define BOOST_MOVE_MFWD1 BOOST_MOVE_MFWD(0)
+#define BOOST_MOVE_MFWD2 BOOST_MOVE_MFWD1, BOOST_MOVE_MFWD(1)
+#define BOOST_MOVE_MFWD3 BOOST_MOVE_MFWD2, BOOST_MOVE_MFWD(2)
+#define BOOST_MOVE_MFWD4 BOOST_MOVE_MFWD3, BOOST_MOVE_MFWD(3)
+#define BOOST_MOVE_MFWD5 BOOST_MOVE_MFWD4, BOOST_MOVE_MFWD(4)
+#define BOOST_MOVE_MFWD6 BOOST_MOVE_MFWD5, BOOST_MOVE_MFWD(5)
+#define BOOST_MOVE_MFWD7 BOOST_MOVE_MFWD6, BOOST_MOVE_MFWD(6)
+#define BOOST_MOVE_MFWD8 BOOST_MOVE_MFWD7, BOOST_MOVE_MFWD(7)
+#define BOOST_MOVE_MFWD9 BOOST_MOVE_MFWD8, BOOST_MOVE_MFWD(8)
+
+//BOOST_MOVE_MINCN
+#define BOOST_MOVE_MINC0
+#define BOOST_MOVE_MINC1 BOOST_MOVE_MINC(0)
+#define BOOST_MOVE_MINC2 BOOST_MOVE_MINC1, BOOST_MOVE_MINC(1)
+#define BOOST_MOVE_MINC3 BOOST_MOVE_MINC2, BOOST_MOVE_MINC(2)
+#define BOOST_MOVE_MINC4 BOOST_MOVE_MINC3, BOOST_MOVE_MINC(3)
+#define BOOST_MOVE_MINC5 BOOST_MOVE_MINC4, BOOST_MOVE_MINC(4)
+#define BOOST_MOVE_MINC6 BOOST_MOVE_MINC5, BOOST_MOVE_MINC(5)
+#define BOOST_MOVE_MINC7 BOOST_MOVE_MINC6, BOOST_MOVE_MINC(6)
+#define BOOST_MOVE_MINC8 BOOST_MOVE_MINC7, BOOST_MOVE_MINC(7)
+#define BOOST_MOVE_MINC9 BOOST_MOVE_MINC8, BOOST_MOVE_MINC(8)
+
+//BOOST_MOVE_MITFWDN
+#define BOOST_MOVE_MITFWD0
+#define BOOST_MOVE_MITFWD1 BOOST_MOVE_MITFWD(0)
+#define BOOST_MOVE_MITFWD2 BOOST_MOVE_MITFWD1, BOOST_MOVE_MITFWD(1)
+#define BOOST_MOVE_MITFWD3 BOOST_MOVE_MITFWD2, BOOST_MOVE_MITFWD(2)
+#define BOOST_MOVE_MITFWD4 BOOST_MOVE_MITFWD3, BOOST_MOVE_MITFWD(3)
+#define BOOST_MOVE_MITFWD5 BOOST_MOVE_MITFWD4, BOOST_MOVE_MITFWD(4)
+#define BOOST_MOVE_MITFWD6 BOOST_MOVE_MITFWD5, BOOST_MOVE_MITFWD(5)
+#define BOOST_MOVE_MITFWD7 BOOST_MOVE_MITFWD6, BOOST_MOVE_MITFWD(6)
+#define BOOST_MOVE_MITFWD8 BOOST_MOVE_MITFWD7, BOOST_MOVE_MITFWD(7)
+#define BOOST_MOVE_MITFWD9 BOOST_MOVE_MITFWD8, BOOST_MOVE_MITFWD(8)
+
+
+//BOOST_MOVE_FWD_INITN
+#define BOOST_MOVE_FWD_INIT0
+#define BOOST_MOVE_FWD_INIT1 m_p0(::boost::forward<P0>(p0))
+#define BOOST_MOVE_FWD_INIT2 BOOST_MOVE_FWD_INIT1, m_p1(::boost::forward<P1>(p1))
+#define BOOST_MOVE_FWD_INIT3 BOOST_MOVE_FWD_INIT2, m_p2(::boost::forward<P2>(p2))
+#define BOOST_MOVE_FWD_INIT4 BOOST_MOVE_FWD_INIT3, m_p3(::boost::forward<P3>(p3))
+#define BOOST_MOVE_FWD_INIT5 BOOST_MOVE_FWD_INIT4, m_p4(::boost::forward<P4>(p4))
+#define BOOST_MOVE_FWD_INIT6 BOOST_MOVE_FWD_INIT5, m_p5(::boost::forward<P5>(p5))
+#define BOOST_MOVE_FWD_INIT7 BOOST_MOVE_FWD_INIT6, m_p6(::boost::forward<P6>(p6))
+#define BOOST_MOVE_FWD_INIT8 BOOST_MOVE_FWD_INIT7, m_p7(::boost::forward<P7>(p7))
+#define BOOST_MOVE_FWD_INIT9 BOOST_MOVE_FWD_INIT8, m_p8(::boost::forward<P8>(p8))
+
+//BOOST_MOVE_VAL_INITN
+#define BOOST_MOVE_VAL_INIT0
+#define BOOST_MOVE_VAL_INIT1 m_p0(p0)
+#define BOOST_MOVE_VAL_INIT2 BOOST_MOVE_VAL_INIT1, m_p1(p1)
+#define BOOST_MOVE_VAL_INIT3 BOOST_MOVE_VAL_INIT2, m_p2(p2)
+#define BOOST_MOVE_VAL_INIT4 BOOST_MOVE_VAL_INIT3, m_p3(p3)
+#define BOOST_MOVE_VAL_INIT5 BOOST_MOVE_VAL_INIT4, m_p4(p4)
+#define BOOST_MOVE_VAL_INIT6 BOOST_MOVE_VAL_INIT5, m_p5(p5)
+#define BOOST_MOVE_VAL_INIT7 BOOST_MOVE_VAL_INIT6, m_p6(p6)
+#define BOOST_MOVE_VAL_INIT8 BOOST_MOVE_VAL_INIT7, m_p7(p7)
+#define BOOST_MOVE_VAL_INIT9 BOOST_MOVE_VAL_INIT8, m_p8(p8)
+
+//BOOST_MOVE_UREFN
+#define BOOST_MOVE_UREF0
+#define BOOST_MOVE_UREF1 BOOST_FWD_REF(P0) p0
+#define BOOST_MOVE_UREF2 BOOST_MOVE_UREF1, BOOST_FWD_REF(P1) p1
+#define BOOST_MOVE_UREF3 BOOST_MOVE_UREF2, BOOST_FWD_REF(P2) p2
+#define BOOST_MOVE_UREF4 BOOST_MOVE_UREF3, BOOST_FWD_REF(P3) p3
+#define BOOST_MOVE_UREF5 BOOST_MOVE_UREF4, BOOST_FWD_REF(P4) p4
+#define BOOST_MOVE_UREF6 BOOST_MOVE_UREF5, BOOST_FWD_REF(P5) p5
+#define BOOST_MOVE_UREF7 BOOST_MOVE_UREF6, BOOST_FWD_REF(P6) p6
+#define BOOST_MOVE_UREF8 BOOST_MOVE_UREF7, BOOST_FWD_REF(P7) p7
+#define BOOST_MOVE_UREF9 BOOST_MOVE_UREF8, BOOST_FWD_REF(P8) p8
+
+//BOOST_MOVE_VALN
+#define BOOST_MOVE_VAL0
+#define BOOST_MOVE_VAL1 P0 p0
+#define BOOST_MOVE_VAL2 BOOST_MOVE_VAL1, BOOST_FWD_REF(P1) p1
+#define BOOST_MOVE_VAL3 BOOST_MOVE_VAL2, BOOST_FWD_REF(P2) p2
+#define BOOST_MOVE_VAL4 BOOST_MOVE_VAL3, BOOST_FWD_REF(P3) p3
+#define BOOST_MOVE_VAL5 BOOST_MOVE_VAL4, BOOST_FWD_REF(P4) p4
+#define BOOST_MOVE_VAL6 BOOST_MOVE_VAL5, BOOST_FWD_REF(P5) p5
+#define BOOST_MOVE_VAL7 BOOST_MOVE_VAL6, BOOST_FWD_REF(P6) p6
+#define BOOST_MOVE_VAL8 BOOST_MOVE_VAL7, BOOST_FWD_REF(P7) p7
+#define BOOST_MOVE_VAL9 BOOST_MOVE_VAL8, BOOST_FWD_REF(P8) p8
+
+//BOOST_MOVE_UREFQN
+#define BOOST_MOVE_UREFQ0
+#define BOOST_MOVE_UREFQ1 BOOST_FWD_REF(Q0) q0
+#define BOOST_MOVE_UREFQ2 BOOST_MOVE_UREFQ1, BOOST_FWD_REF(Q1) q1
+#define BOOST_MOVE_UREFQ3 BOOST_MOVE_UREFQ2, BOOST_FWD_REF(Q2) q2
+#define BOOST_MOVE_UREFQ4 BOOST_MOVE_UREFQ3, BOOST_FWD_REF(Q3) q3
+#define BOOST_MOVE_UREFQ5 BOOST_MOVE_UREFQ4, BOOST_FWD_REF(Q4) q4
+#define BOOST_MOVE_UREFQ6 BOOST_MOVE_UREFQ5, BOOST_FWD_REF(Q5) q5
+#define BOOST_MOVE_UREFQ7 BOOST_MOVE_UREFQ6, BOOST_FWD_REF(Q6) q6
+#define BOOST_MOVE_UREFQ8 BOOST_MOVE_UREFQ7, BOOST_FWD_REF(Q7) q7
+#define BOOST_MOVE_UREFQ9 BOOST_MOVE_UREFQ8, BOOST_FWD_REF(Q8) q8
+
+//BOOST_MOVE_CREFN
+#define BOOST_MOVE_UNVOIDCREF(T) const typename boost::move_detail::unvoid<T>::type&
+#define BOOST_MOVE_CREF0
+#define BOOST_MOVE_CREF1 BOOST_MOVE_UNVOIDCREF(P0) p0
+#define BOOST_MOVE_CREF2 BOOST_MOVE_CREF1, BOOST_MOVE_UNVOIDCREF(P1) p1
+#define BOOST_MOVE_CREF3 BOOST_MOVE_CREF2, BOOST_MOVE_UNVOIDCREF(P2) p2
+#define BOOST_MOVE_CREF4 BOOST_MOVE_CREF3, BOOST_MOVE_UNVOIDCREF(P3) p3
+#define BOOST_MOVE_CREF5 BOOST_MOVE_CREF4, BOOST_MOVE_UNVOIDCREF(P4) p4
+#define BOOST_MOVE_CREF6 BOOST_MOVE_CREF5, BOOST_MOVE_UNVOIDCREF(P5) p5
+#define BOOST_MOVE_CREF7 BOOST_MOVE_CREF6, BOOST_MOVE_UNVOIDCREF(P6) p6
+#define BOOST_MOVE_CREF8 BOOST_MOVE_CREF7, BOOST_MOVE_UNVOIDCREF(P7) p7
+#define BOOST_MOVE_CREF9 BOOST_MOVE_CREF8, BOOST_MOVE_UNVOIDCREF(P8) p8
+
+//BOOST_MOVE_CLASSN
+#define BOOST_MOVE_CLASS0
+#define BOOST_MOVE_CLASS1 class P0
+#define BOOST_MOVE_CLASS2 BOOST_MOVE_CLASS1, class P1
+#define BOOST_MOVE_CLASS3 BOOST_MOVE_CLASS2, class P2
+#define BOOST_MOVE_CLASS4 BOOST_MOVE_CLASS3, class P3
+#define BOOST_MOVE_CLASS5 BOOST_MOVE_CLASS4, class P4
+#define BOOST_MOVE_CLASS6 BOOST_MOVE_CLASS5, class P5
+#define BOOST_MOVE_CLASS7 BOOST_MOVE_CLASS6, class P6
+#define BOOST_MOVE_CLASS8 BOOST_MOVE_CLASS7, class P7
+#define BOOST_MOVE_CLASS9 BOOST_MOVE_CLASS8, class P8
+
+//BOOST_MOVE_CLASSQN
+#define BOOST_MOVE_CLASSQ0
+#define BOOST_MOVE_CLASSQ1 class Q0
+#define BOOST_MOVE_CLASSQ2 BOOST_MOVE_CLASSQ1, class Q1
+#define BOOST_MOVE_CLASSQ3 BOOST_MOVE_CLASSQ2, class Q2
+#define BOOST_MOVE_CLASSQ4 BOOST_MOVE_CLASSQ3, class Q3
+#define BOOST_MOVE_CLASSQ5 BOOST_MOVE_CLASSQ4, class Q4
+#define BOOST_MOVE_CLASSQ6 BOOST_MOVE_CLASSQ5, class Q5
+#define BOOST_MOVE_CLASSQ7 BOOST_MOVE_CLASSQ6, class Q6
+#define BOOST_MOVE_CLASSQ8 BOOST_MOVE_CLASSQ7, class Q7
+#define BOOST_MOVE_CLASSQ9 BOOST_MOVE_CLASSQ8, class Q8
+
+//BOOST_MOVE_CLASSDFLTN
+#define BOOST_MOVE_CLASSDFLT0
+#define BOOST_MOVE_CLASSDFLT1 class P0 = void
+#define BOOST_MOVE_CLASSDFLT2 BOOST_MOVE_CLASSDFLT1, class P1 = void
+#define BOOST_MOVE_CLASSDFLT3 BOOST_MOVE_CLASSDFLT2, class P2 = void
+#define BOOST_MOVE_CLASSDFLT4 BOOST_MOVE_CLASSDFLT3, class P3 = void
+#define BOOST_MOVE_CLASSDFLT5 BOOST_MOVE_CLASSDFLT4, class P4 = void
+#define BOOST_MOVE_CLASSDFLT6 BOOST_MOVE_CLASSDFLT5, class P5 = void
+#define BOOST_MOVE_CLASSDFLT7 BOOST_MOVE_CLASSDFLT6, class P6 = void
+#define BOOST_MOVE_CLASSDFLT8 BOOST_MOVE_CLASSDFLT7, class P7 = void
+#define BOOST_MOVE_CLASSDFLT9 BOOST_MOVE_CLASSDFLT8, class P8 = void
+
+//BOOST_MOVE_TARGN
+#define BOOST_MOVE_TARG0
+#define BOOST_MOVE_TARG1 P0
+#define BOOST_MOVE_TARG2 BOOST_MOVE_TARG1, P1
+#define BOOST_MOVE_TARG3 BOOST_MOVE_TARG2, P2
+#define BOOST_MOVE_TARG4 BOOST_MOVE_TARG3, P3
+#define BOOST_MOVE_TARG5 BOOST_MOVE_TARG4, P4
+#define BOOST_MOVE_TARG6 BOOST_MOVE_TARG5, P5
+#define BOOST_MOVE_TARG7 BOOST_MOVE_TARG6, P6
+#define BOOST_MOVE_TARG8 BOOST_MOVE_TARG7, P7
+#define BOOST_MOVE_TARG9 BOOST_MOVE_TARG8, P8
+
+//BOOST_MOVE_FWD_TN
+#define BOOST_MOVE_FWD_T0
+#define BOOST_MOVE_FWD_T1 typename ::boost::move_detail::forward_type<P0>::type
+#define BOOST_MOVE_FWD_T2 BOOST_MOVE_FWD_T1, typename ::boost::move_detail::forward_type<P1>::type
+#define BOOST_MOVE_FWD_T3 BOOST_MOVE_FWD_T2, typename ::boost::move_detail::forward_type<P2>::type
+#define BOOST_MOVE_FWD_T4 BOOST_MOVE_FWD_T3, typename ::boost::move_detail::forward_type<P3>::type
+#define BOOST_MOVE_FWD_T5 BOOST_MOVE_FWD_T4, typename ::boost::move_detail::forward_type<P4>::type
+#define BOOST_MOVE_FWD_T6 BOOST_MOVE_FWD_T5, typename ::boost::move_detail::forward_type<P5>::type
+#define BOOST_MOVE_FWD_T7 BOOST_MOVE_FWD_T6, typename ::boost::move_detail::forward_type<P6>::type
+#define BOOST_MOVE_FWD_T8 BOOST_MOVE_FWD_T7, typename ::boost::move_detail::forward_type<P7>::type
+#define BOOST_MOVE_FWD_T9 BOOST_MOVE_FWD_T8, typename ::boost::move_detail::forward_type<P8>::type
+
+//BOOST_MOVE_MREFX
+#define BOOST_MOVE_MREF0
+#define BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P0) m_p0;
+#define BOOST_MOVE_MREF2 BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P1) m_p1;
+#define BOOST_MOVE_MREF3 BOOST_MOVE_MREF2 BOOST_MOVE_MREF(P2) m_p2;
+#define BOOST_MOVE_MREF4 BOOST_MOVE_MREF3 BOOST_MOVE_MREF(P3) m_p3;
+#define BOOST_MOVE_MREF5 BOOST_MOVE_MREF4 BOOST_MOVE_MREF(P4) m_p4;
+#define BOOST_MOVE_MREF6 BOOST_MOVE_MREF5 BOOST_MOVE_MREF(P5) m_p5;
+#define BOOST_MOVE_MREF7 BOOST_MOVE_MREF6 BOOST_MOVE_MREF(P6) m_p6;
+#define BOOST_MOVE_MREF8 BOOST_MOVE_MREF7 BOOST_MOVE_MREF(P7) m_p7;
+#define BOOST_MOVE_MREF9 BOOST_MOVE_MREF8 BOOST_MOVE_MREF(P8) m_p8;
+
+//BOOST_MOVE_MEMBX
+#define BOOST_MOVE_MEMB0
+#define BOOST_MOVE_MEMB1 P0 m_p0;
+#define BOOST_MOVE_MEMB2 BOOST_MOVE_MEMB1 P1 m_p1;
+#define BOOST_MOVE_MEMB3 BOOST_MOVE_MEMB2 P2 m_p2;
+#define BOOST_MOVE_MEMB4 BOOST_MOVE_MEMB3 P3 m_p3;
+#define BOOST_MOVE_MEMB5 BOOST_MOVE_MEMB4 P4 m_p4;
+#define BOOST_MOVE_MEMB6 BOOST_MOVE_MEMB5 P5 m_p5;
+#define BOOST_MOVE_MEMB7 BOOST_MOVE_MEMB6 P6 m_p6;
+#define BOOST_MOVE_MEMB8 BOOST_MOVE_MEMB7 P7 m_p7;
+#define BOOST_MOVE_MEMB9 BOOST_MOVE_MEMB8 P8 m_p8;
+
+//BOOST_MOVE_TMPL_LTN
+#define BOOST_MOVE_TMPL_LT0
+#define BOOST_MOVE_TMPL_LT1 template<
+#define BOOST_MOVE_TMPL_LT2 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT3 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT4 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT5 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT6 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT7 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT8 BOOST_MOVE_TMPL_LT1
+#define BOOST_MOVE_TMPL_LT9 BOOST_MOVE_TMPL_LT1
+
+//BOOST_MOVE_LTN
+#define BOOST_MOVE_LT0
+#define BOOST_MOVE_LT1 <
+#define BOOST_MOVE_LT2 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT3 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT4 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT5 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT6 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT7 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT8 BOOST_MOVE_LT1
+#define BOOST_MOVE_LT9 BOOST_MOVE_LT1
+
+//BOOST_MOVE_GTN
+#define BOOST_MOVE_GT0
+#define BOOST_MOVE_GT1 >
+#define BOOST_MOVE_GT2 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT3 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT4 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT5 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT6 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT7 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT8 BOOST_MOVE_GT1
+#define BOOST_MOVE_GT9 BOOST_MOVE_GT1
+
+//BOOST_MOVE_LPN
+#define BOOST_MOVE_LP0
+#define BOOST_MOVE_LP1 (
+#define BOOST_MOVE_LP2 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP3 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP4 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP5 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP6 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP7 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP8 BOOST_MOVE_LP1
+#define BOOST_MOVE_LP9 BOOST_MOVE_LP1
+
+//BOOST_MOVE_RPN
+#define BOOST_MOVE_RP0
+#define BOOST_MOVE_RP1 )
+#define BOOST_MOVE_RP2 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP3 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP4 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP5 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP6 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP7 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP8 BOOST_MOVE_RP1
+#define BOOST_MOVE_RP9 BOOST_MOVE_RP1
+
+//BOOST_MOVE_IN
+#define BOOST_MOVE_I0
+#define BOOST_MOVE_I1 ,
+#define BOOST_MOVE_I2 BOOST_MOVE_I1
+#define BOOST_MOVE_I3 BOOST_MOVE_I1
+#define BOOST_MOVE_I4 BOOST_MOVE_I1
+#define BOOST_MOVE_I5 BOOST_MOVE_I1
+#define BOOST_MOVE_I6 BOOST_MOVE_I1
+#define BOOST_MOVE_I7 BOOST_MOVE_I1
+#define BOOST_MOVE_I8 BOOST_MOVE_I1
+#define BOOST_MOVE_I9 BOOST_MOVE_I1
+
+//BOOST_MOVE_COLON
+#define BOOST_MOVE_COLON0
+#define BOOST_MOVE_COLON1 :
+#define BOOST_MOVE_COLON2 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON3 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON4 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON5 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON6 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON7 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON8 BOOST_MOVE_COLON1
+#define BOOST_MOVE_COLON9 BOOST_MOVE_COLON1
+
+//BOOST_MOVE_ITERATE_2TON
+#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC)   MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_2TO3(MACROFUNC)   BOOST_MOVE_ITERATE_2TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_2TO4(MACROFUNC)   BOOST_MOVE_ITERATE_2TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_2TO5(MACROFUNC)   BOOST_MOVE_ITERATE_2TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_2TO6(MACROFUNC)   BOOST_MOVE_ITERATE_2TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_2TO7(MACROFUNC)   BOOST_MOVE_ITERATE_2TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_2TO8(MACROFUNC)   BOOST_MOVE_ITERATE_2TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_2TO9(MACROFUNC)   BOOST_MOVE_ITERATE_2TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_1TON
+#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC)   MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_1TO2(MACROFUNC)   BOOST_MOVE_ITERATE_1TO1(MACROFUNC)  MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_1TO3(MACROFUNC)   BOOST_MOVE_ITERATE_1TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_1TO4(MACROFUNC)   BOOST_MOVE_ITERATE_1TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_1TO5(MACROFUNC)   BOOST_MOVE_ITERATE_1TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_1TO6(MACROFUNC)   BOOST_MOVE_ITERATE_1TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_1TO7(MACROFUNC)   BOOST_MOVE_ITERATE_1TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_1TO8(MACROFUNC)   BOOST_MOVE_ITERATE_1TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_1TO9(MACROFUNC)   BOOST_MOVE_ITERATE_1TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_0TON
+#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC)   MACROFUNC(0)
+#define BOOST_MOVE_ITERATE_0TO1(MACROFUNC)   BOOST_MOVE_ITERATE_0TO0(MACROFUNC)  MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_0TO2(MACROFUNC)   BOOST_MOVE_ITERATE_0TO1(MACROFUNC)  MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_0TO3(MACROFUNC)   BOOST_MOVE_ITERATE_0TO2(MACROFUNC)  MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_0TO4(MACROFUNC)   BOOST_MOVE_ITERATE_0TO3(MACROFUNC)  MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_0TO5(MACROFUNC)   BOOST_MOVE_ITERATE_0TO4(MACROFUNC)  MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_0TO6(MACROFUNC)   BOOST_MOVE_ITERATE_0TO5(MACROFUNC)  MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_0TO7(MACROFUNC)   BOOST_MOVE_ITERATE_0TO6(MACROFUNC)  MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_0TO8(MACROFUNC)   BOOST_MOVE_ITERATE_0TO7(MACROFUNC)  MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_0TO9(MACROFUNC)   BOOST_MOVE_ITERATE_0TO8(MACROFUNC)  MACROFUNC(9)
+
+//BOOST_MOVE_ITERATE_NTON
+#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC)   MACROFUNC(0)
+#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC)   MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC)   MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_3TO3(MACROFUNC)   MACROFUNC(3)
+#define BOOST_MOVE_ITERATE_4TO4(MACROFUNC)   MACROFUNC(4)
+#define BOOST_MOVE_ITERATE_5TO5(MACROFUNC)   MACROFUNC(5)
+#define BOOST_MOVE_ITERATE_6TO6(MACROFUNC)   MACROFUNC(6)
+#define BOOST_MOVE_ITERATE_7TO7(MACROFUNC)   MACROFUNC(7)
+#define BOOST_MOVE_ITERATE_8TO8(MACROFUNC)   MACROFUNC(8)
+#define BOOST_MOVE_ITERATE_9TO9(MACROFUNC)   MACROFUNC(9)
+
+//BOOST_MOVE_CAT
+#define BOOST_MOVE_CAT(a, b) BOOST_MOVE_CAT_I(a, b)
+#define BOOST_MOVE_CAT_I(a, b) a ## b
+//#    define BOOST_MOVE_CAT_I(a, b) BOOST_MOVE_CAT_II(~, a ## b)
+//#    define BOOST_MOVE_CAT_II(p, res) res
+
+#endif //#ifndef BOOST_MOVE_DETAIL_FWD_MACROS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/iterator_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,87 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
+#define BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>
+
+#if defined(__clang__) && defined(_LIBCPP_VERSION)
+   #define BOOST_MOVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic push
+   #pragma GCC diagnostic ignored "-Wc++11-extensions"
+   #define BOOST_MOVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+   #define BOOST_MOVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#else
+   #define BOOST_MOVE_STD_NS_BEG namespace std{
+   #define BOOST_MOVE_STD_NS_END }
+#endif
+
+BOOST_MOVE_STD_NS_BEG
+
+struct input_iterator_tag;
+struct forward_iterator_tag;
+struct bidirectional_iterator_tag;
+struct random_access_iterator_tag;
+struct output_iterator_tag;
+
+BOOST_MOVE_STD_NS_END
+
+#ifdef BOOST_MOVE_CLANG_INLINE_STD_NS
+   #pragma GCC diagnostic pop
+   #undef BOOST_MOVE_CLANG_INLINE_STD_NS
+#endif   //BOOST_MOVE_CLANG_INLINE_STD_NS
+
+namespace boost{  namespace movelib{
+
+template<class Iterator>
+struct iterator_traits
+{
+   typedef typename Iterator::difference_type   difference_type;
+   typedef typename Iterator::value_type        value_type;
+   typedef typename Iterator::pointer           pointer;
+   typedef typename Iterator::reference         reference;
+   typedef typename Iterator::iterator_category iterator_category;
+};
+
+template<class T>
+struct iterator_traits<T*>
+{
+   typedef std::ptrdiff_t                    difference_type;
+   typedef T                                 value_type;
+   typedef T*                                pointer;
+   typedef T&                                reference;
+   typedef std::random_access_iterator_tag   iterator_category;
+};
+
+template<class T>
+struct iterator_traits<const T*>
+{
+   typedef std::ptrdiff_t                    difference_type;
+   typedef T                                 value_type;
+   typedef const T*                          pointer;
+   typedef const T&                          reference;
+   typedef std::random_access_iterator_tag   iterator_category;
+};
+
+}} //namespace boost {  namespace movelib{
+
+#endif //#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/meta_utils_core.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,118 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
+#define BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+//Small meta-typetraits to support move
+
+namespace boost {
+namespace move_detail {
+
+//////////////////////////////////////
+//             if_c
+//////////////////////////////////////
+template<bool C, typename T1, typename T2>
+struct if_c
+{
+   typedef T1 type;
+};
+
+template<typename T1, typename T2>
+struct if_c<false,T1,T2>
+{
+   typedef T2 type;
+};
+
+//////////////////////////////////////
+//             if_
+//////////////////////////////////////
+template<typename T1, typename T2, typename T3>
+struct if_ : if_c<0 != T1::value, T2, T3>
+{};
+
+//enable_if_
+template <bool B, class T = void>
+struct enable_if_c
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//          enable_if_c
+//////////////////////////////////////
+template <class T>
+struct enable_if_c<false, T> {};
+
+//////////////////////////////////////
+//           enable_if
+//////////////////////////////////////
+template <class Cond, class T = void>
+struct enable_if : enable_if_c<Cond::value, T> {};
+
+//////////////////////////////////////
+//          disable_if
+//////////////////////////////////////
+template <class Cond, class T = void>
+struct disable_if : enable_if_c<!Cond::value, T> {};
+
+//////////////////////////////////////
+//          integral_constant
+//////////////////////////////////////
+template<class T, T v>
+struct integral_constant
+{
+   static const T value = v;
+   typedef T value_type;
+   typedef integral_constant<T, v> type;
+};
+
+typedef integral_constant<bool, true >  true_type;
+typedef integral_constant<bool, false > false_type;
+
+//////////////////////////////////////
+//             identity
+//////////////////////////////////////
+template <class T>
+struct identity
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             is_same
+//////////////////////////////////////
+template<class T, class U>
+struct is_same
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_same<T, T>
+{
+   static const bool value = true;
+};
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/type_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1003 @@
+//////////////////////////////////////////////////////////////////////////////
+// (C) Copyright John Maddock 2000.
+// (C) Copyright Ion Gaztanaga 2005-2015.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+// The alignment and Type traits implementation comes from
+// John Maddock's TypeTraits library.
+//
+// Some other tricks come from Howard Hinnant's papers and StackOverflow replies
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
+#define BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+
+// move/detail
+#include <boost/move/detail/meta_utils.hpp>
+// other
+#include <boost/assert.hpp>
+#include <boost/static_assert.hpp>
+// std
+#include <cstddef>
+
+//Use of Boost.TypeTraits leads to long preprocessed source code due to
+//MPL dependencies. We'll use intrinsics directly and make or own
+//simplified version of TypeTraits.
+//If someday Boost.TypeTraits dependencies are minimized, we should
+//revisit this file redirecting code to Boost.TypeTraits traits.
+
+//These traits don't care about volatile, reference or other checks
+//made by Boost.TypeTraits because no volatile or reference types
+//can be hold in Boost.Containers. This helps to avoid any Boost.TypeTraits
+//dependency.
+
+// Helper macros for builtin compiler support.
+// If your compiler has builtin support for any of the following
+// traits concepts, then redefine the appropriate macros to pick
+// up on the compiler support:
+//
+// (these should largely ignore cv-qualifiers)
+// BOOST_MOVE_IS_POD(T) should evaluate to true if T is a POD type
+// BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if "T x;" has no effect
+// BOOST_MOVE_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy
+// BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect
+// BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if "T x;" can not throw
+// BOOST_MOVE_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw
+// BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw
+// BOOST_MOVE_IS_ENUM(T) should evaluate to true it t is a union type.
+//
+// The following can also be defined: when detected our implementation is greatly simplified.
+//
+// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.
+
+#if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000)
+    // Metrowerks compiler is acquiring intrinsic type traits support
+    // post version 8.  We hook into the published interface to pick up
+    // user defined specializations as well as compiler intrinsics as
+    // and when they become available:
+#   include <msl_utility>
+#   define BOOST_MOVE_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union<T>::value
+#   define BOOST_MOVE_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment<T>::value
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor<T>::value
+#endif
+
+#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
+         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T)                    (__is_pod(T) && __has_trivial_constructor(T))
+#   define BOOST_MOVE_IS_EMPTY(T)                  __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T)   __has_trivial_constructor(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T)          (__has_trivial_copy(T)|| ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T)        (__has_trivial_assign(T) || ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T)    (__has_trivial_destructor(T) || ::boost::move_detail::is_pod<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T)   (__has_nothrow_constructor(T) || ::boost::move_detail::is_trivially_default_constructible<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T)          (__has_nothrow_copy(T) || ::boost::move_detail::is_trivially_copy_constructible<T>::value)
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T)        (__has_nothrow_assign(T) || ::boost::move_detail::is_trivially_copy_assignable<T>::value)
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   if defined(_MSC_VER) && (_MSC_VER >= 1700)
+#       define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)   (__has_trivial_move_constructor(T) || ::boost::move_detail::is_pod<T>::value)
+#       define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T)        (__has_trivial_move_assign(T) || ::boost::move_detail::is_pod<T>::value)
+#   endif
+#endif
+
+#if defined(BOOST_CLANG) && defined(__has_feature)
+
+#   if __has_feature(is_union)
+#     define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_pod)
+#     define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   endif
+#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_empty)
+#     define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   endif
+#   if __has_feature(has_trivial_constructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_copy)
+#     //There are problems with deleted copy constructors detected as trivially copyable.
+#     //http://stackoverflow.com/questions/12754886/has-trivial-copy-behaves-differently-in-clang-and-gcc-whos-right
+#     define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && ::boost::move_detail::is_copy_constructible<T>::value)
+#   endif
+#   if __has_feature(has_trivial_assign)
+#     define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) )
+#   endif
+#   if __has_feature(has_trivial_destructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   endif
+#   if __has_feature(has_nothrow_constructor)
+#     define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   endif
+#   if __has_feature(has_nothrow_copy)
+#     define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T))
+#   endif
+#   if __has_feature(is_nothrow_copy_assignable)
+#     define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+#   endif
+#   if __has_feature(is_enum)
+#     define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   endif
+#   if __has_feature(has_trivial_move_constructor)
+#     define BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) __has_trivial_move_constructor(T)
+#   endif
+#   if __has_feature(has_trivial_move_assign)
+#     define BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T) __has_trivial_move_assign(T)
+#   endif
+#   define BOOST_MOVE_ALIGNMENT_OF(T) __alignof(T)
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
+
+#ifdef BOOST_INTEL
+#  define BOOST_MOVE_INTEL_TT_OPTS || ::boost::move_detail::is_pod<T>::value
+#else
+#  define BOOST_MOVE_INTEL_TT_OPTS
+#endif
+
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_MOVE_INTEL_TT_OPTS) )
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_MOVE_INTEL_TT_OPTS)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_MOVE_INTEL_TT_OPTS)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_MOVE_INTEL_TT_OPTS))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_MOVE_INTEL_TT_OPTS))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)
+      // GCC sometimes lies about alignment requirements
+      // of type double on 32-bit unix platforms, use the
+      // old implementation instead in that case:
+#     define BOOST_MOVE_ALIGNMENT_OF(T) __alignof__(T)
+#   endif
+#endif
+
+#if defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   define BOOST_MOVE_ALIGNMENT_OF(T) __alignof__(T)
+#endif
+
+# if defined(__CODEGEARC__)
+#   define BOOST_MOVE_IS_UNION(T) __is_union(T)
+#   define BOOST_MOVE_IS_POD(T) __is_pod(T)
+#   define BOOST_MOVE_IS_EMPTY(T) __is_empty(T)
+#   define BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T))
+#   define BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T))
+#   define BOOST_MOVE_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T))
+
+#   define BOOST_MOVE_IS_ENUM(T) __is_enum(T)
+#   define BOOST_MOVE_ALIGNMENT_OF(T) alignof(T)
+
+#endif
+
+//Fallback definitions
+
+#ifdef BOOST_MOVE_IS_UNION
+   #define BOOST_MOVE_IS_UNION_IMPL(T) BOOST_MOVE_IS_UNION(T)
+#else
+   #define BOOST_MOVE_IS_UNION_IMPL(T) false
+#endif
+
+#ifdef BOOST_MOVE_IS_POD
+   #define BOOST_MOVE_IS_POD_IMPL(T) BOOST_MOVE_IS_POD(T)
+#else
+   #define BOOST_MOVE_IS_POD_IMPL(T) \
+      (::boost::move_detail::is_scalar<T>::value || ::boost::move_detail::is_void<T>::value)
+#endif
+
+#ifdef BOOST_MOVE_IS_EMPTY
+   #define BOOST_MOVE_IS_EMPTY_IMPL(T) BOOST_MOVE_IS_EMPTY(T)
+#else
+   #define BOOST_MOVE_IS_EMPTY_IMPL(T)    ::boost::move_detail::is_empty_nonintrinsic<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_COPY(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T)  BOOST_MOVE_HAS_TRIVIAL_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_COPY
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_COPY(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_ASSIGN
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_TRIVIAL_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)  BOOST_MOVE_HAS_TRIVIAL_MOVE_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR
+   #define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T)   BOOST_MOVE_HAS_TRIVIAL_DESTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR
+   #define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T)  BOOST_MOVE_HAS_NOTHROW_CONSTRUCTOR(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T)  ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_COPY
+   #define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_NOTHROW_COPY(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T)   BOOST_MOVE_HAS_NOTHROW_MOVE(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T)   ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_ASSIGN
+   #define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) BOOST_MOVE_HAS_NOTHROW_MOVE_ASSIGN(T)
+#else
+   #define BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T) ::boost::move_detail::is_pod<T>::value
+#endif
+
+#ifdef BOOST_MOVE_IS_ENUM
+   #define BOOST_MOVE_IS_ENUM_IMPL(T)   BOOST_MOVE_IS_ENUM(T)
+#else
+   #define BOOST_MOVE_IS_ENUM_IMPL(T)   ::boost::move_detail::is_enum_nonintrinsic<T>::value
+#endif
+
+namespace boost {
+namespace move_detail {
+
+//////////////////////////
+//    is_reference
+//////////////////////////
+template<class T>
+struct is_reference
+{  static const bool value = false; };
+
+template<class T>
+struct is_reference<T&>
+{  static const bool value = true; };
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template<class T>
+struct is_reference<T&&>
+{  static const bool value = true; };
+#endif
+
+//////////////////////////
+//    is_pointer
+//////////////////////////
+template<class T>
+struct is_pointer
+{  static const bool value = false; };
+
+template<class T>
+struct is_pointer<T*>
+{  static const bool value = true; };
+
+//////////////////////////
+//    add_reference
+//////////////////////////
+template <typename T>
+struct add_reference
+{  typedef T& type;  };
+
+template<class T>
+struct add_reference<T&>
+{  typedef T& type;  };
+
+template<>
+struct add_reference<void>
+{  typedef nat &type;   };
+
+template<>
+struct add_reference<const void>
+{  typedef const nat &type;   };
+
+//////////////////////////
+//    add_const_reference
+//////////////////////////
+template <class T>
+struct add_const_reference
+{  typedef const T &type;   };
+
+template <class T>
+struct add_const_reference<T&>
+{  typedef T& type;   };
+
+//////////////////////////
+//    remove_const
+//////////////////////////
+template<class T>
+struct remove_const
+{  typedef T type;   };
+
+template<class T>
+struct remove_const< const T>
+{  typedef T type;   };
+
+//////////////////////////
+//    remove_cv
+//////////////////////////
+template<typename T> struct remove_cv                    {  typedef T type;   };
+template<typename T> struct remove_cv<const T>           {  typedef T type;   };
+template<typename T> struct remove_cv<const volatile T>  {  typedef T type;   };
+template<typename T> struct remove_cv<volatile T>        {  typedef T type;   };
+
+//////////////////////////
+//    make_unsigned
+//////////////////////////
+template <class T>
+struct make_unsigned_impl                                         {  typedef T type;   };
+template <> struct make_unsigned_impl<signed char>                {  typedef unsigned char  type; };
+template <> struct make_unsigned_impl<signed short>               {  typedef unsigned short type; };
+template <> struct make_unsigned_impl<signed int>                 {  typedef unsigned int   type; };
+template <> struct make_unsigned_impl<signed long>                {  typedef unsigned long  type; };
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct make_unsigned_impl< ::boost::long_long_type >  {  typedef ::boost::ulong_long_type type; };
+#endif
+
+template <class T>
+struct make_unsigned
+   : make_unsigned_impl<typename remove_cv<T>::type>
+{};
+
+//////////////////////////
+//    is_floating_point
+//////////////////////////
+template<class T> struct is_floating_point_cv               {  static const bool value = false; };
+template<>        struct is_floating_point_cv<float>        {  static const bool value = true; };
+template<>        struct is_floating_point_cv<double>       {  static const bool value = true; };
+template<>        struct is_floating_point_cv<long double>  {  static const bool value = true; };
+
+template<class T>
+struct is_floating_point
+   : is_floating_point_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////
+//    is_integral
+//////////////////////////
+template<class T> struct is_integral_cv                    {  static const bool value = false; };
+template<> struct is_integral_cv<                     bool>{  static const bool value = true; };
+template<> struct is_integral_cv<                     char>{  static const bool value = true; };
+template<> struct is_integral_cv<            unsigned char>{  static const bool value = true; };
+template<> struct is_integral_cv<              signed char>{  static const bool value = true; };
+#ifndef BOOST_NO_CXX11_CHAR16_T
+template<> struct is_integral_cv<                 char16_t>{  static const bool value = true; };
+#endif
+#ifndef BOOST_NO_CXX11_CHAR32_T
+template<> struct is_integral_cv<                 char32_t>{  static const bool value = true; };
+#endif
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<> struct is_integral_cv<                  wchar_t>{  static const bool value = true; };
+#endif
+template<> struct is_integral_cv<                    short>{  static const bool value = true; };
+template<> struct is_integral_cv<           unsigned short>{  static const bool value = true; };
+template<> struct is_integral_cv<                      int>{  static const bool value = true; };
+template<> struct is_integral_cv<             unsigned int>{  static const bool value = true; };
+template<> struct is_integral_cv<                     long>{  static const bool value = true; };
+template<> struct is_integral_cv<            unsigned long>{  static const bool value = true; };
+#ifdef BOOST_HAS_LONG_LONG
+template<> struct is_integral_cv< ::boost:: long_long_type>{  static const bool value = true; };
+template<> struct is_integral_cv< ::boost::ulong_long_type>{  static const bool value = true; };
+#endif
+
+template<class T>
+struct is_integral
+   : public is_integral_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          remove_all_extents
+//////////////////////////////////////
+template <class T>
+struct remove_all_extents
+{  typedef T type;};
+
+template <class T>
+struct remove_all_extents<T[]>
+{  typedef typename remove_all_extents<T>::type type; };
+
+template <class T, size_t N>
+struct remove_all_extents<T[N]>
+{  typedef typename remove_all_extents<T>::type type;};
+
+//////////////////////////
+//    is_scalar
+//////////////////////////
+template<class T>
+struct is_scalar
+{  static const bool value = is_integral<T>::value || is_floating_point<T>::value; };
+
+//////////////////////////
+//       is_void
+//////////////////////////
+template<class T>
+struct is_void_cv
+{  static const bool value = false; };
+
+template<>
+struct is_void_cv<void>
+{  static const bool value = true; };
+
+template<class T>
+struct is_void
+   : is_void_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_array
+//////////////////////////////////////
+template<class T>
+struct is_array
+{  static const bool value = false; };
+
+template<class T>
+struct is_array<T[]>
+{  static const bool value = true;  };
+
+template<class T, std::size_t N>
+struct is_array<T[N]>
+{  static const bool value = true;  };
+
+//////////////////////////////////////
+//           is_member_pointer
+//////////////////////////////////////
+template <class T>         struct is_member_pointer_cv         {  static const bool value = false; };
+template <class T, class U>struct is_member_pointer_cv<T U::*> {  static const bool value = true; };
+
+template <class T>
+struct is_member_pointer
+    : is_member_pointer_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_nullptr_t
+//////////////////////////////////////
+template <class T>
+struct is_nullptr_t_cv
+{  static const bool value = false; };
+
+#if !defined(BOOST_NO_CXX11_NULLPTR)
+template <>
+struct is_nullptr_t_cv
+   #if !defined(BOOST_NO_CXX11_DECLTYPE)
+   <decltype(nullptr)>
+   #else
+   <std::nullptr_t>
+   #endif
+{  static const bool value = true; };
+#endif
+
+template <class T>
+struct is_nullptr_t
+   : is_nullptr_t_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//          is_function
+//////////////////////////////////////
+//Inspired by libc++, thanks to Howard Hinnant
+//For a function to pointer an lvalue of function type T can be implicitly converted to a prvalue
+//pointer to that function. This does not apply to non-static member functions because lvalues
+//that refer to non-static member functions do not exist.
+template <class T>
+struct is_reference_convertible_to_pointer
+{
+   struct twochar { char dummy[2]; };
+   template <class U> static char    test(U*);
+   template <class U> static twochar test(...);
+   static T& source();
+   static const bool value = sizeof(char) == sizeof(test<T>(source()));
+};
+//Filter out:
+// - class types that might have implicit conversions
+// - void (to avoid forming a reference to void later)
+// - references (e.g.: filtering reference to functions)
+// - nullptr_t (convertible to pointer)
+template < class T
+         , bool Filter = is_class_or_union<T>::value  ||
+                         is_void<T>::value            ||
+                         is_reference<T>::value       ||
+                         is_nullptr_t<T>::value       >
+struct is_function_impl
+{  static const bool value = is_reference_convertible_to_pointer<T>::value; };
+
+template <class T>
+struct is_function_impl<T, true>
+{  static const bool value = false; };
+
+template <class T>
+struct is_function
+   : is_function_impl<T>
+{};
+
+//////////////////////////////////////
+//       is_union
+//////////////////////////////////////
+template<class T>
+struct is_union_noextents_cv
+{  static const bool value = BOOST_MOVE_IS_UNION_IMPL(T); };
+
+template<class T>
+struct is_union
+   : is_union_noextents_cv<typename remove_cv<typename remove_all_extents<T>::type>::type>
+{};
+
+//////////////////////////////////////
+//             is_class
+//////////////////////////////////////
+template <class T>
+struct is_class
+{
+   static const bool value = is_class_or_union<T>::value && ! is_union<T>::value;
+};
+
+
+//////////////////////////////////////
+//             is_arithmetic
+//////////////////////////////////////
+template <class T>
+struct is_arithmetic
+{
+   static const bool value = is_floating_point<T>::value ||
+                             is_integral<T>::value;
+};
+
+//////////////////////////////////////
+//    is_member_function_pointer
+//////////////////////////////////////
+template <class T>
+struct is_member_function_pointer_cv
+{
+   static const bool value = false;
+};
+
+template <class T, class C>
+struct is_member_function_pointer_cv<T C::*>
+   : is_function<T>
+{};
+
+template <class T>
+struct is_member_function_pointer
+    : is_member_function_pointer_cv<typename remove_cv<T>::type>
+{};
+
+//////////////////////////////////////
+//             is_enum
+//////////////////////////////////////
+#if !defined(BOOST_MOVE_IS_ENUM)
+//Based on (http://howardhinnant.github.io/TypeHiearchy.pdf)
+template <class T>
+struct is_enum_nonintrinsic
+{
+   static const bool value =  !is_arithmetic<T>::value     &&
+                              !is_reference<T>::value      &&
+                              !is_class_or_union<T>::value &&
+                              !is_array<T>::value          &&
+                              !is_void<T>::value           &&
+                              !is_nullptr_t<T>::value      &&
+                              !is_member_pointer<T>::value &&
+                              !is_pointer<T>::value        &&
+                              !is_function<T>::value;
+};
+#endif
+
+template <class T>
+struct is_enum
+{  static const bool value = BOOST_MOVE_IS_ENUM_IMPL(T);  };
+
+//////////////////////////////////////
+//       is_pod
+//////////////////////////////////////
+template<class T>
+struct is_pod_noextents_cv  //for non-c++11 compilers, a safe fallback
+{  static const bool value = BOOST_MOVE_IS_POD_IMPL(T); };
+
+template<class T>
+struct is_pod
+   : is_pod_noextents_cv<typename remove_cv<typename remove_all_extents<T>::type>::type>
+{};
+
+//////////////////////////////////////
+//             is_empty
+//////////////////////////////////////
+#if !defined(BOOST_MOVE_IS_EMPTY)
+
+template <typename T>
+struct empty_helper_t1 : public T
+{
+   empty_helper_t1();  // hh compiler bug workaround
+   int i[256];
+   private:
+
+   empty_helper_t1(const empty_helper_t1&);
+   empty_helper_t1& operator=(const empty_helper_t1&);
+};
+
+struct empty_helper_t2 { int i[256]; };
+
+template <typename T, bool IsClass = is_class<T>::value >
+struct is_empty_nonintrinsic
+{
+   static const bool value = false;
+};
+
+template <typename T>
+struct is_empty_nonintrinsic<T, true>
+{
+   static const bool value = sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2);
+};
+#endif
+
+template <class T>
+struct is_empty
+{  static const bool value = BOOST_MOVE_IS_EMPTY_IMPL(T);  };
+
+//////////////////////////////////////
+//       is_copy_constructible
+//////////////////////////////////////
+template<class T>
+struct is_copy_constructible
+{
+   typedef char yes_type;
+   struct no_type { char dummy[2]; };
+   template<class U> static typename add_reference<U>::type source();
+
+   // Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+   //
+   // error: function *function_name* cannot be referenced -- it is a deleted function
+   // static yes_type test(U&, decltype(U(boost::declval<U&>()))* = 0);
+   //                                                        ^ 
+   // MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+   // https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+   #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_INTEL_CXX_VERSION) &&\
+       !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+      static no_type test(...);
+      #ifdef BOOST_NO_CXX11_DECLTYPE
+         template <class U>
+         static yes_type test(U&, bool_<sizeof(U(source<U>()))>* = 0);
+      #else
+         template <class U>
+         static yes_type test(U&, decltype(U(source<U>()))* = 0);
+      #endif
+   #else
+      template <class U>
+      static no_type test(U&, typename U::boost_move_no_copy_constructor_or_assign* = 0);
+      static yes_type test(...);
+   #endif
+
+   static const bool value = sizeof(test(source<T>())) == sizeof(yes_type);
+};
+
+//////////////////////////////////////
+//       is_trivially_destructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_destructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_DESTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_default_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_default_constructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_copy_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_copy_constructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_move_constructible
+//////////////////////////////////////
+template<class T>
+struct is_trivially_move_constructible
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE(T); };
+
+//////////////////////////////////////
+//       is_trivially_copy_assignable
+//////////////////////////////////////
+template<class T>
+struct is_trivially_copy_assignable
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_COPY_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//       is_trivially_move_assignable
+//////////////////////////////////////
+template<class T>
+struct is_trivially_move_assignable
+{  static const bool value = BOOST_MOVE_IS_TRIVIALLY_MOVE_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//       is_nothrow_default_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_default_constructible
+   : is_pod<T>
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_copy_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_copy_constructible
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_COPY_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_move_constructible
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_move_constructible
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T);  };
+
+//////////////////////////////////////
+//       is_nothrow_copy_assignable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_copy_assignable
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_COPY_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_move_assignable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_move_assignable
+{  static const bool value = BOOST_MOVE_IS_NOTHROW_MOVE_ASSIGNABLE(T);  };
+
+//////////////////////////////////////
+//    is_nothrow_swappable
+//////////////////////////////////////
+template<class T>
+struct is_nothrow_swappable
+{
+   static const bool value = is_empty<T>::value || is_pod<T>::value;
+};
+
+//////////////////////////////////////
+//       alignment_of
+//////////////////////////////////////
+template <typename T>
+struct alignment_of_hack
+{
+   T t1;
+   char c;
+   T t2;
+   alignment_of_hack();
+};
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{  static const std::size_t value = A < S ? A : S; };
+
+template< typename T >
+struct alignment_of_impl
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)
+    // With MSVC both the native __alignof operator
+    // and our own logic gets things wrong from time to time :-(
+    // Using a combination of the two seems to make the most of a bad job:
+   : alignment_logic< sizeof(alignment_of_hack<T>) - 2*sizeof(T), __alignof(T)>
+{};
+#elif !defined(BOOST_MOVE_ALIGNMENT_OF)
+   : alignment_logic< sizeof(alignment_of_hack<T>) - 2*sizeof(T), sizeof(T)>
+{};
+#else
+{  static const std::size_t value = BOOST_MOVE_ALIGNMENT_OF(T);  };
+#endif
+
+template< typename T >
+struct alignment_of
+   : alignment_of_impl<T>
+{};
+
+class alignment_dummy;
+typedef void (*function_ptr)();
+typedef int (alignment_dummy::*member_ptr);
+typedef int (alignment_dummy::*member_function_ptr)();
+struct alignment_struct
+{  long double dummy[4];  };
+
+/////////////////////////////
+//    max_align_t
+/////////////////////////////
+//This is not standard, but should work with all compilers
+union max_align
+{
+   char        char_;
+   short       short_;
+   int         int_;
+   long        long_;
+   #ifdef BOOST_HAS_LONG_LONG
+   ::boost::long_long_type   long_long_;
+   #endif
+   float       float_;
+   double      double_;
+   void *      void_ptr_;
+   long double long_double_[4];
+   alignment_dummy *unknown_class_ptr_;
+   function_ptr function_ptr_;
+   member_function_ptr member_function_ptr_;
+   alignment_struct alignment_struct_;
+};
+
+typedef union max_align max_align_t;
+
+/////////////////////////////
+//    aligned_storage
+/////////////////////////////
+
+#if !defined(BOOST_NO_ALIGNMENT)
+
+template<std::size_t Len, std::size_t Align>
+struct aligned_storage_impl;
+
+#define BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(A)\
+template<std::size_t Len>\
+struct BOOST_ALIGNMENT(A) aligned_storage_impl<Len, A>\
+{\
+   char dummy[Len];\
+   typedef aligned_storage_impl<Len, A> type;\
+};\
+//
+
+//Up to 4K alignment (typical page size)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x1)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x2)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x4)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x8)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x10)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x20)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x40)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x80)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x100)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x200)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x400)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x800)
+BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x1000)
+
+#undef BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT
+
+#else //BOOST_NO_ALIGNMENT
+
+template<class T, size_t Len>
+union aligned_union
+{	
+   T aligner;
+   char dummy[Len];
+};
+
+template<std::size_t Len, std::size_t Align, class T, bool Ok>
+struct aligned_next;
+
+template<std::size_t Len, std::size_t Align, class T>
+struct aligned_next<Len, Align, T, true>
+{
+   BOOST_STATIC_ASSERT((alignment_of<T>::value == Align));
+   typedef aligned_union<T, Len> type;
+};
+
+//End of search defaults to max_align_t
+template<std::size_t Len, std::size_t Align>
+struct aligned_next<Len, Align, max_align_t, false>
+{	typedef aligned_union<max_align_t, Len> type;   };
+
+//Now define a search list through types
+#define BOOST_MOVE_ALIGNED_NEXT_STEP(TYPE, NEXT_TYPE)\
+   template<std::size_t Len, std::size_t Align>\
+   struct aligned_next<Len, Align, TYPE, false>\
+      : aligned_next<Len, Align, NEXT_TYPE, Align == alignment_of<NEXT_TYPE>::value>\
+   {};\
+   //
+   BOOST_MOVE_ALIGNED_NEXT_STEP(long double, max_align_t)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(double, long double)
+   #ifdef BOOST_HAS_LONG_LONG
+      BOOST_MOVE_ALIGNED_NEXT_STEP(::boost::long_long_type, double)
+      BOOST_MOVE_ALIGNED_NEXT_STEP(long, ::boost::long_long_type)
+   #else
+      BOOST_MOVE_ALIGNED_NEXT_STEP(long, double)
+   #endif
+   BOOST_MOVE_ALIGNED_NEXT_STEP(int, long)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(short, int)
+   BOOST_MOVE_ALIGNED_NEXT_STEP(char, short)
+#undef BOOST_MOVE_ALIGNED_NEXT_STEP
+
+template<std::size_t Len, std::size_t Align>
+struct aligned_storage_impl
+   : aligned_next<Len, Align, char, Align == alignment_of<char>::value>
+{};
+
+#endif
+
+template<std::size_t Len, std::size_t Align = alignment_of<max_align_t>::value>
+struct aligned_storage
+{
+   //Sanity checks for input parameters
+   BOOST_STATIC_ASSERT(Align > 0);
+
+   //Sanity checks for output type
+   typedef typename aligned_storage_impl<Len ? Len : 1, Align>::type type;
+   static const std::size_t value = alignment_of<type>::value;
+   BOOST_STATIC_ASSERT(value >= Align);
+   BOOST_STATIC_ASSERT((value % Align) == 0);
+
+   //Just in case someone instantiates aligned_storage
+   //instead of aligned_storage::type (typical error).
+   private:
+   aligned_storage();
+};
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_DETAIL_TYPE_TRAITS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/unique_ptr_meta_utils.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,591 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
+#define BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <cstddef>   //for std::size_t
+
+//Small meta-typetraits to support move
+
+namespace boost {
+
+namespace movelib {
+
+template <class T>
+struct default_delete;
+
+}  //namespace movelib {
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+//Forward declare boost::rv
+template <class T> class rv;
+#endif
+
+namespace move_upmu {
+
+//////////////////////////////////////
+//              nat
+//////////////////////////////////////
+struct nat{};
+
+//////////////////////////////////////
+//            natify
+//////////////////////////////////////
+template <class T> struct natify{};
+
+//////////////////////////////////////
+//             if_c
+//////////////////////////////////////
+template<bool C, typename T1, typename T2>
+struct if_c
+{
+   typedef T1 type;
+};
+
+template<typename T1, typename T2>
+struct if_c<false,T1,T2>
+{
+   typedef T2 type;
+};
+
+//////////////////////////////////////
+//             if_
+//////////////////////////////////////
+template<typename T1, typename T2, typename T3>
+struct if_ : if_c<0 != T1::value, T2, T3>
+{};
+
+//enable_if_
+template <bool B, class T = nat>
+struct enable_if_c
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//          enable_if_c
+//////////////////////////////////////
+template <class T>
+struct enable_if_c<false, T> {};
+
+//////////////////////////////////////
+//           enable_if
+//////////////////////////////////////
+template <class Cond, class T = nat>
+struct enable_if : public enable_if_c<Cond::value, T> {};
+
+//////////////////////////////////////
+//          remove_reference
+//////////////////////////////////////
+template<class T>
+struct remove_reference
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference<T&>
+{
+   typedef T type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<class T>
+struct remove_reference<T&&>
+{
+   typedef T type;
+};
+
+#else
+
+template<class T>
+struct remove_reference< rv<T> >
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< rv<T> &>
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference< const rv<T> &>
+{
+   typedef T type;
+};
+
+
+#endif
+
+//////////////////////////////////////
+//             remove_const
+//////////////////////////////////////
+template< class T >
+struct remove_const
+{
+   typedef T type;
+};
+
+template< class T >
+struct remove_const<const T>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             remove_volatile
+//////////////////////////////////////
+template< class T >
+struct remove_volatile
+{
+   typedef T type;
+};
+
+template< class T >
+struct remove_volatile<volatile T>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             remove_cv
+//////////////////////////////////////
+template< class T >
+struct remove_cv
+{
+    typedef typename remove_volatile
+      <typename remove_const<T>::type>::type type;
+};
+
+//////////////////////////////////////
+//          remove_extent
+//////////////////////////////////////
+template<class T>
+struct remove_extent
+{
+   typedef T type;
+};
+ 
+template<class T>
+struct remove_extent<T[]>
+{
+   typedef T type;
+};
+ 
+template<class T, std::size_t N>
+struct remove_extent<T[N]>
+{
+   typedef T type;
+};
+
+//////////////////////////////////////
+//             extent
+//////////////////////////////////////
+
+template<class T, unsigned N = 0>
+struct extent
+{
+   static const std::size_t value = 0;
+};
+ 
+template<class T>
+struct extent<T[], 0> 
+{
+   static const std::size_t value = 0;
+};
+
+template<class T, unsigned N>
+struct extent<T[], N>
+{
+   static const std::size_t value = extent<T, N-1>::value;
+};
+
+template<class T, std::size_t N>
+struct extent<T[N], 0> 
+{
+   static const std::size_t value = N;
+};
+ 
+template<class T, std::size_t I, unsigned N>
+struct extent<T[I], N>
+{
+   static const std::size_t value = extent<T, N-1>::value;
+};
+
+//////////////////////////////////////
+//      add_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct add_lvalue_reference
+{
+   typedef T& type;
+};
+
+template<class T>
+struct add_lvalue_reference<T&>
+{
+   typedef T& type;
+};
+
+template<>
+struct add_lvalue_reference<void>
+{
+   typedef void type;
+};
+
+template<>
+struct add_lvalue_reference<const void>
+{
+   typedef const void type;
+};
+
+template<>
+struct add_lvalue_reference<volatile void>
+{
+   typedef volatile void type;
+};
+
+template<>
+struct add_lvalue_reference<const volatile void>
+{
+   typedef const volatile void type;
+};
+
+template<class T>
+struct add_const_lvalue_reference
+{
+   typedef typename remove_reference<T>::type   t_unreferenced;
+   typedef const t_unreferenced                 t_unreferenced_const;
+   typedef typename add_lvalue_reference
+      <t_unreferenced_const>::type              type;
+};
+
+//////////////////////////////////////
+//             is_same
+//////////////////////////////////////
+template<class T, class U>
+struct is_same
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_same<T, T>
+{
+   static const bool value = true;
+};
+
+//////////////////////////////////////
+//             is_pointer
+//////////////////////////////////////
+template< class T >
+struct is_pointer
+{
+    static const bool value = false;
+};
+
+template< class T >
+struct is_pointer<T*>
+{
+    static const bool value = true;
+};
+
+//////////////////////////////////////
+//             is_reference
+//////////////////////////////////////
+template< class T >
+struct is_reference
+{
+    static const bool value = false;
+};
+
+template< class T >
+struct is_reference<T&>
+{
+    static const bool value = true;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template< class T >
+struct is_reference<T&&>
+{
+    static const bool value = true;
+};
+
+#endif
+
+//////////////////////////////////////
+//             is_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct is_lvalue_reference
+{
+    static const bool value = false;
+};
+
+template<class T>
+struct is_lvalue_reference<T&>
+{
+    static const bool value = true;
+};
+
+//////////////////////////////////////
+//          is_array
+//////////////////////////////////////
+template<class T>
+struct is_array
+{
+   static const bool value = false;
+};
+ 
+template<class T>
+struct is_array<T[]>
+{
+   static const bool value = true;
+};
+ 
+template<class T, std::size_t N>
+struct is_array<T[N]>
+{
+   static const bool value = true;
+};
+
+//////////////////////////////////////
+//          has_pointer_type
+//////////////////////////////////////
+template <class T>
+struct has_pointer_type
+{
+   struct two { char c[2]; };
+   template <class U> static two test(...);
+   template <class U> static char test(typename U::pointer* = 0);
+   static const bool value = sizeof(test<T>(0)) == 1;
+};
+
+//////////////////////////////////////
+//             pointer_type
+//////////////////////////////////////
+template <class T, class D, bool = has_pointer_type<D>::value>
+struct pointer_type_imp
+{
+    typedef typename D::pointer type;
+};
+
+template <class T, class D>
+struct pointer_type_imp<T, D, false>
+{
+    typedef typename remove_extent<T>::type* type;
+};
+
+template <class T, class D>
+struct pointer_type
+{
+    typedef typename pointer_type_imp
+      <typename remove_extent<T>::type, typename remove_reference<D>::type>::type type;
+};
+
+//////////////////////////////////////
+//           is_convertible
+//////////////////////////////////////
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+//use intrinsic since in MSVC
+//overaligned types can't go through ellipsis
+template <class T, class U>
+struct is_convertible
+{
+   static const bool value = __is_convertible_to(T, U);
+};
+
+#else
+
+template <class T, class U>
+class is_convertible
+{
+   typedef typename add_lvalue_reference<T>::type t_reference;
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static false_t dispatch(...);
+   static true_t  dispatch(U);
+   static t_reference       trigger();
+   public:
+   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
+};
+
+#endif
+
+//////////////////////////////////////
+//       is_unary_function
+//////////////////////////////////////
+#if defined(BOOST_MSVC) || defined(__BORLANDC_)
+#define BOOST_MOVE_TT_DECL __cdecl
+#else
+#define BOOST_MOVE_TT_DECL
+#endif
+
+#if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64) && !defined(_M_ARM) && !defined(UNDER_CE)
+#define BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+#endif
+
+template <typename T>
+struct is_unary_function_impl
+{  static const bool value = false; };
+
+// avoid duplicate definitions of is_unary_function_impl
+#ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R>
+struct is_unary_function_impl<R (*)()>
+{  static const bool value = true;  };
+
+template <typename R>
+struct is_unary_function_impl<R (*)(...)>
+{  static const bool value = true;  };
+
+#else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R>
+struct is_unary_function_impl<R (__stdcall*)()>
+{  static const bool value = true;  };
+
+#ifndef _MANAGED
+
+template <typename R>
+struct is_unary_function_impl<R (__fastcall*)()>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename R>
+struct is_unary_function_impl<R (__cdecl*)()>
+{  static const bool value = true;  };
+
+template <typename R>
+struct is_unary_function_impl<R (__cdecl*)(...)>
+{  static const bool value = true;  };
+
+#endif
+
+// avoid duplicate definitions of is_unary_function_impl
+#ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (*)(T0)>
+{  static const bool value = true;  };
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (*)(T0...)>
+{  static const bool value = true;  };
+
+#else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__stdcall*)(T0)>
+{  static const bool value = true;  };
+
+#ifndef _MANAGED
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__fastcall*)(T0)>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__cdecl*)(T0)>
+{  static const bool value = true;  };
+
+template <typename R, class T0>
+struct is_unary_function_impl<R (__cdecl*)(T0...)>
+{  static const bool value = true;  };
+
+#endif
+
+template <typename T>
+struct is_unary_function_impl<T&>
+{  static const bool value = false; };
+
+template<typename T>
+struct is_unary_function
+{  static const bool value = is_unary_function_impl<T>::value;   };
+
+//////////////////////////////////////
+//       has_virtual_destructor
+//////////////////////////////////////
+#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
+         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(BOOST_CLANG) && defined(__has_feature)
+#  if __has_feature(has_virtual_destructor)
+#     define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#  endif
+#elif defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#elif defined(__CODEGEARC__)
+#  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
+#endif
+
+#ifdef BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR
+   template<class T>
+   struct has_virtual_destructor{   static const bool value = BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T);  };
+#else
+   //If no intrinsic is available you trust the programmer knows what is doing
+   template<class T>
+   struct has_virtual_destructor{   static const bool value = true;  };
+#endif
+
+//////////////////////////////////////
+//       missing_virtual_destructor
+//////////////////////////////////////
+
+template< class T, class U
+        , bool enable =  is_convertible< U*, T*>::value &&
+                        !is_array<T>::value &&
+                        !is_same<typename remove_cv<T>::type, void>::value &&
+                        !is_same<typename remove_cv<U>::type, typename remove_cv<T>::type>::value
+        >
+struct missing_virtual_destructor_default_delete
+{  static const bool value = !has_virtual_destructor<T>::value;  };
+
+template<class T, class U>
+struct missing_virtual_destructor_default_delete<T, U, false>
+{  static const bool value = false;  };
+
+template<class Deleter, class U>
+struct missing_virtual_destructor
+{  static const bool value = false;  };
+
+template<class T, class U>
+struct missing_virtual_destructor< ::boost::movelib::default_delete<T>, U >
+   : missing_virtual_destructor_default_delete<T, U>
+{};
+
+}  //namespace move_upmu {
+}  //namespace boost {
+
+#endif //#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/detail/workaround.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
+#define BOOST_MOVE_DETAIL_WORKAROUND_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#if    !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+   #define BOOST_MOVE_PERFECT_FORWARDING
+#endif
+
+//Macros for documentation purposes. For code, expands to the argument
+#define BOOST_MOVE_IMPDEF(TYPE) TYPE
+#define BOOST_MOVE_SEEDOC(TYPE) TYPE
+#define BOOST_MOVE_DOC0PTR(TYPE) TYPE
+#define BOOST_MOVE_DOC1ST(TYPE1, TYPE2) TYPE2
+#define BOOST_MOVE_I ,
+#define BOOST_MOVE_DOCIGN(T1) T1
+
+#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5) && !defined(__clang__)
+   //Pre-standard rvalue binding rules
+   #define BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+#elif defined(_MSC_VER) && (_MSC_VER == 1600)
+   //Standard rvalue binding rules but with some bugs
+   #define BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
+   #define BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG
+#elif defined(_MSC_VER) && (_MSC_VER == 1700)
+   #define BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG
+#endif
+
+#endif   //#ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/make_unique.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,237 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2006-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
+#define BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/move/unique_ptr.hpp>
+#include <cstddef>   //for std::size_t
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+#  include <boost/move/detail/fwd_macros.hpp>
+#endif
+
+//!\file
+//! Defines "make_unique" functions, which are factories to create instances
+//! of unique_ptr depending on the passed arguments.
+//!
+//! This header can be a bit heavyweight in C++03 compilers due to the use of the
+//! preprocessor library, that's why it's a a separate header from <tt>unique_ptr.hpp</tt>
+ 
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace std {   //no namespace versioning in clang+libc++
+
+struct nothrow_t;
+
+}  //namespace std {
+
+namespace boost{
+namespace move_upmu {
+
+//Compile time switch between
+//single element, unknown bound array
+//and known bound array
+template<class T>
+struct unique_ptr_if
+{
+   typedef ::boost::movelib::unique_ptr<T> t_is_not_array;
+};
+
+template<class T>
+struct unique_ptr_if<T[]>
+{
+   typedef ::boost::movelib::unique_ptr<T[]> t_is_array_of_unknown_bound;
+};
+
+template<class T, std::size_t N>
+struct unique_ptr_if<T[N]>
+{
+   typedef void t_is_array_of_known_bound;
+};
+
+template <int Dummy = 0>
+struct nothrow_holder
+{
+   static std::nothrow_t *pnothrow;   
+};
+
+template <int Dummy>
+std::nothrow_t *nothrow_holder<Dummy>::pnothrow;
+
+}  //namespace move_upmu {
+}  //namespace boost{
+
+#endif   //!defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+namespace movelib {
+
+#if defined(BOOST_MOVE_DOXYGEN_INVOKED) || !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::forward<Args>(args)...))</tt>.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique(BOOST_FWD_REF(Args)... args)
+{  return unique_ptr<T>(new T(::boost::forward<Args>(args)...));  }
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::nothrow)(std::forward<Args>(args)...))</tt>.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_nothrow(BOOST_FWD_REF(Args)... args)
+{  return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T(::boost::forward<Args>(args)...));  }
+
+#else
+   #define BOOST_MOVE_MAKE_UNIQUE_CODE(N)\
+      template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N>\
+      typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array\
+         make_unique( BOOST_MOVE_UREF##N)\
+      {  return unique_ptr<T>( new T( BOOST_MOVE_FWD##N ) );  }\
+      \
+      template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N>\
+      typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array\
+         make_unique_nothrow( BOOST_MOVE_UREF##N)\
+      {  return unique_ptr<T>( new (*boost::move_upmu::nothrow_holder<>::pnothrow)T ( BOOST_MOVE_FWD##N ) );  }\
+      //
+   BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_MAKE_UNIQUE_CODE)
+   #undef BOOST_MOVE_MAKE_UNIQUE_CODE
+
+#endif
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T)</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_definit()
+{
+    return unique_ptr<T>(new T);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is not an array.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new T(std::nothrow)</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_not_array)
+      make_unique_nothrow_definit()
+{
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)T);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new remove_extent_t<T>[n]())</tt> (value initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new U[n]());
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new (std::nothrow)remove_extent_t<T>[n]())</tt> (value initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_nothrow(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow)U[n]());
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new remove_extent_t<T>[n])</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_definit(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new U[n]);
+}
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is an array of 
+//!   unknown bound.
+//!
+//! <b>Returns</b>: <tt>unique_ptr<T>(new (std::nothrow)remove_extent_t<T>[n])</tt> (default initialization)
+template<class T>
+inline BOOST_MOVE_DOC1ST(unique_ptr<T>, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_unknown_bound)
+      make_unique_nothrow_definit(std::size_t n)
+{
+    typedef typename ::boost::move_upmu::remove_extent<T>::type U;
+    return unique_ptr<T>(new (*boost::move_upmu::nothrow_holder<>::pnothrow) U[n]);
+}
+
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_definit(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_nothrow(BOOST_FWD_REF(Args) ...) = delete;
+
+//! <b>Remarks</b>: This function shall not participate in overload resolution unless T is
+//!   an array of known bound.
+template<class T, class... Args>
+inline BOOST_MOVE_DOC1ST(unspecified, 
+   typename ::boost::move_upmu::unique_ptr_if<T>::t_is_array_of_known_bound)
+      make_unique_nothrow_definit(BOOST_FWD_REF(Args) ...) = delete;
+
+#endif
+
+}  //namespace movelib {
+
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_MAKE_UNIQUE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/unique_ptr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,863 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
+#define BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/detail/workaround.hpp>
+#include <boost/move/detail/unique_ptr_meta_utils.hpp>
+#include <boost/move/default_delete.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/move/adl_move_swap.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/assert.hpp>
+
+#include <cstddef>   //For std::nullptr_t and std::size_t
+
+//!\file
+//! Describes the smart pointer unique_ptr, a drop-in replacement for std::unique_ptr,
+//! usable also from C++03 compilers.
+//!
+//! Main differences from std::unique_ptr to avoid heavy dependencies,
+//! specially in C++03 compilers:
+//!   - <tt>operator < </tt> uses pointer <tt>operator < </tt>instead of <tt>std::less<common_type></tt>. 
+//!      This avoids dependencies on <tt>std::common_type</tt> and <tt>std::less</tt>
+//!      (<tt><type_traits>/<functional></tt> headers. In C++03 this avoid pulling Boost.Typeof and other
+//!      cascading dependencies. As in all Boost platforms <tt>operator <</tt> on raw pointers and
+//!      other smart pointers provides strict weak ordering in practice this should not be a problem for users.
+//!   - assignable from literal 0 for compilers without nullptr
+//!   - <tt>unique_ptr<T[]></tt> is constructible and assignable from <tt>unique_ptr<U[]></tt> if
+//!      cv-less T and cv-less U are the same type and T is more CV qualified than U.
+
+namespace boost{
+namespace move_upd {
+
+////////////////////////////////////////////
+//          deleter types
+////////////////////////////////////////////
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T>
+class is_noncopyable
+{
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   template<class U> static false_t dispatch(...);
+   template<class U> static true_t  dispatch(typename U::boost_move_no_copy_constructor_or_assign*);
+   public:
+   static const bool value = sizeof(dispatch<T>(0)) == sizeof(true_t);
+};
+#endif   //defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+template <class D>
+struct deleter_types
+{
+   typedef typename bmupmu::add_lvalue_reference<D>::type            del_ref;
+   typedef typename bmupmu::add_const_lvalue_reference<D>::type      del_cref;
+   #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   typedef typename bmupmu::if_c
+      < bmupmu::is_lvalue_reference<D>::value, D, del_cref >::type   deleter_arg_type1;
+   typedef typename bmupmu::remove_reference<D>::type &&             deleter_arg_type2;
+   #else
+   typedef typename bmupmu::if_c
+      < is_noncopyable<D>::value, bmupmu::nat, del_cref>::type       non_ref_deleter_arg1;
+   typedef typename bmupmu::if_c< bmupmu::is_lvalue_reference<D>::value
+                       , D, non_ref_deleter_arg1 >::type          deleter_arg_type1;
+   typedef ::boost::rv<D> &                                       deleter_arg_type2;
+   #endif
+};
+
+////////////////////////////////////////////
+//          unique_ptr_data
+////////////////////////////////////////////
+template <class P, class D, bool = bmupmu::is_unary_function<D>::value || bmupmu::is_reference<D>::value >
+struct unique_ptr_data
+{
+   typedef typename deleter_types<D>::deleter_arg_type1  deleter_arg_type1;
+   typedef typename deleter_types<D>::del_ref            del_ref;
+   typedef typename deleter_types<D>::del_cref           del_cref;
+
+   unique_ptr_data() BOOST_NOEXCEPT
+      : m_p(), d()
+   {}
+
+   explicit unique_ptr_data(P p) BOOST_NOEXCEPT
+      : m_p(p), d()
+   {}
+
+   unique_ptr_data(P p, deleter_arg_type1 d1) BOOST_NOEXCEPT
+      : m_p(p), d(d1)
+   {}
+
+   template <class U>
+   unique_ptr_data(P p, BOOST_FWD_REF(U) d) BOOST_NOEXCEPT
+      : m_p(p), d(::boost::forward<U>(d))
+   {}
+
+   del_ref deleter()       { return d; }
+   del_cref deleter() const{ return d; }
+
+   P m_p;
+   D d;
+
+   private:
+   unique_ptr_data& operator=(const unique_ptr_data&);
+   unique_ptr_data(const unique_ptr_data&);
+};
+
+template <class P, class D>
+struct unique_ptr_data<P, D, false>
+   : private D
+{
+   typedef typename deleter_types<D>::deleter_arg_type1  deleter_arg_type1;
+   typedef typename deleter_types<D>::del_ref            del_ref;
+   typedef typename deleter_types<D>::del_cref           del_cref;
+
+   unique_ptr_data() BOOST_NOEXCEPT
+      : D(), m_p()
+   {}
+
+   explicit unique_ptr_data(P p) BOOST_NOEXCEPT
+      : D(), m_p(p)
+   {}
+
+   unique_ptr_data(P p, deleter_arg_type1 d1) BOOST_NOEXCEPT
+      : D(d1), m_p(p)
+   {}
+
+   template <class U>
+   unique_ptr_data(P p, BOOST_FWD_REF(U) d) BOOST_NOEXCEPT
+      : D(::boost::forward<U>(d)), m_p(p)
+   {}
+
+   del_ref deleter()        BOOST_NOEXCEPT   {  return static_cast<del_ref>(*this);   }
+   del_cref deleter() const BOOST_NOEXCEPT   {  return static_cast<del_cref>(*this);  }
+
+   P m_p;
+
+   private:
+   unique_ptr_data& operator=(const unique_ptr_data&);
+   unique_ptr_data(const unique_ptr_data&);
+};
+
+////////////////////////////////////////////
+//          is_unique_ptr_convertible
+////////////////////////////////////////////
+
+//Although non-standard, we avoid using pointer_traits
+//to avoid heavy dependencies
+template <typename T>
+struct get_element_type
+{
+   struct DefaultWrap { typedef bmupmu::natify<T> element_type; };
+   template <typename X>   static char test(int, typename X::element_type*);
+   template <typename X>   static int test(...);
+   static const bool value = (1 == sizeof(test<T>(0, 0)));
+   typedef typename bmupmu::if_c<value, T, DefaultWrap>::type::element_type type;
+};
+
+template<class T>
+struct get_element_type<T*>
+{
+   typedef T type;
+};
+
+template<class T>
+struct get_cvelement
+   : bmupmu::remove_cv<typename get_element_type<T>::type>
+{};
+
+template <class P1, class P2>
+struct is_same_cvelement_and_convertible
+{
+   typedef typename bmupmu::remove_reference<P1>::type arg1;
+   typedef typename bmupmu::remove_reference<P2>::type arg2;
+   static const bool same_cvless =
+      bmupmu::is_same<typename get_cvelement<arg1>::type,typename get_cvelement<arg2>::type>::value;
+   static const bool value = same_cvless && bmupmu::is_convertible<arg1, arg2>::value;
+};
+
+template<bool IsArray, class FromPointer, class ThisPointer>
+struct is_unique_ptr_convertible
+   : is_same_cvelement_and_convertible<FromPointer, ThisPointer>
+{};
+
+template<class FromPointer, class ThisPointer>
+struct is_unique_ptr_convertible<false, FromPointer, ThisPointer>
+   : bmupmu::is_convertible<FromPointer, ThisPointer>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_assign
+////////////////////////////////////////
+
+template<class T, class FromPointer, class ThisPointer, class Type = bmupmu::nat>
+struct enable_up_ptr
+   : bmupmu::enable_if_c< is_unique_ptr_convertible
+      < bmupmu::is_array<T>::value, FromPointer, ThisPointer>::value, Type>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_assign
+////////////////////////////////////////
+
+template<class T, class D, class U, class E>
+struct unique_moveconvert_assignable
+{
+   static const bool value = (bmupmu::extent<T>::value == bmupmu::extent<U>::value) && is_unique_ptr_convertible
+      < bmupmu::is_array<T>::value
+      , typename bmupmu::pointer_type<U, E>::type, typename bmupmu::pointer_type<T, D>::type>::value;
+};
+
+template<class T, class D, class U, class E, std::size_t N>
+struct unique_moveconvert_assignable<T[], D, U[N], E>
+   : unique_moveconvert_assignable<T[], D, U[], E>
+{};
+
+template<class T, class D, class U, class E, class Type = bmupmu::nat>
+struct enable_up_moveconv_assign
+   : bmupmu::enable_if_c<unique_moveconvert_assignable<T, D, U, E>::value, Type>
+{};
+
+////////////////////////////////////////
+////     enable_up_moveconv_constr
+////////////////////////////////////////
+
+template<class D, class E, bool IsReference = bmupmu::is_reference<D>::value>
+struct unique_deleter_is_initializable
+   : bmupmu::is_same<D, E>
+{};
+
+template <class T, class U>
+class is_rvalue_convertible
+{
+   #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+   typedef typename bmupmu::remove_reference<T>::type&& t_from;
+   #else
+   typedef typename bmupmu::if_c
+      < ::boost::has_move_emulation_enabled<T>::value && !bmupmu::is_reference<T>::value
+      , ::boost::rv<T>&
+      , typename bmupmu::add_lvalue_reference<T>::type
+      >::type t_from;
+   #endif
+
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static false_t dispatch(...);
+   static true_t  dispatch(U);
+   static t_from trigger();
+   public:
+   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
+};
+
+template<class D, class E>
+struct unique_deleter_is_initializable<D, E, false>
+{
+   #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+   //Clang has some problems with is_rvalue_convertible with non-copyable types
+   //so use intrinsic if available
+   #if defined(BOOST_CLANG)
+      #if __has_feature(is_convertible_to)
+      static const bool value = __is_convertible_to(E, D);
+      #else
+      static const bool value = is_rvalue_convertible<E, D>::value;
+      #endif
+   #else
+   static const bool value = is_rvalue_convertible<E, D>::value;
+   #endif
+
+   #else //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+   //No hope for compilers with move emulation for now. In several compilers is_convertible
+   // leads to errors, so just move the Deleter and see if the conversion works
+   static const bool value = true;  /*is_rvalue_convertible<E, D>::value*/
+   #endif
+};
+
+template<class T, class D, class U, class E, class Type = bmupmu::nat>
+struct enable_up_moveconv_constr
+   : bmupmu::enable_if_c<unique_moveconvert_assignable<T, D, U, E>::value &&
+                      unique_deleter_is_initializable<D, E>::value, Type>
+{};
+
+}  //namespace move_upd {
+
+namespace movelib {
+
+//! A unique pointer is an object that owns another object and
+//! manages that other object through a pointer.
+//! 
+//! More precisely, a unique pointer is an object u that stores a pointer to a second object p and will dispose
+//! of p when u is itself destroyed (e.g., when leaving block scope). In this context, u is said to own p.
+//! 
+//! The mechanism by which u disposes of p is known as p's associated deleter, a function object whose correct
+//! invocation results in p's appropriate disposition (typically its deletion).
+//! 
+//! Let the notation u.p denote the pointer stored by u, and let u.d denote the associated deleter. Upon request,
+//! u can reset (replace) u.p and u.d with another pointer and deleter, but must properly dispose of its owned
+//! object via the associated deleter before such replacement is considered completed.
+//! 
+//! Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of
+//! such a transfer, the following postconditions hold:
+//!   - u2.p is equal to the pre-transfer u.p,
+//!   - u.p is equal to nullptr, and
+//!   - if the pre-transfer u.d maintained state, such state has been transferred to u2.d.
+//! 
+//! As in the case of a reset, u2 must properly dispose of its pre-transfer owned object via the pre-transfer
+//! associated deleter before the ownership transfer is considered complete.
+//! 
+//! Each object of a type U instantiated from the unique_ptr template specified in this subclause has the strict
+//! ownership semantics, specified above, of a unique pointer. In partial satisfaction of these semantics, each
+//! such U is MoveConstructible and MoveAssignable, but is not CopyConstructible nor CopyAssignable.
+//! The template parameter T of unique_ptr may be an incomplete type.
+//! 
+//! The uses of unique_ptr include providing exception safety for dynamically allocated memory, passing
+//! ownership of dynamically allocated memory to a function, and returning dynamically allocated memory from
+//! a function.
+//!
+//! If T is an array type (e.g. unique_ptr<MyType[]>) the interface is slightly altered:
+//!   - Pointers to types derived from T are rejected by the constructors, and by reset.
+//!   - The observers <tt>operator*</tt> and <tt>operator-></tt> are not provided.
+//!   - The indexing observer <tt>operator[]</tt> is provided.
+//!
+//! \tparam T Provides the type of the stored pointer.
+//! \tparam D The deleter type:
+//!   -  The default type for the template parameter D is default_delete. A client-supplied template argument
+//!      D shall be a function object type, lvalue-reference to function, or lvalue-reference to function object type
+//!      for which, given a value d of type D and a value ptr of type unique_ptr<T, D>::pointer, the expression
+//!      d(ptr) is valid and has the effect of disposing of the pointer as appropriate for that deleter.
+//!   -  If the deleter's type D is not a reference type, D shall satisfy the requirements of Destructible.
+//!   -  If the type <tt>remove_reference<D>::type::pointer</tt> exists, it shall satisfy the requirements of NullablePointer.
+template <class T, class D = default_delete<T> >
+class unique_ptr
+{
+   #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   public:
+   unique_ptr(const unique_ptr&) = delete;
+   unique_ptr& operator=(const unique_ptr&) = delete;
+   private:
+   #else
+   BOOST_MOVABLE_BUT_NOT_COPYABLE(unique_ptr)
+
+   typedef bmupmu::pointer_type<T, D >                            pointer_type_obtainer;
+   typedef bmupd::unique_ptr_data
+      <typename pointer_type_obtainer::type, D>                data_type;
+   typedef typename bmupd::deleter_types<D>::deleter_arg_type1 deleter_arg_type1;
+   typedef typename bmupd::deleter_types<D>::deleter_arg_type2 deleter_arg_type2;
+   data_type m_data;
+   #endif
+
+   public:
+   //! If the type <tt>remove_reference<D>::type::pointer</tt> exists, then it shall be a
+   //! synonym for <tt>remove_reference<D>::type::pointer</tt>. Otherwise it shall be a
+   //! synonym for T*.
+   typedef typename BOOST_MOVE_SEEDOC(pointer_type_obtainer::type) pointer;
+   //! If T is an array type, then element_type is equal to T. Otherwise, if T is a type
+   //! in the form U[], element_type is equal to U.
+   typedef typename BOOST_MOVE_SEEDOC(bmupmu::remove_extent<T>::type) element_type;
+   typedef D deleter_type;
+
+   //! <b>Requires</b>: D shall satisfy the requirements of DefaultConstructible, and
+   //!   that construction shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object that owns nothing, value-initializing the
+   //!   stored pointer and the stored deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == nullptr</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter.
+   //!
+   //! <b>Remarks</b>: If this constructor is instantiated with a pointer type or reference type
+   //!   for the template argument D, the program is ill-formed.   
+   BOOST_CONSTEXPR unique_ptr() BOOST_NOEXCEPT
+      : m_data()
+   {
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //! <b>Effects</b>: Same as <tt>unique_ptr()</tt> (default constructor).
+   //! 
+   BOOST_CONSTEXPR unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+      : m_data()
+   {
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //! <b>Requires</b>: D shall satisfy the requirements of DefaultConstructible, and
+   //!   that construction shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr which owns p, initializing the stored pointer 
+   //!   with p and value initializing the stored deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter.
+   //!
+   //! <b>Remarks</b>: If this constructor is instantiated with a pointer type or reference type
+   //!   for the template argument D, the program is ill-formed.
+   //!   This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   explicit unique_ptr(Pointer p
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+                 ) BOOST_NOEXCEPT
+      : m_data(p)
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+      //If this constructor is instantiated with a pointer type or reference type
+      //for the template argument D, the program is ill-formed.
+      BOOST_STATIC_ASSERT(!bmupmu::is_pointer<D>::value);
+      BOOST_STATIC_ASSERT(!bmupmu::is_reference<D>::value);
+   }
+
+   //!The signature of this constructor depends upon whether D is a reference type.
+   //!   - If D is non-reference type A, then the signature is <tt>unique_ptr(pointer p, const A& d)</tt>.
+   //!   - If D is an lvalue-reference type A&, then the signature is <tt>unique_ptr(pointer p, A& d)</tt>.
+   //!   - If D is an lvalue-reference type const A&, then the signature is <tt>unique_ptr(pointer p, const A& d)</tt>.
+   //!
+   //!
+   //! <b>Requires</b>: Either
+   //!   - D is not an lvalue-reference type and d is an lvalue or const rvalue. 
+   //!         D shall satisfy the requirements of CopyConstructible, and the copy constructor of D
+   //!         shall not throw an exception. This unique_ptr will hold a copy of d.
+   //!   - D is an lvalue-reference type and d is an lvalue. the type which D references need not be CopyConstructible nor
+   //!      MoveConstructible. This unique_ptr will hold a D which refers to the lvalue d.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object which owns p, initializing the stored pointer with p and
+   //!   initializing the deleter as described above.
+   //! 
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter. If D is a
+   //!   reference type then <tt>get_deleter()</tt> returns a reference to the lvalue d.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   unique_ptr(Pointer p, BOOST_MOVE_SEEDOC(deleter_arg_type1) d1
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+              ) BOOST_NOEXCEPT
+      : m_data(p, d1)
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+   }
+
+   //! <b>Effects</b>: Same effects as <tt>template<class Pointer> unique_ptr(Pointer p, deleter_arg_type1 d1)</tt>
+   //!   and additionally <tt>get() == nullptr</tt>
+   unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), BOOST_MOVE_SEEDOC(deleter_arg_type1) d1) BOOST_NOEXCEPT
+      : m_data(pointer(), d1)
+   {}
+
+   //! The signature of this constructor depends upon whether D is a reference type.
+   //!   - If D is non-reference type A, then the signature is <tt>unique_ptr(pointer p, A&& d)</tt>.
+   //!   - If D is an lvalue-reference type A&, then the signature is <tt>unique_ptr(pointer p, A&& d)</tt>.
+   //!   - If D is an lvalue-reference type const A&, then the signature is <tt>unique_ptr(pointer p, const A&& d)</tt>.
+   //!
+   //! <b>Requires</b>: Either
+   //!   - D is not an lvalue-reference type and d is a non-const rvalue. D
+   //!      shall satisfy the requirements of MoveConstructible, and the move constructor
+   //!      of D shall not throw an exception. This unique_ptr will hold a value move constructed from d.
+   //!   - D is an lvalue-reference type and d is an rvalue, the program is ill-formed.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr object which owns p, initializing the stored pointer with p and
+   //!   initializing the deleter as described above.
+   //! 
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. <tt>get_deleter()</tt> returns a reference to the stored deleter. If D is a
+   //!   reference type then <tt>get_deleter()</tt> returns a reference to the lvalue d.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   unique_ptr(Pointer p, BOOST_MOVE_SEEDOC(deleter_arg_type2) d2
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer>::type* =0)
+             ) BOOST_NOEXCEPT
+      : m_data(p, ::boost::move(d2))
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+   }
+
+   //! <b>Effects</b>: Same effects as <tt>template<class Pointer> unique_ptr(Pointer p, deleter_arg_type2 d2)</tt>
+   //!   and additionally <tt>get() == nullptr</tt>
+   unique_ptr(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), BOOST_MOVE_SEEDOC(deleter_arg_type2) d2) BOOST_NOEXCEPT
+      : m_data(pointer(), ::boost::move(d2))
+   {}
+
+   //! <b>Requires</b>: If D is not a reference type, D shall satisfy the requirements of MoveConstructible.
+   //! Construction of the deleter from an rvalue of type D shall not throw an exception.
+   //! 
+   //! <b>Effects</b>: Constructs a unique_ptr by transferring ownership from u to *this. If D is a reference type,
+   //! this deleter is copy constructed from u's deleter; otherwise, this deleter is move constructed from u's
+   //! deleter.
+   //! 
+   //! <b>Postconditions</b>: <tt>get()</tt> yields the value u.get() yielded before the construction. <tt>get_deleter()</tt>
+   //! returns a reference to the stored deleter that was constructed from u.get_deleter(). If D is a
+   //! reference type then <tt>get_deleter()</tt> and <tt>u.get_deleter()</tt> both reference the same lvalue deleter.
+   unique_ptr(BOOST_RV_REF(unique_ptr) u) BOOST_NOEXCEPT
+      : m_data(u.release(), ::boost::move_if_not_lvalue_reference<D>(u.get_deleter()))
+   {}
+
+   //! <b>Requires</b>: If E is not a reference type, construction of the deleter from an rvalue of type E shall be
+   //!   well formed and shall not throw an exception. Otherwise, E is a reference type and construction of the
+   //!   deleter from an lvalue of type E shall be well formed and shall not throw an exception.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!   - <tt>unique_ptr<U, E>::pointer</tt> is implicitly convertible to pointer,
+   //!   - U is not an array type, and
+   //!   - either D is a reference type and E is the same type as D, or D is not a reference type and E is
+   //!      implicitly convertible to D.
+   //!
+   //! <b>Effects</b>: Constructs a unique_ptr by transferring ownership from u to *this. If E is a reference type,
+   //!   this deleter is copy constructed from u's deleter; otherwise, this deleter is move constructed from u's deleter.
+   //!
+   //! <b>Postconditions</b>: <tt>get()</tt> yields the value <tt>u.get()</tt> yielded before the construction. <tt>get_deleter()</tt>
+   //!   returns a reference to the stored deleter that was constructed from <tt>u.get_deleter()</tt>.
+   template <class U, class E>
+   unique_ptr( BOOST_RV_REF_BEG unique_ptr<U, E> BOOST_RV_REF_END u
+      BOOST_MOVE_DOCIGN(BOOST_MOVE_I typename bmupd::enable_up_moveconv_constr<T BOOST_MOVE_I D BOOST_MOVE_I U BOOST_MOVE_I E>::type* =0)
+      ) BOOST_NOEXCEPT
+      : m_data(u.release(), ::boost::move_if_not_lvalue_reference<E>(u.get_deleter()))
+   {
+      //If T is not an array type, U derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename unique_ptr<U, E>::pointer>::value ));
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: If <tt>get() == nullpt1r</tt> there are no effects. Otherwise <tt>get_deleter()(get())</tt>.
+   //!
+   //! <b>Note</b>: The use of default_delete requires T to be a complete type
+   ~unique_ptr()
+   {  if(m_data.m_p) m_data.deleter()(m_data.m_p);   }
+
+   //! <b>Requires</b>: If D is not a reference type, D shall satisfy the requirements of MoveAssignable
+   //!   and assignment of the deleter from an rvalue of type D shall not throw an exception. Otherwise, D
+   //!   is a reference type; <tt>remove_reference<D>::type</tt> shall satisfy the CopyAssignable requirements and
+   //!   assignment of the deleter from an lvalue of type D shall not throw an exception.
+   //!
+   //! <b>Effects</b>: Transfers ownership from u to *this as if by calling <tt>reset(u.release())</tt> followed
+   //!   by <tt>get_deleter() = std::forward<D>(u.get_deleter())</tt>.
+   //!
+   //! <b>Returns</b>: *this.
+   unique_ptr& operator=(BOOST_RV_REF(unique_ptr) u) BOOST_NOEXCEPT
+   {
+      this->reset(u.release());
+      m_data.deleter() = ::boost::move_if_not_lvalue_reference<D>(u.get_deleter());
+      return *this;
+   }
+
+   //! <b>Requires</b>: If E is not a reference type, assignment of the deleter from an rvalue of type E shall be
+   //!   well-formed and shall not throw an exception. Otherwise, E is a reference type and assignment of the
+   //!   deleter from an lvalue of type E shall be well-formed and shall not throw an exception.
+   //!
+   //! <b>Remarks</b>: This operator shall not participate in overload resolution unless:
+   //!   - <tt>unique_ptr<U, E>::pointer</tt> is implicitly convertible to pointer and
+   //!   - U is not an array type.
+   //!
+   //! <b>Effects</b>: Transfers ownership from u to *this as if by calling <tt>reset(u.release())</tt> followed by
+   //!   <tt>get_deleter() = std::forward<E>(u.get_deleter())</tt>.
+   //!
+   //! <b>Returns</b>: *this.
+   template <class U, class E>
+   BOOST_MOVE_DOC1ST(unique_ptr&, typename bmupd::enable_up_moveconv_assign
+         <T BOOST_MOVE_I D BOOST_MOVE_I U BOOST_MOVE_I E BOOST_MOVE_I unique_ptr &>::type)
+      operator=(BOOST_RV_REF_BEG unique_ptr<U, E> BOOST_RV_REF_END u) BOOST_NOEXCEPT
+   {
+      this->reset(u.release());
+      m_data.deleter() = ::boost::move_if_not_lvalue_reference<E>(u.get_deleter());
+      return *this;
+   }
+
+   //! <b>Effects</b>: <tt>reset()</tt>.
+   //!
+   //! <b>Postcondition</b>: <tt>get() == nullptr</tt>
+   //!
+   //! <b>Returns</b>: *this.
+   unique_ptr& operator=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+   {  this->reset(); return *this;  }
+
+   //! <b>Requires</b>: <tt>get() != nullptr</tt>.
+   //!
+   //! <b>Returns</b>: <tt>*get()</tt>.
+   //!
+   //! <b>Remarks</b: If T is an array type, the program is ill-formed.
+   BOOST_MOVE_DOC1ST(element_type&, typename bmupmu::add_lvalue_reference<element_type>::type)
+      operator*() const BOOST_NOEXCEPT
+   {
+      BOOST_STATIC_ASSERT((!bmupmu::is_array<T>::value));
+      return *m_data.m_p;
+   }
+
+   //! <b>Requires</b>: i < the number of elements in the array to which the stored pointer points.
+   //!
+   //! <b>Returns</b>: <tt>get()[i]</tt>.
+   //!
+   //! <b>Remarks</b: If T is not an array type, the program is ill-formed.
+   BOOST_MOVE_DOC1ST(element_type&, typename bmupmu::add_lvalue_reference<element_type>::type)
+      operator[](std::size_t i) const BOOST_NOEXCEPT
+   {
+      BOOST_ASSERT( bmupmu::extent<T>::value == 0 || i < bmupmu::extent<T>::value );
+      BOOST_ASSERT(m_data.m_p);
+      return m_data.m_p[i];
+   }
+
+   //! <b>Requires</b>: <tt>get() != nullptr</tt>.
+   //!
+   //! <b>Returns</b>: <tt>get()</tt>.
+   //!
+   //! <b>Note</b>: use typically requires that T be a complete type.
+   //!
+   //! <b>Remarks</b: If T is an array type, the program is ill-formed.
+   pointer operator->() const BOOST_NOEXCEPT
+   {
+      BOOST_STATIC_ASSERT((!bmupmu::is_array<T>::value));
+      BOOST_ASSERT(m_data.m_p);
+      return m_data.m_p;
+   }
+
+   //! <b>Returns</b>: The stored pointer.
+   //!
+   pointer get() const BOOST_NOEXCEPT
+   {  return m_data.m_p;  }
+
+   //! <b>Returns</b>: A reference to the stored deleter.
+   //!
+   BOOST_MOVE_DOC1ST(D&, typename bmupmu::add_lvalue_reference<D>::type)
+      get_deleter() BOOST_NOEXCEPT
+   {  return m_data.deleter();  }   
+
+   //! <b>Returns</b>: A reference to the stored deleter.
+   //!
+   BOOST_MOVE_DOC1ST(const D&, typename bmupmu::add_const_lvalue_reference<D>::type)
+      get_deleter() const BOOST_NOEXCEPT
+   {  return m_data.deleter();  }
+
+   #ifdef BOOST_MOVE_DOXYGEN_INVOKED
+   //! <b>Returns</b>: Returns: get() != nullptr.
+   //!
+   explicit operator bool
+   #else
+   operator bmupd::explicit_bool_arg
+   #endif
+      ()const BOOST_NOEXCEPT
+   {
+      return m_data.m_p
+         ? &bmupd::bool_conversion::for_bool
+         : bmupd::explicit_bool_arg(0);
+   }
+
+   //! <b>Postcondition</b>: <tt>get() == nullptr</tt>.
+   //!
+   //! <b>Returns</b>: The value <tt>get()</tt> had at the start of the call to release.   
+   pointer release() BOOST_NOEXCEPT
+   {
+      const pointer tmp = m_data.m_p;
+      m_data.m_p = pointer();
+      return tmp;
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: assigns p to the stored pointer, and then if the old value of the stored pointer, old_p, was not
+   //!   equal to nullptr, calls <tt>get_deleter()(old_p)</tt>. Note: The order of these operations is significant
+   //!   because the call to <tt>get_deleter()</tt> may destroy *this.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. Note: The postcondition does not hold if the call to <tt>get_deleter()</tt>
+   //!   destroys *this since <tt>this->get()</tt> is no longer a valid expression.
+   //!
+   //! <b>Remarks</b>: This constructor shall not participate in overload resolution unless:
+   //!      - If T is not an array type and Pointer is implicitly convertible to pointer.
+   //!      - If T is an array type and Pointer is a more CV qualified pointer to element_type.
+   template<class Pointer>
+   BOOST_MOVE_DOC1ST(void, typename bmupd::enable_up_ptr<T BOOST_MOVE_I Pointer BOOST_MOVE_I pointer BOOST_MOVE_I void>::type)
+      reset(Pointer p) BOOST_NOEXCEPT
+   {
+      //If T is not an array type, element_type_t<Pointer> derives from T
+      //it uses the default deleter and T has no virtual destructor, then you have a problem
+      BOOST_STATIC_ASSERT(( !::boost::move_upmu::missing_virtual_destructor
+                            <D, typename bmupd::get_element_type<Pointer>::type>::value ));
+      pointer tmp = m_data.m_p;
+      m_data.m_p = p;
+      if(tmp) m_data.deleter()(tmp);
+   }
+
+   //! <b>Requires</b>: The expression <tt>get_deleter()(get())</tt> shall be well formed, shall have well-defined behavior,
+   //!   and shall not throw exceptions.
+   //!
+   //! <b>Effects</b>: assigns nullptr to the stored pointer, and then if the old value of the stored pointer, old_p, was not
+   //!   equal to nullptr, calls <tt>get_deleter()(old_p)</tt>. Note: The order of these operations is significant
+   //!   because the call to <tt>get_deleter()</tt> may destroy *this.
+   //!
+   //! <b>Postconditions</b>: <tt>get() == p</tt>. Note: The postcondition does not hold if the call to <tt>get_deleter()</tt>
+   //!   destroys *this since <tt>this->get()</tt> is no longer a valid expression.
+   void reset() BOOST_NOEXCEPT
+   {  this->reset(pointer());  }
+
+   //! <b>Effects</b>: Same as <tt>reset()</tt>
+   //! 
+   void reset(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+   {  this->reset(); }
+
+   //! <b>Requires</b>: <tt>get_deleter()</tt> shall be swappable and shall not throw an exception under swap.
+   //!
+   //! <b>Effects</b>: Invokes swap on the stored pointers and on the stored deleters of *this and u.
+   void swap(unique_ptr& u) BOOST_NOEXCEPT
+   {
+      ::boost::adl_move_swap(m_data.m_p, u.m_data.m_p);
+      ::boost::adl_move_swap(m_data.deleter(), u.m_data.deleter());
+   }
+};
+
+//! <b>Effects</b>: Calls <tt>x.swap(y)</tt>.
+//!
+template <class T, class D>
+inline void swap(unique_ptr<T, D> &x, unique_ptr<T, D> &y) BOOST_NOEXCEPT
+{  x.swap(y); }
+
+//! <b>Returns</b>: <tt>x.get() == y.get()</tt>.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator==(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() == y.get(); }
+
+//! <b>Returns</b>: <tt>x.get() != y.get()</tt>.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator!=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() != y.get(); }
+
+//! <b>Returns</b>: x.get() < y.get().
+//!
+//! <b>Remarks</b>: This comparison shall induce a
+//!   strict weak ordering betwen pointers.
+template <class T1, class D1, class T2, class D2>
+inline bool operator<(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return x.get() < y.get();  }
+
+//! <b>Returns</b>: !(y < x).
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator<=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return !(y < x);  }
+
+//! <b>Returns</b>: y < x.
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator>(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return y < x;  }
+
+//! <b>Returns</b>:!(x < y).
+//!
+template <class T1, class D1, class T2, class D2>
+inline bool operator>=(const unique_ptr<T1, D1> &x, const unique_ptr<T2, D2> &y)
+{  return !(x < y);  }
+
+//! <b>Returns</b>:!x.
+//!
+template <class T, class D>
+inline bool operator==(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+{  return !x;  }
+
+//! <b>Returns</b>:!x.
+//!
+template <class T, class D>
+inline bool operator==(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x) BOOST_NOEXCEPT
+{  return !x;  }
+
+//! <b>Returns</b>: (bool)x.
+//!
+template <class T, class D>
+inline bool operator!=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type)) BOOST_NOEXCEPT
+{  return !!x;  }
+
+//! <b>Returns</b>: (bool)x.
+//!
+template <class T, class D>
+inline bool operator!=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x) BOOST_NOEXCEPT
+{  return !!x;  }
+
+//! <b>Requires</b>: <tt>operator </tt> shall induce a strict weak ordering on unique_ptr<T, D>::pointer values.
+//!
+//! <b>Returns</b>: Returns <tt>x.get() < pointer()</tt>.
+template <class T, class D>
+inline bool operator<(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return x.get() < typename unique_ptr<T, D>::pointer();  }
+
+//! <b>Requires</b>: <tt>operator </tt> shall induce a strict weak ordering on unique_ptr<T, D>::pointer values.
+//!
+//! <b>Returns</b>: Returns <tt>pointer() < x.get()</tt>.
+template <class T, class D>
+inline bool operator<(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return typename unique_ptr<T, D>::pointer() < x.get();  }
+
+//! <b>Returns</b>: <tt>nullptr < x</tt>.
+//!
+template <class T, class D>
+inline bool operator>(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return x.get() > typename unique_ptr<T, D>::pointer();  }
+
+//! <b>Returns</b>: <tt>x < nullptr</tt>.
+//!
+template <class T, class D>
+inline bool operator>(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return typename unique_ptr<T, D>::pointer() > x.get();  }
+
+//! <b>Returns</b>: <tt>!(nullptr < x)</tt>.
+//!
+template <class T, class D>
+inline bool operator<=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return !(bmupd::nullptr_type() < x);  }
+
+//! <b>Returns</b>: <tt>!(x < nullptr)</tt>.
+//!
+template <class T, class D>
+inline bool operator<=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return !(x < bmupd::nullptr_type());  }
+
+//! <b>Returns</b>: <tt>!(x < nullptr)</tt>.
+//!
+template <class T, class D>
+inline bool operator>=(const unique_ptr<T, D> &x, BOOST_MOVE_DOC0PTR(bmupd::nullptr_type))
+{  return !(x < bmupd::nullptr_type());  }
+
+//! <b>Returns</b>: <tt>!(nullptr < x)</tt>.
+//!
+template <class T, class D>
+inline bool operator>=(BOOST_MOVE_DOC0PTR(bmupd::nullptr_type), const unique_ptr<T, D> &x)
+{  return !(bmupd::nullptr_type() < x);  }
+
+}  //namespace movelib {
+}  //namespace boost{
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_MOVE_UNIQUE_PTR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/move/utility_core.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,295 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+//! This header defines core utilities to ease the development
+//! of move-aware functions. This header minimizes dependencies
+//! from other libraries.
+
+#ifndef BOOST_MOVE_MOVE_UTILITY_CORE_HPP
+#define BOOST_MOVE_MOVE_UTILITY_CORE_HPP
+
+#ifndef BOOST_CONFIG_HPP
+#  include <boost/config.hpp>
+#endif
+#
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+#  pragma once
+#endif
+
+#include <boost/move/detail/config_begin.hpp>
+#include <boost/move/core.hpp>
+#include <boost/move/detail/meta_utils.hpp>
+#include <boost/static_assert.hpp>
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   namespace boost {
+
+   template<class T>
+   struct enable_move_utility_emulation
+   {
+      static const bool value = true;
+   };
+    
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            move()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && !has_move_emulation_enabled<T>::value, T&>::type
+         move(T& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value, rv<T>&>::type
+         move(T& x) BOOST_NOEXCEPT
+   {
+      return *static_cast<rv<T>* >(::boost::move_detail::addressof(x));
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && has_move_emulation_enabled<T>::value, rv<T>&>::type
+         move(rv<T>& x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                            forward()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && ::boost::move_detail::is_rv<T>::value, T &>::type
+         forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return const_cast<T&>(x);
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value && !::boost::move_detail::is_rv<T>::value, const T &>::type
+      forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   //////////////////////////////////////////////////////////////////////////////
+   //
+   //                        move_if_not_lvalue_reference()
+   //
+   //////////////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value &&
+        ::boost::move_detail::is_rv<T>::value
+      , T &>::type
+         move_if_not_lvalue_reference(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
+   {
+      return const_cast<T&>(x);
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value &&
+        !::boost::move_detail::is_rv<T>::value  &&
+        (::boost::move_detail::is_lvalue_reference<T>::value ||
+         !has_move_emulation_enabled<T>::value)
+      , typename ::boost::move_detail::add_lvalue_reference<T>::type
+      >::type
+         move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type &x) BOOST_NOEXCEPT
+   {
+      return x;
+   }
+
+   template <class T>
+   inline typename ::boost::move_detail::enable_if_c
+      < enable_move_utility_emulation<T>::value &&
+        !::boost::move_detail::is_rv<T>::value  &&
+        (!::boost::move_detail::is_lvalue_reference<T>::value &&
+         has_move_emulation_enabled<T>::value)
+      , rv<T>&
+      >::type
+         move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type &x) BOOST_NOEXCEPT
+   {
+      return move(x);
+   }
+
+   }  //namespace boost
+
+#else    //#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+   #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+      #include <utility>
+
+      namespace boost{
+
+      using ::std::move;
+      using ::std::forward;
+
+      }  //namespace boost
+
+   #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
+
+      namespace boost {
+
+      //! This trait's internal boolean `value` is false in compilers with rvalue references
+      //! and true in compilers without rvalue references.
+      //!
+      //! A user can specialize this trait for a type T to false to SFINAE out `move` and `forward`
+      //! so that the user can define a different move emulation for that type in namespace boost
+      //! (e.g. another Boost library for its types) and avoid any overload ambiguity.
+      template<class T>
+      struct enable_move_utility_emulation
+      {
+         static const bool value = false;
+      };
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                                  move
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         //! This function provides a way to convert a reference into a rvalue reference
+         //! in compilers with rvalue references. For other compilers if `T` is Boost.Move
+         //! enabled type then it converts `T&` into <tt>::boost::rv<T> &</tt> so that
+         //! move emulation is activated, else it returns `T &`.
+         template <class T>
+         rvalue_reference move(input_reference) noexcept;
+
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+         template <class T>
+         inline typename ::boost::move_detail::remove_reference<T>::type && move(T&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+
+         template <class T>
+         inline typename ::boost::move_detail::remove_reference<T>::type && move(T&& t) BOOST_NOEXCEPT
+         { return static_cast<typename ::boost::move_detail::remove_reference<T>::type &&>(t); }
+
+      #endif   //BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                                  forward
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         //! This function provides limited form of forwarding that is usually enough for
+         //! in-place construction and avoids the exponential overloading for
+         //! achieve the limited forwarding in C++03.
+         //!
+         //! For compilers with rvalue references this function provides perfect forwarding.
+         //!
+         //! Otherwise:
+         //! * If input_reference binds to const ::boost::rv<T> & then it output_reference is
+         //!   ::boost::rv<T> &
+         //!
+         //! * Else, output_reference is equal to input_reference.
+         template <class T> output_reference forward(input_reference) noexcept;
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::identity<T>::type&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //Old move
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::remove_reference<T>::type& t) BOOST_NOEXCEPT
+         {  return static_cast<T&&>(t);   }
+
+         template <class T>
+         inline T&& forward(typename ::boost::move_detail::remove_reference<T>::type&& t) BOOST_NOEXCEPT
+         {
+            //"boost::forward<T> error: 'T' is a lvalue reference, can't forward as rvalue.";
+            BOOST_STATIC_ASSERT(!boost::move_detail::is_lvalue_reference<T>::value);
+            return static_cast<T&&>(t);
+         }
+
+      #endif   //BOOST_MOVE_DOXYGEN_INVOKED
+
+      //////////////////////////////////////////////////////////////////////////////
+      //
+      //                         move_if_not_lvalue_reference
+      //
+      //////////////////////////////////////////////////////////////////////////////
+
+
+      #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+         template <class T> output_reference move_if_not_lvalue_reference(input_reference) noexcept;
+      #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
+
+         //Old move approach, lvalues could bind to rvalue references
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::identity<T>::type&& t) BOOST_NOEXCEPT
+         {  return t;   }
+
+      #else //Old move
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type& t) BOOST_NOEXCEPT
+         {  return static_cast<T&&>(t);   }
+
+         template <class T>
+         inline T&& move_if_not_lvalue_reference(typename ::boost::move_detail::remove_reference<T>::type&& t) BOOST_NOEXCEPT
+         {
+            //"boost::forward<T> error: 'T' is a lvalue reference, can't forward as rvalue.";
+            BOOST_STATIC_ASSERT(!boost::move_detail::is_lvalue_reference<T>::value);
+            return static_cast<T&&>(t);
+         }
+
+      #endif   //BOOST_MOVE_DOXYGEN_INVOKED
+
+      }  //namespace boost {
+
+   #endif   //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
+
+#endif   //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost{
+namespace move_detail{
+
+template <typename T>
+typename boost::move_detail::add_rvalue_reference<T>::type declval();
+
+}  //namespace move_detail{
+}  //namespace boost{
+
+#endif   //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+
+#include <boost/move/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_MOVE_MOVE_UTILITY_CORE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/mpl/aux_/config/gpu.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+
+#ifndef BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
+#define BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
+
+// Copyright Eric Niebler 2014
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_MPL_CFG_GPU_ENABLED) \
+
+#   define BOOST_MPL_CFG_GPU_ENABLED BOOST_GPU_ENABLED
+
+#endif
+
+#if defined __CUDACC__
+
+#    define BOOST_MPL_CFG_GPU 1
+
+#else
+
+#    define BOOST_MPL_CFG_GPU 0
+
+#endif
+
+#endif // BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multi_index/detail/cons_stdtuple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,93 @@
+/* Copyright 2003-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/multi_index for library home page.
+ */
+
+#ifndef BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP
+#define BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/mpl/if.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <tuple>
+
+namespace boost{
+
+namespace multi_index{
+
+namespace detail{
+
+/* std::tuple wrapper providing the cons-based interface of boost::tuple for
+ * composite_key interoperability.
+ */
+
+template<typename StdTuple,std::size_t N>
+struct cons_stdtuple;
+
+struct cons_stdtuple_ctor_terminal
+{
+  typedef boost::tuples::null_type result_type;
+
+  template<typename StdTuple>
+  static result_type create(const StdTuple&)
+  {
+    return boost::tuples::null_type();
+  }
+};
+
+template<typename StdTuple,std::size_t N>
+struct cons_stdtuple_ctor_normal
+{
+  typedef cons_stdtuple<StdTuple,N> result_type;
+
+  static result_type create(const StdTuple& t)
+  {
+    return result_type(t);
+  }
+};
+
+template<typename StdTuple,std::size_t N=0>
+struct cons_stdtuple_ctor:
+  boost::mpl::if_c<
+    N<std::tuple_size<StdTuple>::value,
+    cons_stdtuple_ctor_normal<StdTuple,N>,
+    cons_stdtuple_ctor_terminal
+  >::type
+{};
+
+template<typename StdTuple,std::size_t N>
+struct cons_stdtuple
+{
+  typedef typename std::tuple_element<N,StdTuple>::type head_type;
+  typedef cons_stdtuple_ctor<StdTuple,N+1>              tail_ctor;
+  typedef typename tail_ctor::result_type               tail_type;
+  
+  cons_stdtuple(const StdTuple& t_):t(t_){}
+
+  const head_type& get_head()const{return std::get<N>(t);}
+  tail_type get_tail()const{return tail_ctor::create(t);}
+    
+  const StdTuple& t;
+};
+
+template<typename StdTuple>
+typename cons_stdtuple_ctor<StdTuple>::result_type
+make_cons_stdtuple(const StdTuple& t)
+{
+  return cons_stdtuple_ctor<StdTuple>::create(t);
+}
+
+} /* namespace multi_index::detail */
+
+} /* namespace multi_index */
+
+} /* namespace boost */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multi_index/detail/is_transparent.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,135 @@
+/* Copyright 2003-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/multi_index for library home page.
+ */
+
+#ifndef BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
+#define BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+namespace boost{
+
+namespace multi_index{
+
+namespace detail{
+
+/* Metafunction that checks if f(arg,arg2) executes without argument type
+ * conversion. By default (i.e. when it cannot be determined) it evaluates to
+ * true.
+ */
+
+template<typename F,typename Arg1,typename Arg2,typename=void>
+struct is_transparent:mpl::true_{};
+
+} /* namespace multi_index::detail */
+
+} /* namespace multi_index */
+
+} /* namespace boost */
+
+#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_SFINAE_EXPR)&& \
+    !defined(BOOST_NO_CXX11_DECLTYPE)&& \
+    (defined(BOOST_NO_CXX11_FINAL)||defined(BOOST_IS_FINAL))
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/function_traits.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_final.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost{
+
+namespace multi_index{
+
+namespace detail{
+
+struct not_is_transparent_result_type{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct is_transparent_class_helper:F
+{
+  using F::operator();
+  template<typename T,typename Q>
+  not_is_transparent_result_type operator()(const T&,const Q&)const;
+};
+
+template<typename F,typename Arg1,typename Arg2,typename=void>
+struct is_transparent_class:mpl::true_{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct is_transparent_class<
+  F,Arg1,Arg2,
+  typename enable_if<
+    is_same<
+      decltype(
+        declval<const is_transparent_class_helper<F,Arg1,Arg2> >()(
+          declval<const Arg1&>(),declval<const Arg2&>())
+      ),
+      not_is_transparent_result_type
+    >
+  >::type
+>:mpl::false_{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct is_transparent<
+  F,Arg1,Arg2,
+  typename enable_if<
+    mpl::and_<
+      is_class<F>,
+      mpl::not_<is_final<F> > /* is_transparent_class_helper derives from F */
+    >
+  >::type
+>:is_transparent_class<F,Arg1,Arg2>{};
+
+template<typename F,typename Arg1,typename Arg2,typename=void>
+struct is_transparent_function:mpl::true_{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct is_transparent_function<
+  F,Arg1,Arg2,
+  typename enable_if<
+    mpl::or_<
+      mpl::not_<mpl::or_<
+        is_same<typename function_traits<F>::arg1_type,const Arg1&>,
+        is_same<typename function_traits<F>::arg1_type,Arg1>
+      > >,
+      mpl::not_<mpl::or_<
+        is_same<typename function_traits<F>::arg2_type,const Arg2&>,
+        is_same<typename function_traits<F>::arg2_type,Arg2>
+      > >
+    >
+  >::type
+>:mpl::false_{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct is_transparent<
+  F,Arg1,Arg2,
+  typename enable_if<
+    is_function<typename remove_pointer<F>::type>
+  >::type
+>:is_transparent_function<typename remove_pointer<F>::type,Arg1,Arg2>{};
+
+} /* namespace multi_index::detail */
+
+} /* namespace multi_index */
+
+} /* namespace boost */
+
+#endif
+#endif
--- a/DEPENDENCIES/generic/include/boost/multi_index/detail/msvc_index_specifier.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- *
- * See http://www.boost.org/libs/multi_index for library home page.
- */
-
-#ifndef BOOST_MULTI_INDEX_DETAIL_MSVC_INDEX_SPECIFIER_HPP
-#define BOOST_MULTI_INDEX_DETAIL_MSVC_INDEX_SPECIFIER_HPP
-
-#if defined(_MSC_VER)&&(_MSC_VER>=1200)
-#pragma once
-#endif
-
-#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
-#include <boost/detail/workaround.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC,<1310)
-/* Workaround for a problem in MSVC with dependent template typedefs
- * when accesing index specifiers.
- * Modeled after <boost/mpl/aux_/msvc_dtw.hpp> (thanks, Aleksey!)
- */
-
-#include <boost/mpl/aux_/msvc_never_true.hpp>
-
-namespace boost{
-
-namespace multi_index{
-
-namespace detail{
-
-template<typename IndexSpecifier>
-struct msvc_index_specifier
-{
-  template<bool> struct fake_index_type:IndexSpecifier{};
-  template<> struct fake_index_type<true>
-  {
-    template<typename Super>
-    struct node_class{};
-
-    template<typename Super>
-    struct index_class{};
-  };
-
-  template<typename Super>
-  struct result_node_class:
-    fake_index_type<mpl::aux::msvc_never_true<IndexSpecifier>::value>::
-      template node_class<Super>
-  {
-  };
-
-  template<typename Super>
-  struct result_index_class:
-    fake_index_type<mpl::aux::msvc_never_true<IndexSpecifier>::value>::
-      template index_class<Super>
-  {
-  };
-};
-
-} /* namespace multi_index::detail */
-
-} /* namespace multi_index */
-
-} /* namespace boost */
-
-#endif /* workaround */
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/multi_index/detail/prevent_eti.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- *
- * See http://www.boost.org/libs/multi_index for library home page.
- */
-
-#ifndef BOOST_MULTI_INDEX_DETAIL_PREVENT_ETI_HPP
-#define BOOST_MULTI_INDEX_DETAIL_PREVENT_ETI_HPP
-
-#if defined(_MSC_VER)&&(_MSC_VER>=1200)
-#pragma once
-#endif
-
-#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
-#include <boost/detail/workaround.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC,<1300)
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/integral_c.hpp>
-#include <boost/mpl/aux_/msvc_never_true.hpp>
-#endif
-
-namespace boost{
-
-namespace multi_index{
-
-namespace detail{
-
-#if BOOST_WORKAROUND(BOOST_MSVC,<1300)
-/* See
- * http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_MPL
- * Item 5.6, Beware of the 'early template instantiation' trap.
- */
-
-template<typename Type,typename Construct>
-struct prevent_eti
-{
-  typedef typename mpl::if_<
-    mpl::aux::msvc_never_true<Type>,
-    mpl::integral_c<int,0>,
-    Construct
-  >::type type;
-};
-#else
-template<typename Type,typename Construct>
-struct prevent_eti
-{
-  typedef Construct type;
-};
-#endif
-
-} /* namespace multi_index::detail */
-
-} /* namespace multi_index */
-
-} /* namespace boost */
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multi_index/detail/promotes_arg.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+/* Copyright 2003-2014 Joaquin M Lopez Munoz.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org/libs/multi_index for library home page.
+ */
+
+#ifndef BOOST_MULTI_INDEX_DETAIL_PROMOTES_ARG_HPP
+#define BOOST_MULTI_INDEX_DETAIL_PROMOTES_ARG_HPP
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+/* Metafunctions to check if f(arg1,arg2) promotes either arg1 to the type of
+ * arg2 or viceversa. By default, (i.e. if it cannot be determined), no
+ * promotion is assumed.
+ */
+
+#if !defined(BOOST_IS_CONVERTIBLE)
+
+namespace boost{
+
+namespace multi_index{
+
+namespace detail{
+
+template<typename F,typename Arg1,typename Arg2>
+struct promotes_1st_arg:mpl::false_{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct promotes_2nd_arg:mpl::false_{};
+
+} /* namespace multi_index::detail */
+
+} /* namespace multi_index */
+
+} /* namespace boost */
+
+#else
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/multi_index/detail/is_transparent.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+namespace boost{
+
+namespace multi_index{
+
+namespace detail{
+  
+template<typename F,typename Arg1,typename Arg2>
+struct promotes_1st_arg:
+  mpl::and_<
+    mpl::not_<is_transparent<F,Arg1,Arg2> >,
+    is_convertible<const Arg1,Arg2>,
+    is_transparent<F,Arg2,Arg2>
+  >
+{};
+
+template<typename F,typename Arg1,typename Arg2>
+struct promotes_2nd_arg:
+  mpl::and_<
+    mpl::not_<is_transparent<F,Arg1,Arg2> >,
+    is_convertible<const Arg2,Arg1>,
+    is_transparent<F,Arg1,Arg1>
+  >
+{};
+
+} /* namespace multi_index::detail */
+
+} /* namespace multi_index */
+
+} /* namespace boost */
+
+#endif /* defined(BOOST_IS_CONVERTIBLE) */
+#endif
--- a/DEPENDENCIES/generic/include/boost/multi_index/detail/safe_ctr_proxy.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- *
- * See http://www.boost.org/libs/multi_index for library home page.
- */
-
-#ifndef BOOST_MULTI_INDEX_DETAIL_SAFE_CTR_PROXY_HPP
-#define BOOST_MULTI_INDEX_DETAIL_SAFE_CTR_PROXY_HPP
-
-#if defined(_MSC_VER)&&(_MSC_VER>=1200)
-#pragma once
-#endif
-
-#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
-#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
-#include <boost/detail/workaround.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC,<1300)
-#include <boost/multi_index/detail/safe_mode.hpp>
-
-namespace boost{
-
-namespace multi_index{
-
-namespace detail{
-
-/* A safe iterator is instantiated in the form
- * safe_iterator<Iterator,Container>: MSVC++ 6.0 has serious troubles with
- * the resulting symbols names, given that index names (which stand for
- * Container) are fairly long themselves. safe_ctr_proxy does not statically
- * depend on Container, and provides the necessary methods (begin and end) to
- * the safe mode framework via an abstract interface. With safe_ctr_proxy,
- * instead of deriving from safe_container<Container> the following base class
- * must be used:
- *
- *   safe_ctr_proxy_impl<Iterator,Container>
- *
- * where Iterator is the type of the *unsafe* iterator being wrapped.
- * The corresponding safe iterator instantiation is then
- * 
- *   safe_iterator<Iterator,safe_ctr_proxy<Iterator> >,
- *
- * which does not include the name of Container.
- */
-
-template<typename Iterator>
-class safe_ctr_proxy:
-  public safe_mode::safe_container<safe_ctr_proxy<Iterator> >
-{
-public:
-  typedef safe_mode::safe_iterator<Iterator,safe_ctr_proxy> iterator;
-  typedef iterator                                          const_iterator;
-
-  iterator       begin(){return begin_impl();}
-  const_iterator begin()const{return begin_impl();}
-  iterator       end(){return end_impl();}
-  const_iterator end()const{return end_impl();}
-
-protected:
-  virtual iterator       begin_impl()=0;
-  virtual const_iterator begin_impl()const=0;
-  virtual iterator       end_impl()=0;
-  virtual const_iterator end_impl()const=0;
-};
-
-template<typename Iterator,typename Container>
-class safe_ctr_proxy_impl:public safe_ctr_proxy<Iterator>
-{
-  typedef safe_ctr_proxy<Iterator> super;
-  typedef Container                container_type;
-
-public:
-  typedef typename super::iterator       iterator;
-  typedef typename super::const_iterator const_iterator;
-
-  virtual iterator       begin_impl(){return container().begin();}
-  virtual const_iterator begin_impl()const{return container().begin();}
-  virtual iterator       end_impl(){return container().end();}
-  virtual const_iterator end_impl()const{return container().end();}
-
-private:
-  container_type& container()
-  {
-    return *static_cast<container_type*>(this);
-  }
-  
-  const container_type& container()const
-  {
-    return *static_cast<const container_type*>(this);
-  }
-};
-
-} /* namespace multi_index::detail */
-
-} /* namespace multi_index */
-
-} /* namespace boost */
-
-#endif /* workaround */
-
-#endif /* BOOST_MULTI_INDEX_ENABLE_SAFE_MODE */
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1605 @@
+///////////////////////////////////////////////////////////////
+//  Copyright 2013 John Maddock. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+
+#ifndef BOOST_MATH_CPP_BIN_FLOAT_HPP
+#define BOOST_MATH_CPP_BIN_FLOAT_HPP
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/integer.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/multiprecision/detail/float_string_cvt.hpp>
+
+namespace boost{ namespace multiprecision{ namespace backends{
+
+enum digit_base_type
+{
+   digit_base_2 = 2, 
+   digit_base_10 = 10
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4522)  // multiple assignment operators specified
+#endif
+
+namespace detail{
+
+template <class U>
+inline typename enable_if_c<is_unsigned<U>::value, bool>::type is_negative(U) { return false; }
+template <class S>
+inline typename disable_if_c<is_unsigned<S>::value, bool>::type is_negative(S s) { return s < 0; }
+
+}
+
+template <unsigned Digits, digit_base_type DigitBase = digit_base_10, class Allocator = void, class Exponent = int, Exponent MinExponent = 0, Exponent MaxExponent = 0>
+class cpp_bin_float
+{
+public:
+   static const unsigned bit_count = DigitBase == digit_base_2 ? Digits : (Digits * 1000uL) / 301uL + ((Digits * 1000uL) % 301 ? 2u : 1u);
+   typedef cpp_int_backend<is_void<Allocator>::value ? bit_count : 0, bit_count, is_void<Allocator>::value ? unsigned_magnitude : signed_magnitude, unchecked, Allocator> rep_type;
+   typedef cpp_int_backend<is_void<Allocator>::value ? 2 * bit_count : 0, 2 * bit_count, is_void<Allocator>::value ? unsigned_magnitude : signed_magnitude, unchecked, Allocator> double_rep_type;
+
+   typedef typename rep_type::signed_types                        signed_types;
+   typedef typename rep_type::unsigned_types                      unsigned_types;
+   typedef boost::mpl::list<double, long double>                  float_types;
+   typedef Exponent                                               exponent_type;
+
+   static const exponent_type max_exponent_limit = boost::integer_traits<exponent_type>::const_max - 2 * static_cast<exponent_type>(bit_count);
+   static const exponent_type min_exponent_limit = boost::integer_traits<exponent_type>::const_min + 2 * static_cast<exponent_type>(bit_count);
+
+   BOOST_STATIC_ASSERT_MSG(MinExponent >= min_exponent_limit, "Template parameter MinExponent is too negative for our internal logic to function correctly, sorry!");
+   BOOST_STATIC_ASSERT_MSG(MaxExponent <= max_exponent_limit, "Template parameter MaxExponent is too large for our internal logic to function correctly, sorry!");
+   BOOST_STATIC_ASSERT_MSG(MinExponent <= 0, "Template parameter MinExponent can not be positive!");
+   BOOST_STATIC_ASSERT_MSG(MaxExponent >= 0, "Template parameter MaxExponent can not be negative!");
+
+   static const exponent_type max_exponent = MaxExponent == 0 ? max_exponent_limit : MaxExponent;
+   static const exponent_type min_exponent = MinExponent == 0 ? min_exponent_limit : MinExponent;
+
+   static const exponent_type exponent_zero = max_exponent + 1;
+   static const exponent_type exponent_infinity = max_exponent + 2;
+   static const exponent_type exponent_nan = max_exponent + 3;
+
+private:
+
+   rep_type m_data;
+   exponent_type m_exponent;
+   bool m_sign;
+public:
+   cpp_bin_float() BOOST_NOEXCEPT_IF(noexcept(rep_type())) : m_data(), m_exponent(exponent_nan), m_sign(false) {}
+
+   cpp_bin_float(const cpp_bin_float &o) BOOST_NOEXCEPT_IF(noexcept(rep_type(std::declval<const rep_type&>())))
+      : m_data(o.m_data), m_exponent(o.m_exponent), m_sign(o.m_sign) {}
+
+   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>
+   cpp_bin_float(const cpp_bin_float<D, B, A, E, MinE, MaxE> &o, typename boost::enable_if_c<(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = 0)
+      : m_exponent(o.exponent()), m_sign(o.sign()) 
+   {
+      typename cpp_bin_float<D, B, A, E, MinE, MaxE>::rep_type b(o.bits());
+      this->sign() = o.sign();
+      this->exponent() = o.exponent() + (int)bit_count - (int)cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count;
+      copy_and_round(*this, b);
+   }
+
+   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>
+   explicit cpp_bin_float(const cpp_bin_float<D, B, A, E, MinE, MaxE> &o, typename boost::disable_if_c<(bit_count >= cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count)>::type const* = 0)
+      : m_exponent(o.exponent()), m_sign(o.sign()) 
+   {
+      typename cpp_bin_float<D, B, A, E, MinE, MaxE>::rep_type b(o.bits());
+      this->sign() = o.sign();
+      this->exponent() = o.exponent() - (int)(cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count - bit_count);
+      copy_and_round(*this, b);
+   }
+
+   template <class Float>
+   cpp_bin_float(const Float& f, 
+      typename boost::enable_if_c<
+         (number_category<Float>::value == number_kind_floating_point)
+         && (std::numeric_limits<Float>::digits <= (int)bit_count)
+         && (std::numeric_limits<Float>::radix == 2)
+      >::type const* = 0)
+      : m_data(), m_exponent(0), m_sign(false)
+   {
+      this->assign_float(f);
+   }
+
+   cpp_bin_float& operator=(const cpp_bin_float &o) BOOST_NOEXCEPT_IF(noexcept(std::declval<rep_type&>() = std::declval<const rep_type&>()))
+   {
+      m_data = o.m_data;
+      m_exponent = o.m_exponent;
+      m_sign = o.m_sign;
+      return *this;
+   }
+
+   template <unsigned D, digit_base_type B, class A, class E, E MinE, E MaxE>
+   cpp_bin_float& operator=(const cpp_bin_float<D, B, A, E, MinE, MaxE> &o)
+   {
+      typename cpp_bin_float<D, B, A, E, MinE, MaxE>::rep_type b(o.bits());
+      this->exponent() = o.exponent() + (int)bit_count - (int)cpp_bin_float<D, B, A, E, MinE, MaxE>::bit_count;
+      this->sign() = o.sign();
+      copy_and_round(*this, b);
+      return *this;
+   }
+
+   template <class Float>
+   typename boost::enable_if_c<
+      (number_category<Float>::value == number_kind_floating_point)
+      && (std::numeric_limits<Float>::digits <= (int)bit_count)
+      && (std::numeric_limits<Float>::radix == 2), cpp_bin_float&>::type operator=(const Float& f)
+   {
+      return assign_float(f);
+   }
+
+   template <class Float>
+   typename boost::enable_if_c<is_floating_point<Float>::value, cpp_bin_float&>::type assign_float(Float f)
+   {
+      BOOST_MATH_STD_USING
+      using default_ops::eval_add;
+      typedef typename boost::multiprecision::detail::canonical<int, cpp_bin_float>::type bf_int_type;
+
+      switch((boost::math::fpclassify)(f))
+      {
+      case FP_ZERO:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_zero;
+         return *this;
+      case FP_NAN:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_nan;
+         return *this;
+      case FP_INFINITE:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_infinity;
+         return *this;
+      }
+      if(f < 0)
+      {
+         *this = -f;
+         this->negate();
+         return *this;
+      }
+
+      typedef typename mpl::front<unsigned_types>::type ui_type;
+      m_data = static_cast<ui_type>(0u);
+      m_sign = false;
+      m_exponent = 0;
+
+      static const int bits = sizeof(int) * CHAR_BIT - 1;
+      int e;
+      f = frexp(f, &e);
+      while(f)
+      {
+         f = ldexp(f, bits);
+         e -= bits;
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+         int ipart = itrunc(f);
+#else
+         int ipart = static_cast<int>(f);
+#endif
+         f -= ipart;
+         m_exponent += bits;
+         cpp_bin_float t;
+         t = static_cast<bf_int_type>(ipart);
+         eval_add(*this, t);
+      }
+      m_exponent += static_cast<Exponent>(e);
+      return *this;
+   }
+
+   template <class Float>
+   typename boost::enable_if_c<
+      (number_category<Float>::value == number_kind_floating_point) 
+         && !is_floating_point<Float>::value
+         /*&& (std::numeric_limits<number<Float> >::radix == 2)*/, 
+      cpp_bin_float&>::type assign_float(Float f)
+   {
+      BOOST_MATH_STD_USING
+      using default_ops::eval_add;
+      using default_ops::eval_get_sign;
+      using default_ops::eval_convert_to;
+      using default_ops::eval_subtract;
+
+      typedef typename boost::multiprecision::detail::canonical<int, Float>::type f_int_type;
+      typedef typename boost::multiprecision::detail::canonical<int, cpp_bin_float>::type bf_int_type;
+
+      switch(eval_fpclassify(f))
+      {
+      case FP_ZERO:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_zero;
+         return *this;
+      case FP_NAN:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_nan;
+         return *this;
+      case FP_INFINITE:
+         m_data = limb_type(0);
+         m_sign = false;
+         m_exponent = exponent_infinity;
+         return *this;
+      }
+      if(eval_get_sign(f) < 0)
+      {
+         f.negate();
+         *this = f;
+         this->negate();
+         return *this;
+      }
+
+      typedef typename mpl::front<unsigned_types>::type ui_type;
+      m_data = static_cast<ui_type>(0u);
+      m_sign = false;
+      m_exponent = 0;
+
+      static const int bits = sizeof(int) * CHAR_BIT - 1;
+      int e;
+      eval_frexp(f, f, &e);
+      while(eval_get_sign(f) != 0)
+      {
+         eval_ldexp(f, f, bits);
+         e -= bits;
+         int ipart;
+         eval_convert_to(&ipart, f);
+         eval_subtract(f, static_cast<f_int_type>(ipart));
+         m_exponent += bits;
+         eval_add(*this, static_cast<bf_int_type>(ipart));
+      }
+      m_exponent += e;
+      if(m_exponent > max_exponent)
+         m_exponent = exponent_infinity;
+      if(m_exponent < min_exponent)
+      {
+         m_data = limb_type(0u);
+         m_exponent = exponent_zero;
+         m_sign = false;
+      }
+      else if(eval_get_sign(m_data) == 0)
+      {
+         m_exponent = exponent_zero;
+         m_sign = false;
+      }
+      return *this;
+   }
+
+   template <class I>
+   typename boost::enable_if<is_integral<I>, cpp_bin_float&>::type operator=(const I& i)
+   {
+      using default_ops::eval_bit_test;
+      if(!i)
+      {
+         m_data = static_cast<limb_type>(0);
+         m_exponent = exponent_zero;
+         m_sign = false;
+      }
+      else
+      {
+         typedef typename make_unsigned<I>::type ui_type;
+         ui_type fi = static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(i));
+         typedef typename boost::multiprecision::detail::canonical<ui_type, rep_type>::type ar_type;
+         m_data = static_cast<ar_type>(fi);
+         unsigned shift = msb(fi);
+         if(shift >= bit_count)
+         {
+            m_exponent = static_cast<Exponent>(shift);
+            m_data = static_cast<ar_type>(fi >> (shift + 1 - bit_count));
+         }
+         else
+         {
+            m_exponent = static_cast<Exponent>(shift);
+            eval_left_shift(m_data, bit_count - shift - 1);
+         }
+         BOOST_ASSERT(eval_bit_test(m_data, bit_count-1));
+         m_sign = detail::is_negative(i);
+      }
+      return *this;
+   }
+
+   cpp_bin_float& operator=(const char *s);
+
+   void swap(cpp_bin_float &o) BOOST_NOEXCEPT
+   {
+      m_data.swap(o.m_data);
+      std::swap(m_exponent, o.m_exponent);
+      std::swap(m_sign, o.m_sign);
+   }
+
+   std::string str(std::streamsize dig, std::ios_base::fmtflags f) const;
+
+   void negate()
+   {
+      if((m_exponent != exponent_zero) && (m_exponent != exponent_nan))
+         m_sign = !m_sign;
+   }
+
+   int compare(const cpp_bin_float &o) const BOOST_NOEXCEPT
+   {
+      if(m_sign != o.m_sign)
+         return m_sign ? -1 : 1;
+      int result;
+      if(m_exponent == exponent_nan)
+         return -1;
+      else if(m_exponent != o.m_exponent)
+      {
+         if(m_exponent == exponent_zero)
+            result = -1;
+         else if(o.m_exponent == exponent_zero)
+            result = 1;
+         else 
+            result = m_exponent > o.m_exponent ? 1 : -1;
+      }
+      else
+         result = m_data.compare(o.m_data);
+      if(m_sign)
+         result = -result;
+      return result;
+   }
+   template <class A>
+   int compare(const A& o) const BOOST_NOEXCEPT
+   {
+      cpp_bin_float b;
+      b = o;
+      return compare(b);
+   }
+
+   rep_type& bits() { return m_data; }
+   const rep_type& bits()const { return m_data; }
+   exponent_type& exponent() { return m_exponent; }
+   const exponent_type& exponent()const { return m_exponent; }
+   bool& sign() { return m_sign; }
+   const bool& sign()const { return m_sign; }
+   void check_invariants()
+   {
+      using default_ops::eval_bit_test;
+      using default_ops::eval_is_zero;
+      if((m_exponent <= max_exponent) && (m_exponent >= min_exponent))
+      {
+         BOOST_ASSERT(eval_bit_test(m_data, bit_count - 1));
+      }
+      else
+      {
+         BOOST_ASSERT(m_exponent > max_exponent);
+         BOOST_ASSERT(m_exponent <= exponent_nan);
+         BOOST_ASSERT(eval_is_zero(m_data));
+      }
+   }
+   template<class Archive>
+   void serialize(Archive & ar, const unsigned int /*version*/)
+   {
+      ar & m_data;
+      ar & m_exponent;
+      ar & m_sign;
+   }
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class Int>
+inline void copy_and_round(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, Int &arg)
+{
+   // Precondition: exponent of res must have been set before this function is called
+   // as we may need to adjust it based on how many cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in arg are set.
+   using default_ops::eval_msb;
+   using default_ops::eval_lsb;
+   using default_ops::eval_left_shift;
+   using default_ops::eval_bit_test;
+   using default_ops::eval_right_shift;
+   using default_ops::eval_increment;
+   using default_ops::eval_get_sign;
+
+   // cancellation may have resulted in arg being all zeros:
+   if(eval_get_sign(arg) == 0)
+   {
+      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+      res.sign() = false;
+      res.bits() = static_cast<limb_type>(0u);
+      return;
+   }
+   int msb = eval_msb(arg);
+   if(static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) > msb + 1)
+   {
+      // Must have had cancellation in subtraction, shift left and copy:
+      res.bits() = arg;
+      eval_left_shift(res.bits(), cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb - 1);
+      res.exponent() -= static_cast<Exponent>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb - 1);
+   }
+   else if(static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) < msb + 1)
+   {
+      // We have more cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count than we need, so round as required, 
+      // first get the rounding bit:
+      bool roundup = eval_bit_test(arg, msb - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count);
+      // Then check for a tie:
+      if(roundup && (msb - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count == eval_lsb(arg)))
+      {
+         // Ties round towards even:
+         if(!eval_bit_test(arg, msb - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1))
+            roundup = false;
+      }
+      // Shift off the cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count we don't need:
+      eval_right_shift(arg, msb - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1);
+      res.exponent() += static_cast<Exponent>(msb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1);
+      if(roundup)
+      {
+         eval_increment(arg);
+         if(eval_bit_test(arg, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))
+         {
+            // This happens very very rairly:
+            eval_right_shift(arg, 1u);
+            ++res.exponent();
+         }
+      }
+      res.bits() = arg;
+   }
+   else
+   {
+      res.bits() = arg;
+   }
+   BOOST_ASSERT((eval_msb(res.bits()) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
+
+   if(res.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+   {
+      // Overflow:
+      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;
+      res.bits() = static_cast<limb_type>(0u);
+   }
+   else if(res.exponent() < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
+   {
+      // Underflow:
+      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+      res.bits() = static_cast<limb_type>(0u);
+      res.sign() = false;
+   }
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void do_eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   using default_ops::eval_add;
+   using default_ops::eval_bit_test;
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;
+
+   // Special cases first:
+   switch(a.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      res = b;
+      if(res.sign())
+         res.negate();
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      if(b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan)
+         res = b;
+      else
+         res = a;
+      return; // result is still infinite.
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = a;
+      return; // result is still a NaN.
+   }
+   switch(b.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = b;
+      if(res.sign())
+         res.negate();
+      return; // result is infinite.
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = b;
+      return; // result is a NaN.
+   }
+   
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type e_diff = a.exponent() - b.exponent();
+   bool s = a.sign();
+   if(e_diff >= 0)
+   {
+      dt = a.bits();
+      if(e_diff < (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+      {
+         eval_left_shift(dt, e_diff);
+         res.exponent() = a.exponent() - e_diff;
+         eval_add(dt, b.bits());
+      }
+      else
+         res.exponent() = a.exponent();
+   }
+   else
+   {
+      dt= b.bits();
+      if(-e_diff < (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+      {
+         eval_left_shift(dt, -e_diff);
+         res.exponent() = b.exponent() + e_diff;
+         eval_add(dt, a.bits());
+      }
+      else
+         res.exponent() = b.exponent();
+   }
+   
+   copy_and_round(res, dt);
+   res.check_invariants();
+   if(res.sign() != s)
+      res.negate();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void do_eval_subtract(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   using default_ops::eval_subtract;
+   using default_ops::eval_bit_test;
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;
+   
+   // Special cases first:
+   switch(a.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      if(b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan)
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      else
+      {
+         res = b;
+         if(!res.sign())
+            res.negate();
+      }
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      if((b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan) || (b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity))
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      else
+         res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = a;
+      return; // result is still a NaN.
+   }
+   switch(b.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan;
+      res.sign() = false;
+      res.bits() = static_cast<limb_type>(0u);
+      return; // result is a NaN.
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = b;
+      return; // result is still a NaN.
+   }
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type e_diff = a.exponent() - b.exponent();
+   bool s = a.sign();
+   if((e_diff > 0) || ((e_diff == 0) && a.bits().compare(b.bits()) >= 0))
+   {
+      dt = a.bits();
+      if(e_diff < (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+      {
+         eval_left_shift(dt, e_diff);
+         res.exponent() = a.exponent() - e_diff;
+         eval_subtract(dt, b.bits());
+      }
+      else
+         res.exponent() = a.exponent();
+   }
+   else
+   {
+      dt = b.bits();
+      if(-e_diff < (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+      {
+         eval_left_shift(dt, -e_diff);
+         res.exponent() = b.exponent() + e_diff;
+         eval_subtract(dt, a.bits());
+      }
+      else
+         res.exponent() = b.exponent();
+      s = !s;
+   }
+   
+   copy_and_round(res, dt);
+   if(res.sign() != s)
+      res.negate();
+   res.check_invariants();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   if(a.sign() == b.sign())
+      do_eval_add(res, a, b);
+   else
+      do_eval_subtract(res, a, b);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_add(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a)
+{
+   return eval_add(res, res, a);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_subtract(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   if(a.sign() != b.sign())
+      do_eval_add(res, a, b);
+   else
+      do_eval_subtract(res, a, b);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_subtract(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a)
+{
+   return eval_subtract(res, res, a);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   using default_ops::eval_bit_test;
+   using default_ops::eval_multiply;
+
+   // Special cases first:
+   switch(a.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      if(b.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan)
+         res = b;
+      else
+         res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      switch(b.exponent())
+      {
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+         break;
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+         res = b;
+         break;
+      default:
+         res = a;
+         break;
+      }
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = a;
+      return;
+   }
+   if(b.exponent() > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+   {
+      res = b;
+      return;
+   }
+   if((a.exponent() > 0) && (b.exponent() > 0))
+   {
+      if(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent + 2 - a.exponent() < b.exponent())
+      {
+         // We will certainly overflow:
+         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;
+         res.sign() = a.sign() != b.sign();
+         res.bits() = static_cast<limb_type>(0u);
+         return;
+      }
+   }
+   if((a.exponent() < 0) && (b.exponent() < 0))
+   {
+      if(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent - 2 - a.exponent() > b.exponent())
+      {
+         // We will certainly underflow:
+         res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+         res.sign() = false;
+         res.bits() = static_cast<limb_type>(0u);
+         return;
+      }
+   }
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;
+   eval_multiply(dt, a.bits(), b.bits());
+   res.exponent() = a.exponent() + b.exponent() - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
+   copy_and_round(res, dt);
+   res.check_invariants();
+   res.sign() = a.sign() != b.sign();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a)
+{
+   eval_multiply(res, res, a);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>
+inline typename enable_if_c<is_unsigned<U>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const U &b)
+{
+   using default_ops::eval_bit_test;
+   using default_ops::eval_multiply;
+
+   // Special cases first:
+   switch(a.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      if(b == 0)
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      else
+         res = a;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = a;
+      return;
+   }
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type dt;
+   typedef typename boost::multiprecision::detail::canonical<U, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::type canon_ui_type;
+   eval_multiply(dt, a.bits(), static_cast<canon_ui_type>(b));
+   res.exponent() = a.exponent();
+   copy_and_round(res, dt);
+   res.check_invariants();
+   res.sign() = a.sign();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>
+inline typename enable_if_c<is_unsigned<U>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const U &b)
+{
+   eval_multiply(res, res, b);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>
+inline typename enable_if_c<is_signed<S>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, const S &b)
+{
+   typedef typename make_unsigned<S>::type ui_type;
+   eval_multiply(res, a, static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(b)));
+   if(b < 0)
+      res.negate();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>
+inline typename enable_if_c<is_signed<S>::value>::type eval_multiply(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const S &b)
+{
+   eval_multiply(res, res, b);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &u, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &v)
+{
+   using default_ops::eval_subtract;
+   using default_ops::eval_qr;
+   using default_ops::eval_bit_test;
+   using default_ops::eval_get_sign;
+   using default_ops::eval_increment;
+
+   //
+   // Special cases first:
+   //
+   switch(u.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      switch(v.exponent())
+      {
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+         return;
+      }
+      res = u;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      switch(v.exponent())
+      {
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+         return;
+      }
+      res = u;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      return;
+   }
+   switch(v.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      {
+      bool s = u.sign() != v.sign();
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+      res.sign() = s;
+      return;
+      }
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res.exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+      res.bits() = limb_type(0);
+      res.sign() = false;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      return;
+   }
+
+   // We can scale u and v so that both are integers, then perform integer
+   // division to obtain quotient q and remainder r, such that:
+   //
+   // q * v + r = u
+   //
+   // and hense:
+   //
+   // q + r/v = u/v
+   //
+   // From this, assuming q has cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count 
+   // bits we only need to determine whether
+   // r/v is less than, equal to, or greater than 0.5 to determine rounding - 
+   // this we can do with a shift and comparison.
+   //
+   // We can set the exponent and sign of the result up front:
+   //
+   res.exponent() = u.exponent() - v.exponent() - 1;
+   res.sign() = u.sign() != v.sign();
+   //
+   // Now get the quotient and remainder:
+   //
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(u.bits()), t2(v.bits()), q, r;
+   eval_left_shift(t, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count);
+   eval_qr(t, t2, q, r);
+   //
+   // We now have either "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count" 
+   // or "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1" significant 
+   // bits in q.
+   //
+   static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
+   if(eval_bit_test(q, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))
+   {
+      //
+      // OK we have cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1 bits, 
+      // so we already have rounding info,
+      // we just need to changes things if the last bit is 1 and either the
+      // remainder is non-zero (ie we do not have a tie) or the quotient would
+      // be odd if it were shifted to the correct number of bits (ie a tiebreak).
+      //
+      BOOST_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count));
+      if((q.limbs()[0] & 1u) && (eval_get_sign(r) || (q.limbs()[0] & 2u)))
+      {
+         eval_increment(q);
+      }
+   }
+   else
+   {
+      //
+      // We have exactly "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count" bits in q.
+      // Get rounding info, which we can get by comparing 2r with v.
+      // We want to call copy_and_round to handle rounding and general cleanup,
+      // so we'll left shift q and add some fake digits on the end to represent
+      // how we'll be rounding.
+      //
+      BOOST_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
+      static const unsigned lshift = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count < limb_bits ? 2 : limb_bits;
+      eval_left_shift(q, lshift);
+      res.exponent() -= lshift;
+      eval_left_shift(r, 1u);
+      int c = r.compare(v.bits());
+      if(c == 0)
+         q.limbs()[0] |= static_cast<limb_type>(1u) << (lshift - 1);
+      else if(c > 0)
+         q.limbs()[0] |= (static_cast<limb_type>(1u) << (lshift - 1)) + static_cast<limb_type>(1u);
+   }
+   copy_and_round(res, q);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   eval_divide(res, res, arg);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>
+inline typename enable_if_c<is_unsigned<U>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &u, const U &v)
+{
+   using default_ops::eval_subtract;
+   using default_ops::eval_qr;
+   using default_ops::eval_bit_test;
+   using default_ops::eval_get_sign;
+   using default_ops::eval_increment;
+
+   //
+   // Special cases first:
+   //
+   switch(u.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      if(v == 0)
+      {
+         res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+         return;
+      }
+      res = u;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = u;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      return;
+   }
+   if(v == 0)
+   {
+      bool s = u.sign();
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+      res.sign() = s;
+      return;
+   }
+
+   // We can scale u and v so that both are integers, then perform integer
+   // division to obtain quotient q and remainder r, such that:
+   //
+   // q * v + r = u
+   //
+   // and hense:
+   //
+   // q + r/v = u/v
+   //
+   // From this, assuming q has "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count" cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count, we only need to determine whether
+   // r/v is less than, equal to, or greater than 0.5 to determine rounding - 
+   // this we can do with a shift and comparison.
+   //
+   // We can set the exponent and sign of the result up front:
+   //
+   int gb = msb(v);
+   res.exponent() = u.exponent() - static_cast<Exponent>(gb) - static_cast<Exponent>(1);
+   res.sign() = u.sign();
+   //
+   // Now get the quotient and remainder:
+   //
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(u.bits()), q, r;
+   eval_left_shift(t, gb + 1);
+   eval_qr(t, number<typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::canonical_value(v), q, r);
+   //
+   // We now have either "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count" or "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1" significant cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in q.
+   //
+   static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
+   if(eval_bit_test(q, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))
+   {
+      //
+      // OK we have cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count+1 cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count, so we already have rounding info,
+      // we just need to changes things if the last bit is 1 and the
+      // remainder is non-zero (ie we do not have a tie).
+      //
+      BOOST_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count));
+      if((q.limbs()[0] & 1u) && eval_get_sign(r))
+      {
+         eval_increment(q);
+      }
+   }
+   else
+   {
+      //
+      // We have exactly "cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count" cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in q.
+      // Get rounding info, which we can get by comparing 2r with v.
+      // We want to call copy_and_round to handle rounding and general cleanup,
+      // so we'll left shift q and add some fake cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count on the end to represent
+      // how we'll be rounding.
+      //
+      BOOST_ASSERT((eval_msb(q) == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
+      static const unsigned lshift = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count < limb_bits ? 2 : limb_bits;
+      eval_left_shift(q, lshift);
+      res.exponent() -= lshift;
+      eval_left_shift(r, 1u);
+      int c = r.compare(number<typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type>::canonical_value(v));
+      if(c == 0)
+         q.limbs()[0] |= static_cast<limb_type>(1u) << (lshift - 1);
+      else if(c > 0)
+         q.limbs()[0] |= (static_cast<limb_type>(1u) << (lshift - 1)) + static_cast<limb_type>(1u);
+   }
+   copy_and_round(res, q);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class U>
+inline typename enable_if_c<is_unsigned<U>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const U &v)
+{
+   eval_divide(res, res, v);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>
+inline typename enable_if_c<is_signed<S>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &u, const S &v)
+{
+   typedef typename make_unsigned<S>::type ui_type;
+   eval_divide(res, u, static_cast<ui_type>(boost::multiprecision::detail::unsigned_abs(v)));
+   if(v < 0)
+      res.negate();
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class S>
+inline typename enable_if_c<is_signed<S>::value>::type eval_divide(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const S &v)
+{
+   eval_divide(res, res, v);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline int eval_get_sign(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   return arg.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero ? 0 : arg.sign() ? -1 : 1;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline bool eval_is_zero(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   return arg.exponent() == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline bool eval_eq(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &a, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &b)
+{
+   return (a.exponent() == b.exponent())
+      && (a.sign() == b.sign())
+      && (a.bits().compare(b.bits()) == 0)
+      && (a.exponent() != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_convert_to(long long *res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      *res = 0;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      BOOST_THROW_EXCEPTION(std::runtime_error("Could not convert NaN to integer."));
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      *res = (std::numeric_limits<long long>::max)();
+      if(arg.sign())
+         *res = -*res;
+      return;
+   }
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type man(arg.bits());
+   typename mpl::if_c<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type shift 
+      = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - arg.exponent();
+   if(shift > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)
+   {
+      *res = 0;
+      return;
+   }
+   if(arg.sign() && (arg.compare((std::numeric_limits<long long>::min)()) <= 0))
+   {
+      *res = (std::numeric_limits<long long>::min)();
+      return;
+   }
+   else if(!arg.sign() && (arg.compare((std::numeric_limits<long long>::max)()) >= 0))
+   {
+      *res = (std::numeric_limits<long long>::max)();
+      return;
+   }
+   eval_right_shift(man, shift);
+   eval_convert_to(res, man);
+   if(arg.sign())
+   {
+      *res = -*res;
+   }
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_convert_to(unsigned long long *res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      *res = 0;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      BOOST_THROW_EXCEPTION(std::runtime_error("Could not convert NaN to integer."));
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      *res = (std::numeric_limits<unsigned long long>::max)();
+      return;
+   }
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::rep_type man(arg.bits());
+   typename mpl::if_c<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type shift 
+      = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - arg.exponent();
+   if(shift > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)
+   {
+      *res = 0;
+      return;
+   }
+   else if(shift < 0)
+   {
+      // TODO: what if we have fewer cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count than a long long?
+      *res = (std::numeric_limits<long long>::max)();
+      return;
+   }
+   eval_right_shift(man, shift);
+   eval_convert_to(res, man);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_convert_to(long double *res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      *res = 0;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      *res = std::numeric_limits<long double>::quiet_NaN();
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      *res = (std::numeric_limits<long double>::infinity)();
+      if(arg.sign())
+         *res = -*res;
+      return;
+   }
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type e = arg.exponent();
+   e -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1;
+   *res = std::ldexp(static_cast<long double>(*arg.bits().limbs()), e);
+   for(unsigned i = 1; i < arg.bits().size(); ++i)
+   {
+      e += sizeof(*arg.bits().limbs()) * CHAR_BIT;
+      *res += std::ldexp(static_cast<long double>(arg.bits().limbs()[i]), e);
+   }
+   if(arg.sign())
+      *res = -*res;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_frexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg, Exponent *e)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      *e = 0;
+      res = arg;
+      return;
+   }
+   res = arg;
+   *e = arg.exponent() + 1;
+   res.exponent() = -1;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>
+inline void eval_frexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg, I *pe)
+{
+   Exponent e;
+   eval_frexp(res, arg, &e);
+   if((e > (std::numeric_limits<I>::max)()) || (e < (std::numeric_limits<I>::min)()))
+   {
+      BOOST_THROW_EXCEPTION(std::runtime_error("Exponent was outside of the range of the argument type to frexp."));
+   }
+   *pe = static_cast<I>(e);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg, Exponent e)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = arg;
+      return;
+   }
+   if((e > 0) && (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent - e < arg.exponent()))
+   {
+      // Overflow:
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+      res.sign() = arg.sign();
+   }
+   else if((e < 0) && (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent - e > arg.exponent()))
+   {
+      // Underflow:
+      res = limb_type(0);
+   }
+   else
+   {
+      res = arg;
+      res.exponent() += e;
+   }
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>
+inline typename enable_if_c<is_unsigned<I>::value>::type eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg, I e)
+{
+   typedef typename make_signed<I>::type si_type;
+   if(e > static_cast<I>((std::numeric_limits<si_type>::max)()))
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+   else
+      eval_ldexp(res, arg, static_cast<si_type>(e));
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, class I>
+inline typename enable_if_c<is_signed<I>::value>::type eval_ldexp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg, I e)
+{
+   if((e > (std::numeric_limits<Exponent>::max)()) || (e < (std::numeric_limits<Exponent>::min)()))
+   {
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+      if(e < 0)
+         res.negate();
+   }
+   else
+      eval_ldexp(res, arg, static_cast<Exponent>(e));
+}
+
+/*
+* Sign manipulation
+*/
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_abs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   res = arg;
+   res.sign() = false;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_fabs(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   res = arg;
+   res.sign() = false;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline int eval_fpclassify(const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+      return FP_ZERO;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      return FP_INFINITE;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      return FP_NAN;
+   }
+   return FP_NORMAL;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_sqrt(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   using default_ops::eval_integer_sqrt;
+   using default_ops::eval_bit_test;
+   using default_ops::eval_increment;
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+      res = arg;
+      return;
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      return;
+   }
+   if(arg.sign())
+   {
+      res = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+      return;
+   }
+
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::double_rep_type t(arg.bits()), r, s;
+   eval_left_shift(t, arg.exponent() & 1 ? cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count : cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1);
+   eval_integer_sqrt(s, r, t);
+
+   if(!eval_bit_test(s, cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count))
+   {
+      // We have exactly the right number of cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count in the result, round as required:
+      if(s.compare(r) < 0)
+      {
+         eval_increment(s);
+      }
+   }
+   typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type ae = arg.exponent();
+   res.exponent() = ae / 2;
+   if((ae & 1) && (ae < 0))
+      --res.exponent();
+   copy_and_round(res, s);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_floor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   using default_ops::eval_increment;
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = arg;
+      return;
+   }
+   typename mpl::if_c<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type shift = 
+      (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - arg.exponent() - 1;
+   if((arg.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))
+   {
+      // Either arg is already an integer, or a special value:
+      res = arg;
+      return;
+   }
+   if(shift >= (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+   {
+      res = static_cast<signed_limb_type>(arg.sign() ? -1 : 0);
+      return;
+   }
+   bool fractional = (int)eval_lsb(arg.bits()) < shift;
+   res = arg;
+   eval_right_shift(res.bits(), shift);
+   if(fractional && res.sign())
+   {
+      eval_increment(res.bits());
+      if(eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
+      {
+         // Must have extended result by one bit in the increment:
+         --shift;
+         ++res.exponent();
+      }
+   }
+   eval_left_shift(res.bits(), shift);
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+inline void eval_ceil(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   using default_ops::eval_increment;
+   switch(arg.exponent())
+   {
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_nan:
+   case cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity:
+      res = arg;
+      return;
+   }
+   typename mpl::if_c<sizeof(typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type) < sizeof(int), int, typename cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type>::type shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - arg.exponent() - 1;
+   if((arg.exponent() > (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent) || (shift <= 0))
+   {
+      // Either arg is already an integer, or a special value:
+      res = arg;
+      return;
+   }
+   if(shift >= (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)
+   {
+      res = static_cast<signed_limb_type>(arg.sign() ? 0 : 1);
+      return;
+   }
+   bool fractional = (int)eval_lsb(arg.bits()) < shift;
+   res = arg;
+   eval_right_shift(res.bits(), shift);
+   if(fractional && !res.sign())
+   {
+      eval_increment(res.bits());
+      if(eval_msb(res.bits()) != cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 - shift)
+      {
+         // Must have extended result by one bit in the increment:
+         --shift;
+         ++res.exponent();
+      }
+   }
+   eval_left_shift(res.bits(), shift);
+}
+
+} // namespace backends
+
+#ifdef BOOST_NO_SFINAE_EXPR
+
+namespace detail{
+
+template<unsigned D1, backends::digit_base_type B1, class A1, class E1, E1 M1, E1 M2, unsigned D2, backends::digit_base_type B2, class A2, class E2, E2 M3, E2 M4>
+struct is_explicitly_convertible<backends::cpp_bin_float<D1, B1, A1, E1, M1, M2>, backends::cpp_bin_float<D2, B2, A2, E2, M3, M4> > : public mpl::true_ {};
+
+}
+#endif
+
+
+using backends::cpp_bin_float;
+using backends::digit_base_2;
+using backends::digit_base_10;
+
+template<unsigned Digits, backends::digit_base_type DigitBase, class Exponent, Exponent MinE, Exponent MaxE, class Allocator>
+struct number_category<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > : public boost::mpl::int_<boost::multiprecision::number_kind_floating_point>{};
+
+template<unsigned Digits, backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+struct expression_template_default<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >
+{
+   static const expression_template_option value = is_void<Allocator>::value ? et_off : et_on;
+};
+
+typedef number<backends::cpp_bin_float<50> > cpp_bin_float_50;
+typedef number<backends::cpp_bin_float<100> > cpp_bin_float_100;
+
+typedef number<backends::cpp_bin_float<24, backends::digit_base_2, void, boost::int16_t, -126, 127>, et_off> cpp_bin_float_single;
+typedef number<backends::cpp_bin_float<53, backends::digit_base_2, void, boost::int16_t, -1022, 1023>, et_off> cpp_bin_float_double;
+typedef number<backends::cpp_bin_float<64, backends::digit_base_2, void, boost::int16_t, -16382, 16383>, et_off> cpp_bin_float_double_extended;
+typedef number<backends::cpp_bin_float<113, backends::digit_base_2, void, boost::int16_t, -16382, 16383>, et_off> cpp_bin_float_quad;
+
+}} // namespaces
+
+#include <boost/multiprecision/cpp_bin_float/io.hpp>
+#include <boost/multiprecision/cpp_bin_float/transcendental.hpp>
+
+namespace std{
+
+//
+// numeric_limits [partial] specializations for the types declared in this header:
+//
+template<unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+class numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >
+{
+   typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> number_type;
+public:
+   BOOST_STATIC_CONSTEXPR bool is_specialized = true;
+   static number_type (min)()
+   {
+      initializer.do_nothing();
+      static std::pair<bool, number_type> value;
+      if(!value.first)
+      {
+         value.first = true;
+         value.second = 1u;
+         value.second.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+      }
+      return value.second;
+   }
+   static number_type (max)()
+   {
+      initializer.do_nothing();
+      static std::pair<bool, number_type> value;
+      if(!value.first)
+      {
+         value.first = true;
+         eval_complement(value.second.backend().bits(), value.second.backend().bits());
+         value.second.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+      }
+      return value.second;
+   }
+   BOOST_STATIC_CONSTEXPR number_type lowest()
+   {
+      return -(max)();
+   }
+   BOOST_STATIC_CONSTEXPR int digits = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;
+   BOOST_STATIC_CONSTEXPR int digits10 = digits * 301 / 1000;
+   // Is this really correct???
+   BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2;
+   BOOST_STATIC_CONSTEXPR bool is_signed = true;
+   BOOST_STATIC_CONSTEXPR bool is_integer = false;
+   BOOST_STATIC_CONSTEXPR bool is_exact = false;
+   BOOST_STATIC_CONSTEXPR int radix = 2;
+   static number_type epsilon()
+   {
+      initializer.do_nothing();
+      static std::pair<bool, number_type> value;
+      if(!value.first)
+      {
+         value.first = true;
+         value.second = 1;
+         value.second = ldexp(value.second, 1 - (int)digits);
+      }
+      return value.second;
+   }
+   // What value should this be????
+   static number_type round_error()
+   {
+      // returns 0.5
+      initializer.do_nothing();
+      static std::pair<bool, number_type> value;
+      if(!value.first)
+      {
+         value.first = true;
+         value.second = 1;
+         value.second = ldexp(value.second, -1);
+      }
+      return value.second;
+   }
+   BOOST_STATIC_CONSTEXPR typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type min_exponent = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+   BOOST_STATIC_CONSTEXPR typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type min_exponent10 = (min_exponent / 1000) * 301L;
+   BOOST_STATIC_CONSTEXPR typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type max_exponent = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+   BOOST_STATIC_CONSTEXPR typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type max_exponent10 = (max_exponent / 1000) * 301L;
+   BOOST_STATIC_CONSTEXPR bool has_infinity = true;
+   BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = true;
+   BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
+   BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
+   BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
+   static number_type infinity()
+   {
+      // returns epsilon/2
+      initializer.do_nothing();
+      static std::pair<bool, number_type> value;
+      if(!value.first)
+      {
+         value.first = true;
+         value.second.backend().exponent() = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;
+      }
+      return value.second;
+   }
+   static number_type quiet_NaN()
+   {
+      return number_type();
+   }
+   BOOST_STATIC_CONSTEXPR number_type signaling_NaN()
+   {
+      return number_type(0);
+   }
+   BOOST_STATIC_CONSTEXPR number_type denorm_min() { return number_type(0); }
+   BOOST_STATIC_CONSTEXPR bool is_iec559 = false;
+   BOOST_STATIC_CONSTEXPR bool is_bounded = true;
+   BOOST_STATIC_CONSTEXPR bool is_modulo = false;
+   BOOST_STATIC_CONSTEXPR bool traps = true;
+   BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
+   BOOST_STATIC_CONSTEXPR float_round_style round_style = round_to_nearest;
+private:
+   struct data_initializer
+   {
+      data_initializer()
+      {
+         std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::epsilon();
+         std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::round_error();
+         (std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::min)();
+         (std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::max)();
+         std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity();
+         std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN();
+      }
+      void do_nothing()const{}
+   };
+   static const data_initializer initializer;
+};
+
+template<unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+const typename numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::data_initializer numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::initializer;
+
+#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::digits;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::digits10;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_digits10;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_signed;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_integer;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_exact;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::radix;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::min_exponent;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::min_exponent10;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_exponent;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST typename boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_type numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::max_exponent10;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_infinity;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_quiet_NaN;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_signaling_NaN;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_denorm;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::has_denorm_loss;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_iec559;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_bounded;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::is_modulo;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::traps;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::tinyness_before;
+template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates>
+BOOST_CONSTEXPR_OR_CONST float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> >::round_style;
+
+#endif
+
+} // namespace std
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float/io.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,690 @@
+///////////////////////////////////////////////////////////////
+//  Copyright 2013 John Maddock. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+
+#ifndef BOOST_MP_CPP_BIN_FLOAT_IO_HPP
+#define BOOST_MP_CPP_BIN_FLOAT_IO_HPP
+
+namespace boost{ namespace multiprecision{ namespace cpp_bf_io_detail{
+
+//
+// Multiplies a by b and shifts the result so it fits inside max_bits bits, 
+// returns by how much the result was shifted.
+//
+template <class I>
+inline I restricted_multiply(cpp_int& result, const cpp_int& a, const cpp_int& b, I max_bits, boost::int64_t& error)
+{
+   result = a * b;
+   I gb = msb(result);
+   I rshift = 0;
+   if(gb > max_bits)
+   {
+      rshift = gb - max_bits;
+      I lb = lsb(result);
+      int roundup = 0;
+      // The error rate increases by the error of both a and b, 
+      // this may be overly pessimistic in many case as we're assuming
+      // that a and b have the same level of uncertainty...
+      if(lb < rshift)
+         error = error ? error * 2 : 1;
+      if(rshift)
+      {
+         BOOST_ASSERT(rshift < INT_MAX);
+         if(bit_test(result, static_cast<unsigned>(rshift - 1)))
+         {
+            if(lb == rshift - 1)
+               roundup = 1;
+            else
+               roundup = 2;
+         }
+         result >>= rshift;
+      }
+      if((roundup == 2) || ((roundup == 1) && (result.backend().limbs()[0] & 1)))
+         ++result;
+   }
+   return rshift;
+}
+//
+// Computes a^e shifted to the right so it fits in max_bits, returns how far
+// to the right we are shifted.
+//
+template <class I>
+inline I restricted_pow(cpp_int& result, const cpp_int& a, I e, I max_bits, boost::int64_t& error)
+{
+   BOOST_ASSERT(&result != &a);
+   I exp = 0;
+   if(e == 1)
+   {
+      result = a;
+      return exp;
+   }
+   else if(e == 2)
+   {
+      return restricted_multiply(result, a, a, max_bits, error);
+   }
+   else if(e == 3)
+   {
+      exp = restricted_multiply(result, a, a, max_bits, error);
+      exp += restricted_multiply(result, result, a, max_bits, error);
+      return exp;
+   }
+   I p = e / 2;
+   exp = restricted_pow(result, a, p, max_bits, error);
+   exp *= 2;
+   exp += restricted_multiply(result, result, result, max_bits, error);
+   if(e & 1)
+      exp += restricted_multiply(result, result, a, max_bits, error);
+   return exp;
+}
+
+inline int get_round_mode(const cpp_int& what, boost::int64_t location, boost::int64_t error)
+{
+   //
+   // Can we round what at /location/, if the error in what is /error/ in
+   // units of 0.5ulp.  Return:
+   //
+   // -1: Can't round.
+   //  0: leave as is.
+   //  1: tie.
+   //  2: round up.
+   //
+   BOOST_ASSERT(location >= 0);
+   BOOST_ASSERT(location < INT_MAX);
+   boost::int64_t error_radius = error & 1 ? (1 + error) / 2 : error / 2;
+   if(error_radius && ((int)msb(error_radius) >= location))
+      return -1;
+   if(bit_test(what, static_cast<unsigned>(location)))
+   {
+      if((int)lsb(what) == location)
+         return error ? -1 : 1;   // Either a tie or can't round depending on whether we have any error
+      if(!error)
+         return 2;  // no error, round up.
+      cpp_int t = what - error_radius;
+      if((int)lsb(t) >= location)
+         return -1;
+      return 2;
+   }
+   else if(error)
+   {
+      cpp_int t = what + error_radius;
+      return bit_test(t, static_cast<unsigned>(location)) ? -1 : 0;
+   }
+   return 0;
+}
+
+inline int get_round_mode(cpp_int& r, cpp_int& d, boost::int64_t error, const cpp_int& q)
+{
+   //
+   // Lets suppose we have an inexact division by d+delta, where the true
+   // value for the divisor is d, and with |delta| <= error/2, then
+   // we have calculated q and r such that:
+   //
+   // n                  r
+   // ---       = q + -----------
+   // d + error        d + error
+   //
+   // Rearranging for n / d we get:
+   //
+   //    n         delta*q + r
+   //   --- = q + -------------
+   //    d              d
+   //
+   // So rounding depends on whether 2r + error * q > d.
+   //
+   // We return:
+   //  0 = down down.
+   //  1 = tie.
+   //  2 = round up.
+   // -1 = couldn't decide.
+   //
+   r <<= 1;
+   int c = r.compare(d);
+   if(c == 0)
+      return error ? -1 : 1;
+   if(c > 0)
+   {
+      if(error)
+      {
+         r -= error * q;
+         return r.compare(d) > 0 ? 2 : -1;
+      }
+      return 2;
+   }
+   if(error)
+   {
+      r += error * q;
+      return r.compare(d) < 0 ? 0 : -1;
+   }
+   return 0;
+}
+
+} // namespace
+
+namespace backends{
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>& cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::operator=(const char *s)
+{
+   cpp_int n;
+   boost::intmax_t decimal_exp = 0;
+   boost::intmax_t digits_seen = 0;
+   static const boost::intmax_t max_digits_seen = 4 + (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count * 301L) / 1000;
+   bool ss = false;
+   //
+   // Extract the sign:
+   //
+   if(*s == '-')
+   {
+      ss = true;
+      ++s;
+   }
+   else if(*s == '+')
+      ++s;
+   //
+   // Special cases first:
+   //
+   if((std::strcmp(s, "nan") == 0) || (std::strcmp(s, "NaN") == 0) || (std::strcmp(s, "NAN") == 0))
+   {
+      return *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::quiet_NaN().backend();
+   }
+   if((std::strcmp(s, "inf") == 0) || (std::strcmp(s, "Inf") == 0) || (std::strcmp(s, "INF") == 0) || (std::strcmp(s, "infinity") == 0) || (std::strcmp(s, "Infinity") == 0) || (std::strcmp(s, "INFINITY") == 0))
+   {
+      *this = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::infinity().backend();
+      if(ss)
+         negate();
+      return *this;
+   }
+   //
+   // Digits before the point:
+   //
+   while(*s && (*s >= '0') && (*s <= '9'))
+   {
+      n *= 10u;
+      n += *s - '0';
+      if(digits_seen || (*s != '0'))
+         ++digits_seen;
+      ++s;
+   }
+   // The decimal point (we really should localise this!!)
+   if(*s && (*s == '.'))
+      ++s;
+   //
+   // Digits after the point:
+   //
+   while(*s && (*s >= '0') && (*s <= '9'))
+   {
+      n *= 10u;
+      n += *s - '0';
+      --decimal_exp;
+      if(digits_seen || (*s != '0'))
+         ++digits_seen;
+      ++s;
+      if(digits_seen > max_digits_seen)
+         break;
+   }
+   //
+   // Digits we're skipping:
+   //
+   while(*s && (*s >= '0') && (*s <= '9'))
+      ++s;
+   //
+   // See if there's an exponent:
+   //
+   if(*s && ((*s == 'e') || (*s == 'E')))
+   {
+      ++s;
+      boost::intmax_t e = 0;
+      bool es = false;
+      if(*s && (*s == '-'))
+      {
+         es = true;
+         ++s;
+      }
+      else if(*s && (*s == '+'))
+         ++s;
+      while(*s && (*s >= '0') && (*s <= '9'))
+      {
+         e *= 10u;
+         e += *s - '0';
+         ++s;
+      }
+      if(es)
+         e = -e;
+      decimal_exp += e;
+   }
+   if(*s)
+   {
+      //
+      // Oops unexpected input at the end of the number:
+      //
+      BOOST_THROW_EXCEPTION(std::runtime_error("Unable to parse string as a valid floating point number."));
+   }
+   if(n == 0)
+   {
+      // Result is necessarily zero:
+      *this = static_cast<limb_type>(0u);
+      return *this;
+   }
+
+   static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
+   //
+   // Set our working precision - this is heuristic based, we want
+   // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
+   // and excessive memory usage, but we also want to avoid having to
+   // up the computation and start again at a higher precision.
+   // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add
+   // one limb for good measure.  This works very well for small exponents,
+   // but for larger exponents we may may need to restart, we could add some
+   // extra precision right from the start for larger exponents, but this
+   // seems to be slightly slower in the *average* case:
+   //
+#ifdef BOOST_MP_STRESS_IO
+   boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;
+#else
+   boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits ? limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits : 0) + limb_bits;
+#endif
+   boost::int64_t error = 0;
+   boost::intmax_t calc_exp = 0;
+   boost::intmax_t final_exponent = 0;
+
+   if(decimal_exp >= 0)
+   {
+      // Nice and simple, the result is an integer...
+      do
+      {
+         cpp_int t;
+         if(decimal_exp)
+         {
+            calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), decimal_exp, max_bits, error);
+            calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(t, t, n, max_bits, error);
+         }
+         else
+            t = n;
+         final_exponent = (boost::int64_t)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp + calc_exp;
+         int rshift = msb(t) - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
+         if(rshift > 0)
+         {
+            final_exponent += rshift;
+            int roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(t, rshift - 1, error);
+            t >>= rshift;
+            if((roundup == 2) || ((roundup == 1) && t.backend().limbs()[0] & 1))
+               ++t;
+            else if(roundup < 0)
+            {
+#ifdef BOOST_MP_STRESS_IO
+               max_bits += 32;
+#else
+               max_bits *= 2;
+#endif
+               error = 0;
+               continue;
+            }
+         }
+         else
+         {
+            BOOST_ASSERT(!error);
+         }
+         if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+         {
+            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+         }
+         else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
+         {
+            // Underflow:
+            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+         }
+         else
+         {
+            exponent() = static_cast<Exponent>(final_exponent);
+            final_exponent = 0;
+         }
+         copy_and_round(*this, t.backend());
+         break;
+      }
+      while(true);
+
+      if(ss != sign())
+         negate();
+   }
+   else
+   {
+      // Result is the ratio of two integers: we need to organise the
+      // division so as to produce at least an N-bit result which we can
+      // round according to the remainder.
+      //cpp_int d = pow(cpp_int(5), -decimal_exp);
+      do
+      {
+         cpp_int d;
+         calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -decimal_exp, max_bits, error);
+         int shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - msb(n) + msb(d);
+         final_exponent = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1 + decimal_exp - calc_exp;
+         if(shift > 0)
+         {
+            n <<= shift;
+            final_exponent -= static_cast<Exponent>(shift);
+         }
+         cpp_int q, r;
+         divide_qr(n, d, q, r);
+         int gb = msb(q);
+         BOOST_ASSERT((gb >= static_cast<int>(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) - 1));
+         //
+         // Check for rounding conditions we have to
+         // handle ourselves:
+         //
+         int roundup = 0;
+         if(gb == cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1)
+         {
+            // Exactly the right number of bits, use the remainder to round:
+            roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, q);
+         }
+         else if(bit_test(q, gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count) && ((int)lsb(q) == (gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count)))
+         {
+            // Too many bits in q and the bits in q indicate a tie, but we can break that using r,
+            // note that the radius of error in r is error/2 * q:
+            int shift = gb - (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 1;
+            q >>= shift;
+            final_exponent += static_cast<Exponent>(shift);
+            BOOST_ASSERT((msb(q) >= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - 1));
+            if(error && (r < (error / 2) * q))
+               roundup = -1;
+            else if(error && (r + (error / 2) * q >= d))
+               roundup = -1;
+            else
+               roundup = r ? 2 : 1;
+         }
+         else if(error && (((error / 2) * q + r >= d) || (r < (error / 2) * q)))
+         {
+            // We might have been rounding up, or got the wrong quotient: can't tell!
+            roundup = -1;
+         }
+         if(roundup < 0)
+         {
+#ifdef BOOST_MP_STRESS_IO
+            max_bits += 32;
+#else
+            max_bits *= 2;
+#endif
+            error = 0;
+            if(shift > 0)
+            {
+               n >>= shift;
+               final_exponent += static_cast<Exponent>(shift);
+            }
+            continue;
+         }
+         else if((roundup == 2) || ((roundup == 1) && q.backend().limbs()[0] & 1))
+            ++q;
+         if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+         {
+            // Overflow:
+            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent;
+         }
+         else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
+         {
+            // Underflow:
+            exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+            final_exponent -= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent;
+         }
+         else
+         {
+            exponent() = static_cast<Exponent>(final_exponent);
+            final_exponent = 0;
+         }
+         copy_and_round(*this, q.backend());
+         if(ss != sign())
+            negate();
+         break;
+      }
+      while(true);
+   }
+   //
+   // Check for scaling and/or over/under-flow:
+   //
+   final_exponent += exponent();
+   if(final_exponent > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+   {
+      // Overflow:
+      exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_infinity;
+      bits() = limb_type(0);
+   }
+   else if(final_exponent < cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::min_exponent)
+   {
+      // Underflow:
+      exponent() = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::exponent_zero;
+      bits() = limb_type(0);
+      sign() = 0;
+   }
+   else
+   {
+      exponent() = static_cast<Exponent>(final_exponent);
+   }
+   return *this;
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+std::string cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::str(std::streamsize dig, std::ios_base::fmtflags f) const
+{
+   if(dig == 0)
+      dig = std::numeric_limits<number<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> > >::max_digits10;
+
+   bool scientific = (f & std::ios_base::scientific) == std::ios_base::scientific;
+   bool fixed = !scientific && (f & std::ios_base::fixed);
+
+   std::string s;
+
+   if(exponent() <= cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::max_exponent)
+   {
+      // How far to left-shift in order to demormalise the mantissa:
+      boost::intmax_t shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1;
+      boost::intmax_t digits_wanted = static_cast<int>(dig);
+      boost::intmax_t base10_exp = exponent() >= 0 ? static_cast<boost::intmax_t>(std::floor(0.30103 * exponent())) : static_cast<boost::intmax_t>(std::ceil(0.30103 * exponent()));
+      //
+      // For fixed formatting we want /dig/ digits after the decimal point,
+      // so if the exponent is zero, allowing for the one digit before the
+      // decimal point, we want 1 + dig digits etc.
+      //
+      if(fixed)
+         digits_wanted += 1 + base10_exp;
+      if(scientific)
+         digits_wanted += 1;
+      if(digits_wanted < -1)
+      {
+         // Fixed precision, no significant digits, and nothing to round!
+         s = "0";
+         if(sign())
+            s.insert(static_cast<std::string::size_type>(0), 1, '-');
+         boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, true);
+         return s;
+      }
+      //
+      // power10 is the base10 exponent we need to multiply/divide by in order
+      // to convert our denormalised number to an integer with the right number of digits:
+      //
+      boost::intmax_t power10 = digits_wanted - base10_exp - 1;
+      //
+      // If we calculate 5^power10 rather than 10^power10 we need to move
+      // 2^power10 into /shift/
+      //
+      shift -= power10;
+      cpp_int i;
+      int roundup = 0; // 0=no rounding, 1=tie, 2=up
+      static const unsigned limb_bits = sizeof(limb_type) * CHAR_BIT;
+      //
+      // Set our working precision - this is heuristic based, we want
+      // a value as small as possible > cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count to avoid large computations
+      // and excessive memory usage, but we also want to avoid having to
+      // up the computation and start again at a higher precision.
+      // So we round cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count up to the nearest whole number of limbs, and add
+      // one limb for good measure.  This works very well for small exponents,
+      // but for larger exponents we add a few extra limbs to max_bits:
+      //
+#ifdef BOOST_MP_STRESS_IO
+      boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + 32;
+#else
+      boost::intmax_t max_bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count + (cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits ? limb_bits - cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count % limb_bits : 0) + limb_bits;
+      if(power10)
+         max_bits += (msb(boost::multiprecision::detail::abs(power10)) / 8) * limb_bits;
+#endif
+      do
+      {
+         boost::int64_t error = 0;
+         boost::intmax_t calc_exp = 0;
+         //
+         // Our integer result is: bits() * 2^-shift * 5^power10
+         //
+         i = bits();
+         if(shift < 0)
+         {
+            if(power10 >= 0)
+            {
+               // We go straight to the answer with all integer arithmetic,
+               // the result is always exact and never needs rounding:
+               BOOST_ASSERT(power10 <= (boost::intmax_t)INT_MAX);
+               i <<= -shift;
+               if(power10)
+                  i *= pow(cpp_int(5), static_cast<unsigned>(power10));
+            }
+            else if(power10 < 0)
+            {
+               cpp_int d;
+               calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(d, cpp_int(5), -power10, max_bits, error);
+               shift += calc_exp;
+               BOOST_ASSERT(shift < 0); // Must still be true!
+               i <<= -shift;
+               cpp_int r;
+               divide_qr(i, d, i, r);
+               roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(r, d, error, i);
+               if(roundup < 0)
+               {
+#ifdef BOOST_MP_STRESS_IO
+                  max_bits += 32;
+#else
+                  max_bits *= 2;
+#endif
+                  shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
+                  continue;
+               }
+            }
+         }
+         else
+         {
+            //
+            // Our integer is bits() * 2^-shift * 10^power10
+            //
+            if(power10 > 0)
+            {
+               if(power10)
+               {
+                  cpp_int t;
+                  calc_exp = boost::multiprecision::cpp_bf_io_detail::restricted_pow(t, cpp_int(5), power10, max_bits, error);
+                  calc_exp += boost::multiprecision::cpp_bf_io_detail::restricted_multiply(i, i, t, max_bits, error);
+                  shift -= calc_exp;
+               }
+               if((shift < 0) || ((shift == 0) && error))
+               {
+                  // We only get here if we were asked for a crazy number of decimal digits -
+                  // more than are present in a 2^max_bits number.
+#ifdef BOOST_MP_STRESS_IO
+                  max_bits += 32;
+#else
+                  max_bits *= 2;
+#endif
+                  shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
+                  continue;
+               }
+               if(shift)
+               {
+                  roundup = boost::multiprecision::cpp_bf_io_detail::get_round_mode(i, shift - 1, error);
+                  if(roundup < 0)
+                  {
+#ifdef BOOST_MP_STRESS_IO
+                     max_bits += 32;
+#else
+                     max_bits *= 2;
+#endif
+                     shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
+                     continue;
+                  }
+                  i >>= shift;
+               }
+            }
+            else
+            {
+               // We're right shifting, *and* dividing by 5^-power10,
+               // so 5^-power10 can never be that large or we'd simply
+               // get zero as a result, and that case is already handled above:
+               cpp_int r;
+               BOOST_ASSERT(-power10 < INT_MAX);
+               cpp_int d = pow(cpp_int(5), static_cast<unsigned>(-power10));
+               d <<= shift;
+               divide_qr(i, d, i, r);
+               r <<= 1;
+               int c = r.compare(d);
+               roundup = c < 0 ? 0 : c == 0 ? 1 : 2;
+            }
+         }
+         s = i.str(0, std::ios_base::fmtflags(0));
+         //
+         // Check if we got the right number of digits, this
+         // is really a test of whether we calculated the
+         // decimal exponent correctly:
+         //
+         boost::intmax_t digits_got = i ? static_cast<boost::intmax_t>(s.size()) : 0;
+         if(digits_got != digits_wanted)
+         {
+            base10_exp += digits_got - digits_wanted;
+            if(fixed)
+               digits_wanted = digits_got;  // strange but true.
+            power10 = digits_wanted - base10_exp - 1;
+            shift = (int)cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count - exponent() - 1 - power10;
+            if(fixed)
+               break;
+            roundup = 0;
+         }
+         else
+            break;
+      }
+      while(true);
+      //
+      // Check whether we need to round up: note that we could equally round up
+      // the integer /i/ above, but since we need to perform the rounding *after*
+      // the conversion to a string and the digit count check, we might as well
+      // do it here:
+      //
+      if((roundup == 2) || ((roundup == 1) && ((s[s.size() - 1] - '0') & 1)))
+      {
+         boost::multiprecision::detail::round_string_up_at(s, static_cast<int>(s.size() - 1), base10_exp);
+      }
+
+      if(sign())
+         s.insert(static_cast<std::string::size_type>(0), 1, '-');
+
+      boost::multiprecision::detail::format_float_string(s, base10_exp, dig, f, false);
+   }
+   else
+   {
+      switch(exponent())
+      {
+      case exponent_zero:
+         s = "0";
+         boost::multiprecision::detail::format_float_string(s, 0, dig, f, true);
+         break;
+      case exponent_nan:
+         s = "nan";
+         break;
+      case exponent_infinity:
+         s = sign() ? "-inf" : f & std::ios_base::showpos ? "+inf" : "inf";
+         break;
+      }
+   }
+   return s;
+}
+
+}}} // namespaces
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/multiprecision/cpp_bin_float/transcendental.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,137 @@
+///////////////////////////////////////////////////////////////
+//  Copyright 2013 John Maddock. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+
+#ifndef BOOST_MULTIPRECISION_CPP_BIN_FLOAT_TRANSCENDENTAL_HPP
+#define BOOST_MULTIPRECISION_CPP_BIN_FLOAT_TRANSCENDENTAL_HPP
+
+namespace boost{ namespace multiprecision{ namespace backends{
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+void eval_exp_taylor(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   static const int bits = cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;
+   //
+   // Taylor series for small argument, note returns exp(x) - 1:
+   //
+   res = limb_type(0);
+   cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> num(arg), denom, t;
+   denom = limb_type(1);
+   eval_add(res, num);
+
+   for(unsigned k = 2; ; ++k)
+   {
+      eval_multiply(denom, k);
+      eval_multiply(num, arg);
+      eval_divide(t, num, denom);
+      eval_add(res, t);
+      if(eval_is_zero(t) || (res.exponent() - bits > t.exponent()))
+         break;
+   }
+}
+
+template <unsigned Digits, digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE>
+void eval_exp(cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &res, const cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> &arg)
+{
+   //
+   // This is based on MPFR's method, let:
+   //
+   // n = floor(x / ln(2))
+   //
+   // Then:
+   //
+   // r = x - n ln(2) : 0 <= r < ln(2)
+   //
+   // We can reduce r further by dividing by 2^k, with k ~ sqrt(n),
+   // so if:
+   //
+   // e0 = exp(r / 2^k) - 1
+   //
+   // With e0 evaluated by taylor series for small arguments, then:
+   //
+   // exp(x) = 2^n (1 + e0)^2^k
+   //
+   // Note that to preserve precision we actually square (1 + e0) k times, calculating
+   // the result less one each time, i.e.
+   //
+   // (1 + e0)^2 - 1 = e0^2 + 2e0
+   //
+   // Then add the final 1 at the end, given that e0 is small, this effectively wipes
+   // out the error in the last step.
+   //
+   using default_ops::eval_multiply;
+   using default_ops::eval_subtract;
+   using default_ops::eval_add;
+   using default_ops::eval_convert_to;
+
+   int type = eval_fpclassify(arg);
+   bool isneg = eval_get_sign(arg) < 0;
+   if(type == (int)FP_NAN)
+   {
+      res = arg;
+      return;
+   }
+   else if(type == (int)FP_INFINITE)
+   {
+      res = arg;
+      if(isneg)
+         res = limb_type(0u);
+      else 
+         res = arg;
+      return;
+   }
+   else if(type == (int)FP_ZERO)
+   {
+      res = limb_type(1);
+      return;
+   }
+   cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> t, n;
+   if(isneg)
+   {
+      t = arg;
+      t.negate();
+      eval_exp(res, t);
+      t.swap(res);
+      res = limb_type(1);
+      eval_divide(res, t);
+      return;
+   }
+
+   eval_divide(n, arg, default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >());
+   eval_floor(n, n);
+   eval_multiply(t, n, default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >());
+   eval_subtract(t, arg);
+   t.negate();
+   if(eval_get_sign(t) < 0)
+   {
+      // There are some very rare cases where arg/ln2 is an integer, and the subsequent multiply
+      // rounds up, in that situation t ends up negative at this point which breaks our invariants below:
+      t = limb_type(0);
+   }
+   BOOST_ASSERT(t.compare(default_ops::get_constant_ln2<cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE> >()) < 0);
+
+   Exponent k, nn;
+   eval_convert_to(&nn, n);
+   k = nn ? Exponent(1) << (msb(nn) / 2) : 0;
+   eval_ldexp(t, t, -k);
+
+   eval_exp_taylor(res, t);
+   //
+   // Square 1 + res k times:
+   //
+   for(int s = 0; s < k; ++s)
+   {
+      t.swap(res);
+      eval_multiply(res, t, t);
+      eval_ldexp(t, t, 1);
+      eval_add(res, t);
+   }
+   eval_add(res, limb_type(1));
+   eval_ldexp(res, res, nn);
+}
+
+}}} // namespaces
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,110 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/algebra/algebra_dispatcher.hpp
+
+ [begin_description]
+ Algebra dispatcher to automatically chose suitable algebra.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED
+
+#include <boost/numeric/odeint/config.hpp>
+
+#include <complex>
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/numeric/ublas/matrix.hpp>
+
+#include <boost/numeric/odeint/algebra/range_algebra.hpp>
+#include <boost/numeric/odeint/algebra/array_algebra.hpp>
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+
+#include <boost/array.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+    
+template< class StateType , class Enabler = void >
+struct algebra_dispatcher_sfinae
+{
+    // range_algebra is the standard algebra
+    typedef range_algebra algebra_type;
+};
+
+template< class StateType >
+struct algebra_dispatcher : algebra_dispatcher_sfinae< StateType > { };
+
+// specialize for array
+template< class T , size_t N >
+struct algebra_dispatcher< boost::array< T , N > >
+{
+    typedef array_algebra algebra_type;
+};
+
+//specialize for some integral types
+template< typename T >
+struct algebra_dispatcher_sfinae< T , typename boost::enable_if< typename boost::is_floating_point< T >::type >::type >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template< typename T >
+struct algebra_dispatcher< std::complex<T> >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+///* think about that again....
+// specialize for ublas vector and matrix types
+template< class T , class A >
+struct algebra_dispatcher< boost::numeric::ublas::vector< T , A > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template< class T , class L , class A >
+struct algebra_dispatcher< boost::numeric::ublas::matrix< T , L , A > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+//*/
+
+}
+}
+}
+
+#ifdef BOOST_NUMERIC_ODEINT_CXX11
+
+// c++11 mode: specialization for std::array if available
+
+#include <array>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+    
+// specialize for std::array
+template< class T , size_t N >
+struct algebra_dispatcher< std::array< T , N > >
+{
+    typedef array_algebra algebra_type;
+};
+
+} } }
+
+#endif
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/extract_value_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/algebra/detail/extract_value_type.hpp
+
+ [begin_description]
+ Extract true value type from complex types (eg. std::complex)
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_EXTRACT_VALUE_TYPE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_EXTRACT_VALUE_TYPE_HPP_INCLUDED
+
+#include <boost/utility.hpp>
+#include <boost/mpl/has_xxx.hpp>
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type)
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+template< typename S , typename Enabler = void >
+struct extract_value_type {};
+
+// as long as value_types are defined we go down the value_type chain
+// e.g. returning S::value_type::value_type::value_type
+
+template< typename S >
+struct extract_value_type<S , typename boost::disable_if< has_value_type<S> >::type >
+{
+    // no value_type defined, return S
+    typedef S type;
+};
+
+template< typename S >
+struct extract_value_type< S , typename boost::enable_if< has_value_type<S> >::type >
+{
+    // go down the value_type
+    typedef typename extract_value_type< typename S::value_type >::type type;
+};
+
+} } } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/norm_inf.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/algebra/detail/norm_inf.hpp
+
+ [begin_description]
+ Default reduce implementation.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_NORM_INF_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_NORM_INF_HPP_INCLUDED
+
+#include <cmath>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+template< typename Value , class Iterator1 >
+inline Value norm_inf( Iterator1 first1 , Iterator1 last1 , Value init )
+{
+    using std::max;
+    using std::abs;
+    for( ; first1 != last1 ; )
+        init = max( init , abs( *first1++ ) );
+    return init;
+}
+
+
+} // detail
+} // odeint
+} // numeric
+} // boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_NORM_INF_HPP_INCLUDED
--- a/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/detail/reduce.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
- [auto_generated]
- boost/numeric/odeint/algebra/detail/reduce.hpp
-
- [begin_description]
- Default reduce implementation.
- [end_description]
-
- Copyright 2009-2011 Karsten Ahnert
- Copyright 2009-2011 Mario Mulansky
-
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or
- copy at http://www.boost.org/LICENSE_1_0.txt)
- */
-
-
-#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED
-#define BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED
-
-
-namespace boost {
-namespace numeric {
-namespace odeint {
-namespace detail {
-
-template< class ValueType , class Iterator1 , class Reduction >
-inline ValueType reduce( Iterator1 first1 , Iterator1 last1 , Reduction red, ValueType init)
-{
-    for( ; first1 != last1 ; )
-        init = red( init , *first1++ );
-    return init;
-}
-
-
-template< class ValueType , class Iterator1 , class Iterator2 , class Reduction >
-inline ValueType reduce2( Iterator1 first1 , Iterator1 last1 , Iterator2 first2 , Reduction red, ValueType init)
-{
-    for( ; first1 != last1 ; )
-        init = red( init , *first1++ , *first2++ );
-    return init;
-}
-
-template< class ValueType , class Iterator1 , class Iterator2 , class Iterator3 , class Reduction >
-inline ValueType reduce3( Iterator1 first1 , Iterator1 last1 , Iterator2 first2 , Iterator3 first3 , Reduction red, ValueType init)
-{
-    for( ; first1 != last1 ; )
-        init = red( init , *first1++ , *first2++ , *first3++ );
-    return init;
-}
-
-template< class ValueType , class Iterator1 , class Iterator2 , class Iterator3 , class Iterator4 , class Reduction >
-inline ValueType reduce4( Iterator1 first1 , Iterator1 last1 , Iterator2 first2 , Iterator3 first3 , Iterator4 first4 , Reduction red, ValueType init)
-{
-    for( ; first1 != last1 ; )
-        init = red( init , *first1++ , *first2++ , *first3++ , *first4++ );
-    return init;
-}
-
-
-} // detail
-} // odeint
-} // numeric
-} // boost
-
-
-#endif // BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_DISPATCHER_HPP_DEFINED
+
+#include <boost/numeric/odeint/algebra/fusion_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for fusion sequences
+template< class FusionSequence >
+struct algebra_dispatcher_sfinae< FusionSequence ,
+                           typename boost::enable_if<
+                               typename boost::fusion::traits::is_sequence< FusionSequence >::type >::type >
+{
+    typedef fusion_algebra algebra_type;
+};
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_DISPATCHER_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/multi_array_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,148 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/algebra/multi_array_algebra.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_MULTI_ARRAY_ALGEBRA_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_MULTI_ARRAY_ALGEBRA_HPP_DEFINED
+
+
+#include <boost/numeric/odeint/algebra/detail/for_each.hpp>
+#include <boost/numeric/odeint/algebra/detail/norm_inf.hpp>
+#include <boost/numeric/odeint/algebra/norm_result_type.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// not ready
+struct multi_array_algebra
+{
+    template< class S1 , class Op >
+    static void for_each1( S1 &s1 , Op op )
+    {
+        detail::for_each1( s1.data() , s1.data() + s1.num_elements() , op );
+    }
+
+    template< class S1 , class S2 , class Op >
+    static void for_each2( S1 &s1 , S2 &s2 , Op op )
+    {
+        detail::for_each2( s1.data() , s1.data() + s1.num_elements() , s2.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class Op >
+    static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
+    {
+        detail::for_each3( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class Op >
+    static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
+    {
+        detail::for_each4( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
+    static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
+    {
+        detail::for_each5( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
+    static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
+    {
+        detail::for_each6( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class Op >
+    static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
+    {
+        detail::for_each7( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class Op >
+    static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
+    {
+        detail::for_each8( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class Op >
+    static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
+    {
+        detail::for_each9( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class Op >
+    static void for_each10( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op )
+    {
+        detail::for_each10( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class Op >
+    static void for_each11( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op )
+    {
+        detail::for_each11( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op >
+    static void for_each12( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op )
+    {
+        detail::for_each12( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op >
+    static void for_each13( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op )
+    {
+        detail::for_each13( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s13.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op >
+    static void for_each14( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op )
+    {
+        detail::for_each14( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s13.data() , s14.data() , op );
+    }
+
+    template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class S15 , class Op >
+    static void for_each15( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , S15 &s15 , Op op )
+    {
+        detail::for_each15( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s13.data() , s14.data() , s15.data() , op );
+    }
+    
+    template< typename S >
+    static typename norm_result_type<S>::type norm_inf( const S &s )
+    {
+        return detail::norm_inf( s.data() , s.data() + s.num_elements()  , static_cast< typename norm_result_type<S>::type >( 0 ) );
+    }
+};
+
+// template< class T , size_t N >
+// struct algebra_dispatcher< boost::array< T , N > >
+// {
+//     typedef array_algebra algebra_type;
+// };
+
+
+
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ALGEBRA_MULTI_ARRAY_ALGEBRA_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/norm_result_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/algebra/norm_result_type.hpp
+
+ [begin_description]
+ Calculates the type of the norm_inf operation for container types
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_NORM_RESULT_TYPE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_NORM_RESULT_TYPE_HPP_INCLUDED
+
+#include <boost/numeric/odeint/algebra/detail/extract_value_type.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< typename S , typename Enabler = void >
+struct norm_result_type {
+    typedef typename detail::extract_value_type< S >::type type;
+};
+
+} } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/algebra/operations_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/algebra/operations_dispatcher.hpp
+
+ [begin_description]
+ Operations dispatcher to automatically chose suitable operations.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_OPERATIONS_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_OPERATIONS_DISPATCHER_HPP_INCLUDED
+
+#include <boost/numeric/odeint/algebra/default_operations.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+    
+template< class StateType , class Enabler = void >
+struct operations_dispatcher_sfinae
+{
+    typedef default_operations operations_type;
+};
+
+template< class StateType >
+struct operations_dispatcher : operations_dispatcher_sfinae< StateType > {};
+
+// no further specializations required
+
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/blaze/blaze_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/blaze/blaze_algebra_dispatcher.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_ALGEBRA_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_ALGEBRA_DISPATCHER_HPP_INCLUDED
+
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+#include <blaze/math/dense/StaticVector.h>
+#include <blaze/math/dense/DynamicVector.h>
+
+
+
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< typename T , size_t N , bool TF >
+struct algebra_dispatcher< blaze::StaticVector< T , N , TF >  >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template< typename T , bool TF >
+struct algebra_dispatcher< blaze::DynamicVector< T , TF > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+
+
+
+
+}
+}
+}
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_ALGEBRA_DISPATCHER_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/blaze/blaze_resize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/blaze/blaze_resize.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_RESIZE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_RESIZE_HPP_INCLUDED
+
+#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
+#include <boost/numeric/odeint/util/same_size.hpp>
+
+#include <blaze/math/dense/DynamicVector.h>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< typename T , bool TF >
+struct is_resizeable< blaze::DynamicVector< T , TF > > 
+{ 
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+template< typename T1 , bool TF1, typename T2 , bool TF2 >
+struct same_size_impl< blaze::DynamicVector< T1 , TF1 > , blaze::DynamicVector< T2 , TF2 > >
+{
+    static bool same_size( const blaze::DynamicVector< T1 , TF1 > &x1 , const blaze::DynamicVector< T2 , TF2 > &x2 )
+    {
+        return x1.size() == x2.size();
+    }
+};
+
+template< typename T1 , bool TF1, typename T2 , bool TF2 >
+struct resize_impl< blaze::DynamicVector< T1 , TF1 > , blaze::DynamicVector< T2 , TF2 > >
+{
+    static void resize( blaze::DynamicVector< T1 , TF1 > &x1 , const blaze::DynamicVector< T2 , TF2 > &x2 )
+    {
+        x1.resize( x2.size() );
+    }
+};
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_BLAZE_BLAZE_RESIZE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/compute/compute.hpp
+
+  [begin_description]
+  includes all headers required for using odeint with Boost.Compute
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_HPP_DEFINED
+
+#include <boost/numeric/odeint/external/compute/compute_algebra.hpp>
+#include <boost/numeric/odeint/external/compute/compute_operations.hpp>
+#include <boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp>
+#include <boost/numeric/odeint/external/compute/compute_resize.hpp>
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/compute/compute_algebra.hpp
+
+ [begin_description]
+ An algebra for Boost.Compute vectors.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_ALGEBRA_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_ALGEBRA_HPP_DEFINED
+
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/compute.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+struct compute_algebra
+{
+
+#define BOOST_ODEINT_COMPUTE_STATE_PARAM(z, n, unused)                         \
+            StateType ## n &s ## n,
+
+#define BOOST_ODEINT_COMPUTE_ALGEBRA(z, n, unused)                             \
+    template< BOOST_PP_ENUM_PARAMS(n, class StateType), class Operation >      \
+    static void for_each ## n(                                                 \
+            BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_STATE_PARAM, ~)            \
+            Operation op                                                       \
+            )                                                                  \
+    {                                                                          \
+        op( BOOST_PP_ENUM_PARAMS(n, s) );                                      \
+    }
+
+BOOST_PP_REPEAT_FROM_TO(3, 9, BOOST_ODEINT_COMPUTE_ALGEBRA, ~)
+
+#undef BOOST_ODEINT_COMPUTE_ALGEBRA
+#undef BOOST_ODEINT_COMPUTE_STATE_PARAM
+
+    template < class S >
+    static typename S::value_type norm_inf( const S &s ) {
+        typedef typename S::value_type value_type;
+
+        BOOST_COMPUTE_FUNCTION(value_type, max_abs, (value_type, value_type),
+        {
+            return max(_1, fabs(_2));
+        });
+
+        return boost::compute::accumulate(s.begin(), s.end(), value_type(), max_abs);
+    }
+};
+} // odeint
+} // numeric
+} // boost
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp
+
+  [begin_description]
+  algebra_dispatcher specialization for Boost.Compute
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_ALGEBRA_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_ALGEBRA_DISPATCHER_HPP_DEFINED
+
+#include <boost/compute/container/vector.hpp>
+
+#include <boost/numeric/odeint/external/compute/compute_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for Boost.Compute vector
+template< class T , class A >
+struct algebra_dispatcher< boost::compute::vector< T , A > >
+{
+    typedef compute_algebra algebra_type;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_ALGEBRA_DISPATCHER_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_operations.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,198 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/compute/compute_operations.hpp
+
+ [begin_description]
+ Operations of Boost.Compute zipped iterators. Is the counterpart of the compute_algebra.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED
+
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/compute.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+struct compute_operations {
+
+#define BOOST_ODEINT_COMPUTE_TEMPL_FAC(z, n, unused)                           \
+    , class Fac ## n = BOOST_PP_CAT(Fac, BOOST_PP_DEC(n))
+
+#define BOOST_ODEINT_COMPUTE_MEMB_FAC(z, n, unused)                            \
+    const Fac ## n m_alpha ## n;
+
+#define BOOST_ODEINT_COMPUTE_PRM_FAC(z, n, unused)                             \
+    BOOST_PP_COMMA_IF(n) const Fac ## n alpha ## n
+
+#define BOOST_ODEINT_COMPUTE_INIT_FAC(z, n, unused)                            \
+    BOOST_PP_COMMA_IF(n) m_alpha ## n (alpha ## n)
+
+#define BOOST_ODEINT_COMPUTE_PRM_STATE(z, n, unused)                           \
+    BOOST_PP_COMMA_IF(n) StateType ## n &s ## n
+
+#define BOOST_ODEINT_COMPUTE_BEGIN_STATE(z, n, unused)                         \
+    BOOST_PP_COMMA_IF( BOOST_PP_DEC(n) ) s ## n.begin()
+
+#define BOOST_ODEINT_COMPUTE_END_STATE(z, n, unused)                           \
+    BOOST_PP_COMMA_IF( BOOST_PP_DEC(n) ) s ## n.end()
+
+#define BOOST_ODEINT_COMPUTE_LAMBDA(z, n, unused)                              \
+    BOOST_PP_EXPR_IF(n, +) m_alpha ## n * bc::lambda::get< n >(bc::_1)
+
+#define BOOST_ODEINT_COMPUTE_OPERATIONS(z, n, unused)                          \
+    template<                                                                  \
+        class Fac0 = double                                                    \
+        BOOST_PP_REPEAT_FROM_TO(1, n, BOOST_ODEINT_COMPUTE_TEMPL_FAC, ~)       \
+        >                                                                      \
+    struct scale_sum ## n {                                                    \
+        BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_MEMB_FAC, ~)                   \
+        scale_sum ## n(                                                        \
+                BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_PRM_FAC, ~)            \
+                )                                                              \
+            : BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_INIT_FAC, ~)             \
+        { }                                                                    \
+        template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), class StateType) >     \
+        void operator()(                                                       \
+                BOOST_PP_REPEAT(                                               \
+                    BOOST_PP_INC(n),                                           \
+                    BOOST_ODEINT_COMPUTE_PRM_STATE, ~)                         \
+                ) const                                                        \
+        {                                                                      \
+            namespace bc = boost::compute;                                     \
+            bc::transform(                                                     \
+                    bc::make_zip_iterator(                                     \
+                        boost::make_tuple(                                     \
+                            BOOST_PP_REPEAT_FROM_TO(                           \
+                                1, BOOST_PP_INC(n),                            \
+                                BOOST_ODEINT_COMPUTE_BEGIN_STATE, ~)           \
+                            )                                                  \
+                        ),                                                     \
+                    bc::make_zip_iterator(                                     \
+                        boost::make_tuple(                                     \
+                            BOOST_PP_REPEAT_FROM_TO(                           \
+                                1, BOOST_PP_INC(n),                            \
+                                BOOST_ODEINT_COMPUTE_END_STATE, ~)             \
+                            )                                                  \
+                        ),                                                     \
+                    s0.begin(),                                                \
+                    BOOST_PP_REPEAT(n, BOOST_ODEINT_COMPUTE_LAMBDA, ~)         \
+                    );                                                         \
+        }                                                                      \
+    };
+
+BOOST_PP_REPEAT_FROM_TO(2, 8, BOOST_ODEINT_COMPUTE_OPERATIONS, ~)
+
+#undef BOOST_ODEINT_COMPUTE_TEMPL_FAC
+#undef BOOST_ODEINT_COMPUTE_MEMB_FAC
+#undef BOOST_ODEINT_COMPUTE_PRM_FAC
+#undef BOOST_ODEINT_COMPUTE_INIT_FAC
+#undef BOOST_ODEINT_COMPUTE_PRM_STATE
+#undef BOOST_ODEINT_COMPUTE_BEGIN_STATE
+#undef BOOST_ODEINT_COMPUTE_END_STATE
+#undef BOOST_ODEINT_COMPUTE_LAMBDA
+#undef BOOST_ODEINT_COMPUTE_OPERATIONS
+
+    template<class Fac1 = double, class Fac2 = Fac1>
+    struct scale_sum_swap2 {
+        const Fac1 m_alpha1;
+        const Fac2 m_alpha2;
+
+        scale_sum_swap2(const Fac1 alpha1, const Fac2 alpha2)
+            : m_alpha1(alpha1), m_alpha2(alpha2) { }
+
+        template<class State0, class State1, class State2>
+        void operator()(State0 &s0, State1 &s1, State2 &s2) const {
+            namespace bc = boost::compute;
+
+            bc::command_queue &queue   = bc::system::default_queue();
+            const bc::context &context = queue.get_context();
+
+            const char source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
+                    kernel void scale_sum_swap2(
+                        F1 a1, F2 a2,
+                        global T0 *x0, global T1 *x1, global T2 *x2,
+                        )
+                    {
+                        uint i = get_global_id(0);
+                        T0 tmp = x0[i];
+                        x0[i]  = a1 * x1[i] + a2 * x2[i];
+                        x1[i]  = tmp;
+                    }
+                    );
+
+            std::stringstream options;
+            options
+                << " -DT0=" << bc::type_name<typename State0::value_type>()
+                << " -DT1=" << bc::type_name<typename State1::value_type>()
+                << " -DT2=" << bc::type_name<typename State2::value_type>()
+                << " -DF1=" << bc::type_name<Fac1>()
+                << " -DF2=" << bc::type_name<Fac2>();
+
+            bc::program program =
+                bc::program::build_with_source(source, context, options.str());
+
+            bc::kernel kernel(program, "scale_sum_swap2");
+            kernel.set_arg(0, m_alpha1);
+            kernel.set_arg(1, m_alpha2);
+            kernel.set_arg(2, s0.get_buffer());
+            kernel.set_arg(3, s1.get_buffer());
+            kernel.set_arg(4, s2.get_buffer());
+
+            queue.enqueue_1d_range_kernel(kernel, 0, s0.size());
+
+        }
+    };
+
+    template<class Fac1 = double>
+    struct rel_error {
+        const Fac1 m_eps_abs, m_eps_rel, m_a_x, m_a_dxdt;
+
+        rel_error(const Fac1 eps_abs, const Fac1 eps_rel, const Fac1 a_x, const Fac1 a_dxdt)
+            : m_eps_abs(eps_abs), m_eps_rel(eps_rel), m_a_x(a_x), m_a_dxdt(a_dxdt) { }
+
+
+        template <class State0, class State1, class State2>
+        void operator()(State0 &s0, State1 &s1, State2 &s2) const {
+            namespace bc = boost::compute;
+            using bc::_1;
+            using bc::lambda::get;
+
+            bc::for_each(
+                    bc::make_zip_iterator(
+                        boost::make_tuple(
+                            s0.begin(),
+                            s1.begin(),
+                            s2.begin()
+                            )
+                        ),
+                    bc::make_zip_iterator(
+                        boost::make_tuple(
+                            s0.end(),
+                            s1.end(),
+                            s2.end()
+                            )
+                        ),
+                    get<0>(_1) = abs( get<0>(_1) ) /
+                        (m_eps_abs + m_eps_rel * (m_a_x * abs(get<1>(_1) + m_a_dxdt * abs(get<2>(_1)))))
+                    );
+        }
+    };
+};
+
+} // odeint
+} // numeric
+} // boost
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp
+
+  [begin_description]
+  operations_dispatcher specialization for Boost.Compute
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_DISPATCHER_HPP_DEFINED
+
+#include <boost/compute/container/vector.hpp>
+
+#include <boost/numeric/odeint/external/compute/compute_operations.hpp>
+#include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for Boost.Compute vector
+template< class T , class A >
+struct operations_dispatcher< boost::compute::vector< T , A > >
+{
+    typedef compute_operations operations_type;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_OPERATIONS_DISPATCHER_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/compute/compute_resize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,90 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/compute/compute_resize.hpp
+
+ [begin_description]
+ Enable resizing for Boost.Compute vector
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_RESIZE_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_RESIZE_HPP_DEFINED
+
+#include <boost/compute/container/vector.hpp>
+
+#include <boost/numeric/odeint/util/copy.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< class T, class A >
+struct is_resizeable< boost::compute::vector< T , A > >
+{
+    struct type : public boost::true_type { };
+    const static bool value = type::value;
+};
+
+template< class T, class A >
+struct same_size_impl< boost::compute::vector< T, A > , boost::compute::vector< T, A > >
+{
+    static bool same_size( const boost::compute::vector< T, A > &x , const boost::compute::vector< T, A > &y )
+    {
+        return x.size() == y.size();
+    }
+};
+
+template< class T, class A >
+struct resize_impl< boost::compute::vector< T, A > , boost::compute::vector< T, A > >
+{
+    static void resize( boost::compute::vector< T, A > &x , const boost::compute::vector< T, A > &y )
+    {
+        x.resize( y.size() );
+    }
+};
+
+
+template< class Container1, class T, class A >
+struct copy_impl< Container1 , boost::compute::vector< T, A > >
+{
+    static void copy( const Container1 &from , boost::compute::vector< T, A > &to )
+    {
+        boost::compute::copy( boost::begin( from ) , boost::end( from ) , boost::begin( to ) );
+    }
+};
+
+template< class T, class A, class Container2 >
+struct copy_impl< boost::compute::vector< T, A > , Container2 >
+{
+    static void copy( const boost::compute::vector< T, A > &from , Container2 &to )
+    {
+        boost::compute::copy( boost::begin( from ) , boost::end( from ) , boost::begin( to ) );
+    }
+};
+
+template< class T, class A >
+struct copy_impl< boost::compute::vector< T, A > , boost::compute::vector< T, A > >
+{
+    static void copy( const boost::compute::vector< T, A > &from , boost::compute::vector< T, A > &to )
+    {
+        boost::compute::copy( boost::begin( from ) , boost::end( from ) , boost::begin( to ) );
+    }
+};
+
+
+
+
+} // odeint
+} // numeric
+} // boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_COMPUTE_COMPUTE_RESIZE_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/eigen/eigen.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/external/eigen/eigen_algebra.hpp>
+#include <boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/eigen/eigen_resize.hpp>
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,109 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/eigen/eigen_algebra.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2013 Christian Shelton
+  Copyright 2013 Karsten Ahnert
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED
+
+#include <Eigen/Dense>
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+
+// Necessary routines for Eigen matrices to work with vector_space_algebra
+// from odeint
+// (that is, it lets odeint treat the eigen matrices correctly, knowing
+// how to add, multiply, compute the norm, etc)
+
+namespace Eigen {
+
+
+template<typename D>
+inline const
+typename Eigen::CwiseUnaryOp<
+          typename Eigen::internal::scalar_add_op<
+               typename Eigen::internal::traits<D>::Scalar>,
+          const D >
+operator+(const typename Eigen::MatrixBase<D> &m,
+          const typename Eigen::internal::traits<D>::Scalar &s) {
+     return Eigen::CwiseUnaryOp<
+          typename Eigen::internal::scalar_add_op<
+               typename Eigen::internal::traits<D>::Scalar>,
+          const D >(m.derived(),Eigen::internal::scalar_add_op<
+                    typename Eigen::internal::traits<D>::Scalar>(s));
+}
+
+template<typename D>
+inline const
+typename Eigen::CwiseUnaryOp<
+          typename Eigen::internal::scalar_add_op<
+               typename Eigen::internal::traits<D>::Scalar>,
+          const D >
+operator+(const typename Eigen::internal::traits<D>::Scalar &s,
+const typename Eigen::MatrixBase<D> &m) {
+     return Eigen::CwiseUnaryOp<
+          typename Eigen::internal::scalar_add_op<
+               typename Eigen::internal::traits<D>::Scalar>,
+          const D >(m.derived(),Eigen::internal::scalar_add_op<
+                    typename Eigen::internal::traits<D>::Scalar>(s));
+}
+
+
+
+template<typename D1,typename D2>
+inline const
+typename Eigen::CwiseBinaryOp<
+    typename Eigen::internal::scalar_quotient_op<
+        typename Eigen::internal::traits<D1>::Scalar>,
+    const D1, const D2>
+operator/(const Eigen::MatrixBase<D1> &x1, const Eigen::MatrixBase<D2> &x2) {
+    return x1.cwiseQuotient(x2);
+}
+
+
+template< typename D >
+inline const 
+typename Eigen::CwiseUnaryOp<
+    typename Eigen::internal::scalar_abs_op<
+        typename Eigen::internal::traits< D >::Scalar > ,
+        const D >
+abs( const Eigen::MatrixBase< D > &m ) {
+    return m.cwiseAbs();
+}
+
+
+
+} // end Eigen namespace
+
+
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template<typename B,int S1,int S2,int O, int M1, int M2>
+struct vector_space_norm_inf< Eigen::Matrix<B,S1,S2,O,M1,M2> >
+{
+    typedef B result_type;
+    result_type operator()( const Eigen::Matrix<B,S1,S2,O,M1,M2> &m ) const
+    {
+        return m.template lpNorm<Eigen::Infinity>();
+    }
+};
+
+} } } // end boost::numeric::odeint namespace
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_DISPATCHER_HPP_INCLUDED
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+template< class Derived >
+struct algebra_dispatcher_sfinae< Derived ,
+                      typename boost::enable_if< typename boost::is_base_of< Eigen::MatrixBase< Derived > , Derived >::type >::type >
+{ 
+    typedef vector_space_algebra algebra_type;
+};
+
+
+template < class Derived  >
+struct algebra_dispatcher_sfinae< Derived ,
+                      typename boost::enable_if< typename boost::is_base_of< Eigen::ArrayBase< Derived > , Derived >::type >::type >
+{ 
+    typedef vector_space_algebra algebra_type;
+};
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_ALGEBRA_DISPATCHER_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/eigen/eigen_resize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/eigen/eigen_resize.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2013 Ankur Sinha
+  Copyright 2013 Karsten Ahnert
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_RESIZE_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_RESIZE_HPP_DEFINED
+
+
+#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
+#include <boost/numeric/odeint/util/same_size.hpp>
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+
+#include <Eigen/Dense>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+
+template< class Derived >
+struct is_resizeable_sfinae< Derived ,
+                      typename boost::enable_if< typename boost::is_base_of< Eigen::MatrixBase< Derived > , Derived >::type >::type >
+{ 
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+
+template < class Derived  >
+struct is_resizeable_sfinae< Derived ,
+                      typename boost::enable_if< typename boost::is_base_of< Eigen::ArrayBase< Derived > , Derived >::type >::type >
+{ 
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+
+
+template< class Derived >
+struct same_size_impl_sfinae< Derived , Derived ,
+                       typename boost::enable_if< typename boost::is_base_of< Eigen::MatrixBase< Derived > , Derived >::type >::type >
+{
+    static bool same_size( const Eigen::MatrixBase< Derived > &m1 , const Eigen::MatrixBase< Derived > &m2 )
+
+    {
+        return ( ( m1.innerSize () == m2.innerSize () ) && ( m1.outerSize() == m2.outerSize() ) );
+    }
+};
+
+template< class Derived  >
+struct same_size_impl_sfinae< Derived , Derived ,
+                       typename boost::enable_if< typename boost::is_base_of< Eigen::ArrayBase< Derived > , Derived >::type >::type >
+{
+    static bool same_size( const Eigen::ArrayBase< Derived > &v1 , const Eigen::ArrayBase< Derived >  &v2 )
+    {
+        return  ( ( v1.innerSize () == v2.innerSize () ) && ( v1.outerSize() == v2.outerSize() ) );
+    }
+};
+
+
+
+
+template< class Derived >
+struct resize_impl_sfinae< Derived , Derived ,
+                    typename boost::enable_if< typename boost::is_base_of< Eigen::MatrixBase< Derived > , Derived >::type >::type >
+{
+    static void resize( Eigen::MatrixBase< Derived > &m1 , const Eigen::MatrixBase< Derived > &m2 )
+    {
+        m1.derived().resizeLike(m2);
+    }
+};
+
+template< class Derived >
+struct resize_impl_sfinae< Derived , Derived ,
+                    typename boost::enable_if< typename boost::is_base_of< Eigen::ArrayBase< Derived > , Derived >::type >::type >
+{
+    static void resize( Eigen::ArrayBase< Derived > &v1 , const Eigen::ArrayBase< Derived > &v2 )
+    {
+        v1.derived().resizeLike(v2);
+    }
+};
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_EIGEN_EIGEN_RESIZE_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,25 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/mpi/mpi.hpp
+
+ [begin_description]
+ Wrappers for MPI.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_HPP_INCLUDED
+
+#include <boost/numeric/odeint/external/mpi/mpi_vector_state.hpp>
+#include <boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp
+
+ [begin_description]
+ Nested parallelized algebra for MPI.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_NESTED_ALGEBRA_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_NESTED_ALGEBRA_HPP_INCLUDED
+
+#include <boost/numeric/odeint/algebra/norm_result_type.hpp>
+#include <boost/numeric/odeint/util/n_ary_helper.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/** \brief MPI-parallelized algebra, wrapping another algebra.
+ */
+template< class InnerAlgebra >
+struct mpi_nested_algebra
+{
+
+// execute the InnerAlgebra on each node's local data.
+#define BOOST_ODEINT_GEN_BODY(n) \
+    InnerAlgebra::for_each##n( \
+        BOOST_PP_ENUM_BINARY_PARAMS(n, s, () BOOST_PP_INTERCEPT) , \
+        op \
+    );
+BOOST_ODEINT_GEN_FOR_EACH(BOOST_ODEINT_GEN_BODY)
+#undef BOOST_ODEINT_GEN_BODY
+
+
+    template< class NestedState >
+    static typename norm_result_type< typename NestedState::value_type >::type norm_inf( const NestedState &s )
+    {
+        typedef typename norm_result_type< typename NestedState::value_type >::type result_type;
+        // local maximum
+        result_type value = InnerAlgebra::norm_inf( s() );
+        // global maximum
+        return boost::mpi::all_reduce(s.world, value, boost::mpi::maximum<result_type>());
+    }
+
+};
+
+
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_state.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,113 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/mpi/mpi_state.hpp
+
+ [begin_description]
+ A generic split state, storing partial data on each node.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_STATE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_STATE_HPP_INCLUDED
+
+#include <vector>
+#include <algorithm>
+#include <boost/mpi.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/util/split.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
+#include <boost/numeric/odeint/util/same_size.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/** \brief A container which has its contents distributed among the nodes.
+ */
+template< class InnerState >
+struct mpi_state
+{
+    typedef InnerState value_type;
+
+    // the node's local data.
+    InnerState m_data;
+
+    boost::mpi::communicator world;
+
+    mpi_state() {}
+    mpi_state(boost::mpi::communicator comm) : world(comm) {}
+
+    inline InnerState &operator()() { return m_data; }
+    inline const InnerState &operator()() const { return m_data; }
+};
+
+
+
+
+template< class InnerState >
+struct is_resizeable< mpi_state< InnerState > >
+     : is_resizeable< InnerState > { };
+
+
+template< class InnerState1 , class InnerState2 >
+struct same_size_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
+{
+    static bool same_size( const mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y )
+    {
+        const bool local = boost::numeric::odeint::same_size(x(), y());
+        return boost::mpi::all_reduce(x.world, local, mpi::bitwise_and<bool>());
+    }
+};
+
+
+template< class InnerState1 , class InnerState2 >
+struct resize_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
+{
+    static void resize( mpi_state< InnerState1 > &x , const mpi_state< InnerState2 > &y )
+    {
+        // resize local parts on each node.
+        boost::numeric::odeint::resize(x(), y());
+    }
+};
+
+
+/** \brief Copy data between mpi_states of same size. */
+template< class InnerState1 , class InnerState2 >
+struct copy_impl< mpi_state< InnerState1 > , mpi_state< InnerState2 > >
+{
+    static void copy( const mpi_state< InnerState1 > &from , mpi_state< InnerState2 > &to )
+    {
+        // copy local parts on each node.
+        boost::numeric::odeint::copy(from(), to());
+    }
+};
+
+
+
+/** \brief Use `mpi_algebra` for `mpi_state`. */
+template< class InnerState >
+struct algebra_dispatcher< mpi_state< InnerState > >
+{
+    typedef mpi_nested_algebra<
+        typename algebra_dispatcher< InnerState >::algebra_type
+    > algebra_type;
+};
+
+
+}
+}
+}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mpi/mpi_vector_state.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,94 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/mpi/mpi_vector_state.hpp
+
+ [begin_description]
+ Copying a container from/to an mpi_state splits/joins it.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_VECTOR_STATE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_VECTOR_STATE_HPP_INCLUDED
+
+#include <vector>
+#include <algorithm>
+#include <boost/mpi.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/util/split_adaptor.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/mpi/mpi_state.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/** \brief Split data from some container on node 0 to the slaves.
+ * Source must be a model of Random Access Range. */
+template< class Source , class InnerState >
+struct split_impl< Source, mpi_state< InnerState >,
+    typename boost::enable_if< boost::has_range_const_iterator<Source> >::type >
+{
+    typedef typename boost::range_iterator<const Source>::type iterator;
+
+    static void split( const Source &from, mpi_state< InnerState > &to )
+    {
+        std::vector< InnerState > pieces;
+        if(to.world.rank() == 0) {
+            const size_t num = static_cast<size_t>(to.world.size());
+            pieces.resize(num);
+            for(size_t i = 0 ; i < num ; i++) {
+                iterator_range<iterator> part = detail::make_split_range(from, i, num);
+                boost::numeric::odeint::resize(pieces[i], part);
+                boost::numeric::odeint::copy(part, pieces[i]);
+            }
+        }
+        // send to nodes
+        boost::mpi::scatter(to.world, pieces, to(), 0);
+    }
+};
+
+/** \brief Merge data from an mpi_state to some container on node 0.
+ * Target must be a model Single Pass Range. */
+template< class Target, class InnerState >
+struct unsplit_impl< mpi_state< InnerState >, Target,
+    typename boost::enable_if< boost::has_range_iterator<Target> >::type >
+{
+    typedef typename boost::range_iterator<Target>::type iterator;
+
+    static void unsplit( const mpi_state< InnerState > &from , Target &to )
+    {
+        std::vector< InnerState > pieces;
+        // send data to root
+        boost::mpi::gather(from.world, from(), pieces, 0);
+        if(from.world.rank() == 0) {
+            // check target size
+            size_t total_size = 0;
+            for(size_t i = 0 ; i < pieces.size() ; i++)
+                total_size += boost::size(pieces[i]);
+            BOOST_ASSERT( total_size <= boost::size(to) );
+            // copy parts
+            iterator out = boost::begin(to);
+            for(size_t i = 0 ; i < pieces.size() ; i++)
+                out = boost::copy(pieces[i], out);
+        }
+    }
+};
+
+
+}
+}
+}
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mtl4/mtl4.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,23 @@
+/*
+ [auto_generated]
+ /boost/numeric/odeint/external/mtl4/mtl4.hpp
+
+ [begin_description]
+ includes all headers required for using mtl4 with odeint
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MTL4_MTL4_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_MTL4_MTL4_HPP_INCLUDED
+
+#include <boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/mtl4/mtl4_resize.hpp>
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_MTL4_MTL4_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,99 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp
+
+ [begin_description]
+ specialization of the algebra dispatcher for mtl4
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_MTL4_MTL4_ALGEBRA_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_MTL4_MTL4_ALGEBRA_DISPATCHER_HPP_INCLUDED
+
+#include <boost/numeric/mtl/mtl.hpp>
+
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template<typename Value, typename Parameters>
+struct algebra_dispatcher< mtl::dense_vector< Value , Parameters > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template<typename Value, typename Parameters>
+struct algebra_dispatcher< mtl::dense2D< Value , Parameters > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template<typename Value , size_t BitMask , typename Parameters>
+struct algebra_dispatcher< mtl::morton_dense< Value , BitMask, Parameters > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+template<typename Value, typename Parameters>
+struct algebra_dispatcher< mtl::compressed2D< Value , Parameters > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+// specialization of infinity norm calculation
+
+template<typename Value, typename Parameters>
+struct vector_space_norm_inf< mtl::dense_vector< Value , Parameters > >
+{
+    typedef Value result_type;
+    Value operator()( const mtl::dense_vector< Value , Parameters > &x ) const
+    {
+        return mtl::infinity_norm(x);
+    }
+};
+
+template<typename Value, typename Parameters>
+struct vector_space_norm_inf< mtl::dense2D< Value , Parameters > >
+{
+    typedef Value result_type;
+    Value operator()( const mtl::dense2D< Value , Parameters > &x ) const
+    {
+        return mtl::infinity_norm(x);
+    }
+};
+
+template<typename Value , size_t BitMask , typename Parameters>
+struct vector_space_norm_inf< mtl::morton_dense< Value , BitMask , Parameters > >
+{
+    typedef Value result_type;
+    Value operator()( const mtl::morton_dense< Value , BitMask , Parameters > &x ) const
+    {
+        return mtl::infinity_norm(x);
+    }
+};
+
+template<typename Value, typename Parameters>
+struct vector_space_norm_inf< mtl::compressed2D< Value , Parameters > >
+{
+    typedef Value result_type;
+    Value operator()( const mtl::compressed2D< Value , Parameters > &x ) const
+    {
+        return mtl::infinity_norm(x);
+    }
+};
+
+}
+}
+}
+
+#endif // BOOST_NUMERIC_ODEINT_MTL4_MTL4_ALGEBRA_DISPATCHER_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,25 @@
+//==============================================================================
+//         Copyright 2014          LRI    UMR 8623 CNRS/Univ Paris Sud XI
+//         Copyright 2014          NumScale SAS
+//
+//          Distributed under the Boost Software License, Version 1.0.
+//                 See accompanying file LICENSE.txt or copy at
+//                     http://www.boost.org/LICENSE_1_0.txt
+//==============================================================================
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_ALGEBRA_DISPATCHER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_ALGEBRA_DISPATCHER_HPP_INCLUDED
+
+#include <nt2/core/container/table/table.hpp>
+
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+namespace boost { namespace numeric { namespace odeint {
+template<typename T, typename S>
+struct algebra_dispatcher<nt2::container::table<T,S> >
+{
+  typedef vector_space_algebra algebra_type;
+};
+} } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_copy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+//==============================================================================
+//         Copyright 2014          LASMEA UMR 6602 CNRS/Univ. Clermont II
+//         Copyright 2014          LRI    UMR 8623 CNRS/Univ Paris Sud XI
+//         Copyright 2014          MetaScale SAS
+//
+//          Distributed under the Boost Software License, Version 1.0.
+//                 See accompanying file LICENSE.txt or copy at
+//                     http://www.boost.org/LICENSE_1_0.txt
+//==============================================================================
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_COPY_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_COPY_HPP_INCLUDED
+
+#include <nt2/core/container/table/table.hpp>
+
+#include <boost/numeric/odeint/util/copy.hpp>
+
+namespace boost { namespace numeric { namespace odeint {
+
+template<typename T, typename S>
+struct copy_impl< nt2::container::table<T,S>
+                , nt2::container::table<T,S>
+                >
+{
+  static void copy ( const nt2::container::table<T,S> &v1
+                   , nt2::container::table<T,S> &v2
+                   )
+  {
+    v2 = v1;
+  }
+};
+} } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_norm_inf.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+//==============================================================================
+//         Copyright 2014          LRI    UMR 8623 CNRS/Univ Paris Sud XI
+//         Copyright 2014          NumScale SAS
+//
+//          Distributed under the Boost Software License, Version 1.0.
+//                 See accompanying file LICENSE.txt or copy at
+//                     http://www.boost.org/LICENSE_1_0.txt
+//==============================================================================
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_NORM_INF_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_NORM_INF_HPP_INCLUDED
+
+#include <nt2/core/container/table/table.hpp>
+#include <nt2/include/functions/globalmax.hpp>
+#include <nt2/include/functions/abs.hpp>
+
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+
+namespace boost { namespace numeric { namespace odeint
+{
+  template<typename T, typename S>
+  struct vector_space_norm_inf<nt2::container::table<T,S> >
+  {
+    typedef T result_type;
+    result_type operator()(const nt2::container::table<T,S> &v1) const
+    {
+      return nt2::globalmax(nt2::abs(v1));
+    }
+  };
+} } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/nt2/nt2_resize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+//==============================================================================
+//         Copyright 2014          LRI    UMR 8623 CNRS/Univ Paris Sud XI
+//         Copyright 2014          NumScale SAS
+//
+//          Distributed under the Boost Software License, Version 1.0.
+//                 See accompanying file LICENSE.txt or copy at
+//                     http://www.boost.org/LICENSE_1_0.txt
+//==============================================================================
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_RESIZE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_NT2_NT2_RESIZE_HPP_INCLUDED
+
+#include <nt2/core/container/table/table.hpp>
+
+#include <boost/numeric/odeint/util/same_size.hpp>
+
+namespace boost { namespace numeric { namespace odeint {
+
+template<typename T, typename S>
+struct is_resizeable< nt2::container::table<T,S> >
+{
+  typedef boost::true_type type;
+  static const bool value = type::value;
+};
+
+template<typename T, typename S>
+struct same_size_impl< nt2::container::table<T,S>
+                     , nt2::container::table<T,S>
+                     >
+{
+  static bool same_size ( const nt2::container::table<T,S> &v1
+                        , const nt2::container::table<T,S> &v2
+                        )
+  {
+    return v1.extent() == v2.extent();
+  }
+};
+
+template<typename T, typename S>
+struct resize_impl< nt2::container::table<T,S>
+                  , nt2::container::table<T,S>
+                  >
+{
+  static void resize ( nt2::container::table<T,S> &v1
+                     , const nt2::container::table<T,S> &v2
+                     )
+  {
+    v1.resize( v2.extent() );
+  }
+};
+} } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/openmp/openmp.hpp
+
+ [begin_description]
+ Wrappers for OpenMP.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_HPP_INCLUDED
+
+// level 1: parallel iteration over random access container
+#include <boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp>
+
+// level 2: split range state
+#include <boost/numeric/odeint/external/openmp/openmp_state.hpp>
+
+// level 3: process a random access container of sub-states in parallel
+#include <boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,281 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp
+
+ [begin_description]
+ Nested parallelized algebra for OpenMP.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_NESTED_ALGEBRA_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_NESTED_ALGEBRA_HPP_INCLUDED
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+#include <boost/numeric/odeint/algebra/norm_result_type.hpp>
+#include <boost/numeric/odeint/util/n_ary_helper.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/** \brief OpenMP-parallelized algebra, wrapping another, non-parallelized algebra.
+ *
+ * NestedState must be a model of Random Access Range, where the elements are sub-states
+ * which will be processed in parallel.
+ */
+template< class InnerAlgebra >
+struct openmp_nested_algebra
+{
+
+#if __cplusplus >= 201103L // C++11 supports _Pragma
+
+#define BOOST_ODEINT_GEN_LOCAL(z, n, unused) \
+    BOOST_ASSERT_MSG( len == boost::size(s ## n), "All nested state ranges must have the same size." ); \
+    typename boost::range_iterator<S ## n>::type beg ## n = boost::begin(s ## n);
+#define BOOST_ODEINT_GEN_BODY(n) \
+    const size_t len = boost::size(s0); \
+    BOOST_PP_REPEAT(n, BOOST_ODEINT_GEN_LOCAL, ~) \
+    _Pragma("omp parallel for schedule(runtime)") \
+    for( size_t i = 0 ; i < len ; i++ ) \
+        InnerAlgebra::for_each##n( \
+            BOOST_PP_ENUM_BINARY_PARAMS(n, beg, [i] BOOST_PP_INTERCEPT) , \
+            op \
+        );
+BOOST_ODEINT_GEN_FOR_EACH(BOOST_ODEINT_GEN_BODY)
+#undef BOOST_ODEINT_GEN_BODY
+#undef BOOST_ODEINT_GEN_LOCAL
+
+#else
+
+    template< class S0 , class Op > static void for_each1 ( S0 &s0 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each1( beg0 [i] , op );
+    }
+    template< class S0 , class S1 , class Op > static void for_each2 ( S0 &s0 , S1 &s1 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each2( beg0 [i] , beg1 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class Op > static void for_each3 ( S0 &s0 , S1 &s1 , S2 &s2 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each3( beg0 [i] , beg1 [i] , beg2 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class Op > static void for_each4 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each4( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class Op > static void for_each5 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each5( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class Op > static void for_each6 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each6( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op > static void for_each7 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each7( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class Op > static void for_each8 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each8( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class Op > static void for_each9 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each9( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class Op > static void for_each10 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each10( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class Op > static void for_each11 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each11( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class Op > static void for_each12 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each12( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op > static void for_each13 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each13( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op > static void for_each14 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        typename boost::range_iterator<S13>::type beg13 = boost::begin(s13);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each14( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] , beg13 [i] , op );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op > static void for_each15 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        typename boost::range_iterator<S13>::type beg13 = boost::begin(s13);
+        typename boost::range_iterator<S14>::type beg14 = boost::begin(s14);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) InnerAlgebra::for_each15( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] , beg13 [i] , beg14 [i] , op );
+    }
+
+#endif
+
+
+    template< class NestedState >
+    static typename norm_result_type< typename NestedState::value_type >::type norm_inf( const NestedState &s )
+    {
+        typedef typename boost::range_iterator<const NestedState>::type iterator;
+        typedef typename std::iterator_traits<iterator>::value_type value_type;
+        typedef typename norm_result_type<value_type>::type result_type;
+        result_type init = static_cast< result_type >( 0 );
+        const size_t len = boost::size(s);
+        iterator beg = boost::begin(s);
+#       pragma omp parallel for reduction(max: init) schedule(dynamic)
+        for( size_t i = 0 ; i < len ; i++ )
+            init = (std::max)( init , InnerAlgebra::norm_inf( beg[i] ) );
+        return init;
+    }
+
+};
+
+
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,276 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp
+
+ [begin_description]
+ Range algebra for OpenMP.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_RANGE_ALGEBRA_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_RANGE_ALGEBRA_HPP_INCLUDED
+
+#include <boost/assert.hpp>
+#include <boost/range.hpp>
+#include <boost/numeric/odeint/algebra/norm_result_type.hpp>
+#include <boost/numeric/odeint/util/n_ary_helper.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/** \brief OpenMP-parallelized range algebra.
+ *
+ * State must be a model of Random Access Range.
+ */
+struct openmp_range_algebra
+{
+
+#if __cplusplus >= 201103L // C++11 supports _Pragma
+
+#define BOOST_ODEINT_GEN_LOCAL(z, n, unused) \
+    BOOST_ASSERT_MSG( len == boost::size(s ## n), "All state ranges must have the same size." ); \
+    typename boost::range_iterator<S ## n>::type beg ## n = boost::begin(s ## n);
+#define BOOST_ODEINT_GEN_BODY(n) \
+    const size_t len = boost::size(s0); \
+    BOOST_PP_REPEAT(n, BOOST_ODEINT_GEN_LOCAL, ~) \
+    _Pragma("omp parallel for schedule(runtime)") \
+    for( size_t i = 0 ; i < len ; i++ ) \
+        op( BOOST_PP_ENUM_BINARY_PARAMS(n, beg, [i] BOOST_PP_INTERCEPT) );
+BOOST_ODEINT_GEN_FOR_EACH(BOOST_ODEINT_GEN_BODY)
+#undef BOOST_ODEINT_GEN_BODY
+#undef BOOST_ODEINT_GEN_LOCAL
+
+#else
+
+    template< class S0 , class Op > static void for_each1 ( S0 &s0 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] );
+    }
+    template< class S0 , class S1 , class Op > static void for_each2 ( S0 &s0 , S1 &s1 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class Op > static void for_each3 ( S0 &s0 , S1 &s1 , S2 &s2 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class Op > static void for_each4 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class Op > static void for_each5 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class Op > static void for_each6 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op > static void for_each7 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class Op > static void for_each8 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class Op > static void for_each9 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class Op > static void for_each10 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class Op > static void for_each11 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class Op > static void for_each12 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op > static void for_each13 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op > static void for_each14 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        typename boost::range_iterator<S13>::type beg13 = boost::begin(s13);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] , beg13 [i] );
+    }
+    template< class S0 , class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op > static void for_each15 ( S0 &s0 , S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op ) {
+        const size_t len = boost::size(s0);
+        typename boost::range_iterator<S0>::type beg0 = boost::begin(s0);
+        typename boost::range_iterator<S1>::type beg1 = boost::begin(s1);
+        typename boost::range_iterator<S2>::type beg2 = boost::begin(s2);
+        typename boost::range_iterator<S3>::type beg3 = boost::begin(s3);
+        typename boost::range_iterator<S4>::type beg4 = boost::begin(s4);
+        typename boost::range_iterator<S5>::type beg5 = boost::begin(s5);
+        typename boost::range_iterator<S6>::type beg6 = boost::begin(s6);
+        typename boost::range_iterator<S7>::type beg7 = boost::begin(s7);
+        typename boost::range_iterator<S8>::type beg8 = boost::begin(s8);
+        typename boost::range_iterator<S9>::type beg9 = boost::begin(s9);
+        typename boost::range_iterator<S10>::type beg10 = boost::begin(s10);
+        typename boost::range_iterator<S11>::type beg11 = boost::begin(s11);
+        typename boost::range_iterator<S12>::type beg12 = boost::begin(s12);
+        typename boost::range_iterator<S13>::type beg13 = boost::begin(s13);
+        typename boost::range_iterator<S14>::type beg14 = boost::begin(s14);
+        #pragma omp parallel for schedule(runtime)
+        for( size_t i = 0 ; i < len ; i++ ) op( beg0 [i] , beg1 [i] , beg2 [i] , beg3 [i] , beg4 [i] , beg5 [i] , beg6 [i] , beg7 [i] , beg8 [i] , beg9 [i] , beg10 [i] , beg11 [i] , beg12 [i] , beg13 [i] , beg14 [i] );
+    }
+
+#endif
+
+
+    template< class S >
+    static typename norm_result_type< S >::type norm_inf( const S &s )
+    {
+        using std::max;
+        using std::abs;
+        typedef typename norm_result_type< S >::type result_type;
+        result_type init = static_cast< result_type >( 0 );
+        const size_t len = boost::size(s);
+        typename boost::range_iterator<S>::type beg = boost::begin(s);
+#       pragma omp parallel for reduction(max: init) schedule(dynamic)
+        for( size_t i = 0 ; i < len ; ++i )
+            init = max( init , abs( beg[i] ) );
+        return init;
+    }
+
+};
+
+
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/openmp/openmp_state.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,171 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/openmp/openmp_state.hpp
+
+ [begin_description]
+ Wrappers for OpenMP.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_STATE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_OPENMP_OPENMP_STATE_HPP_INCLUDED
+
+#include <omp.h>
+#include <vector>
+#include <algorithm>
+#include <boost/range/adaptor/sliced.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/util/split.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
+#include <boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/** \brief A container that is split into distinct parts, for threading.
+ * Just a wrapper for vector<vector<T>>, use `copy` for splitting/joining.
+ */
+template< class T >
+struct openmp_state : public std::vector< std::vector< T > >
+{
+    openmp_state() {}
+
+    openmp_state(size_t n, const std::vector<T>& val = std::vector<T>())
+    : std::vector< std::vector< T > >(n, val) {}
+
+    template<class InputIterator>
+    openmp_state(InputIterator first, InputIterator last)
+    : std::vector< std::vector< T > >(first, last) {}
+
+    openmp_state(const std::vector< std::vector< T > > &orig)
+    : std::vector< std::vector< T > >(orig) {}
+
+};
+
+
+
+
+template< class T >
+struct is_resizeable< openmp_state< T > > : boost::true_type { };
+
+
+template< class T >
+struct same_size_impl< openmp_state< T > , openmp_state< T > >
+{
+    static bool same_size( const openmp_state< T > &x , const openmp_state< T > &y )
+    {
+        if( x.size() != y.size() ) return false;
+        for( size_t i = 0 ; i != x.size() ; i++ )
+            if( x[i].size() != y[i].size() ) return false;
+        return true;
+    }
+};
+
+
+template< class T >
+struct resize_impl< openmp_state< T > , openmp_state< T > >
+{
+    static void resize( openmp_state< T > &x , const openmp_state< T > &y )
+    {
+        x.resize( y.size() );
+#       pragma omp parallel for schedule(dynamic)
+        for(size_t i = 0 ; i < x.size() ; i++)
+            x[i].resize( y[i].size() );
+    }
+};
+
+
+/** \brief Copy data between openmp_states of same size. */
+template< class T >
+struct copy_impl< openmp_state< T >, openmp_state< T > >
+{
+    static void copy( const openmp_state< T > &from, openmp_state< T > &to )
+    {
+#       pragma omp parallel for schedule(dynamic)
+        for(size_t i = 0 ; i < from.size() ; i++)
+            std::copy( from[i].begin() , from[i].end() , to.begin() );
+    }
+};
+
+
+
+/** \brief Copy data from some container to an openmp_state and resize it.
+ * Target container size will determine number of blocks to split into.
+ * If it is empty, it will be resized to the maximum number of OpenMP threads.
+ * SourceContainer must support `s::value_type`, `s::const_iterator`, `s.begin()`, `s.end()` and `s.size()`,
+ * with Random Access Iterators; i.e. it must be a Random Access Container. */
+template< class SourceContainer >
+struct split_impl< SourceContainer, openmp_state< typename SourceContainer::value_type > >
+{
+    static void split( const SourceContainer &from, openmp_state< typename SourceContainer::value_type > &to )
+    {
+        if(to.size() == 0) to.resize( omp_get_max_threads() );
+        const size_t part = from.size() / to.size();
+#       pragma omp parallel for schedule(dynamic)
+        for(size_t i = 0 ; i < to.size() ; i++) {
+            typedef typename SourceContainer::const_iterator it_t;
+            const it_t begin = from.begin() + i * part;
+            it_t end = begin + part;
+            // for cases where from.size() % to.size() > 0
+            if(i + 1 == to.size() || end > from.end()) end = from.end();
+            to[i].resize(end - begin);
+            std::copy(begin, end, to[i].begin());
+        }
+    }
+};
+
+/** \brief Copy data from an openmp_state to some container and resize it.
+ * TargetContainer must support `s::value_type`, `s::iterator`, `s.begin()` and `s.resize(n)`,
+ * i.e. it must be a `std::vector`. */
+template< class TargetContainer >
+struct unsplit_impl< openmp_state< typename TargetContainer::value_type >, TargetContainer >
+{
+    static void unsplit( const openmp_state< typename TargetContainer::value_type > &from , TargetContainer &to )
+    {
+        // resize target
+        size_t total_size = 0;
+        for(size_t i = 0 ; i < from.size() ; i++)
+            total_size += from[i].size();
+        to.resize( total_size );
+        // copy parts
+        typename TargetContainer::iterator out = to.begin();
+        for(size_t i = 0 ; i < from.size() ; i++)
+            out = std::copy(from[i].begin(), from[i].end(), out);
+    }
+};
+
+
+
+
+/** \brief OpenMP-parallelized algebra.
+ * For use with openmp_state.
+ */
+typedef openmp_nested_algebra< range_algebra > openmp_algebra;
+
+
+
+/** \brief Use `openmp_algebra` for `openmp_state`. */
+template< class T >
+struct algebra_dispatcher< openmp_state< T > >
+{
+    typedef openmp_algebra algebra_type;
+};
+
+
+}
+}
+}
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/thrust/thrust.hpp
+
+  [begin_description]
+  includes all headers required for using odeint with thrust
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_HPP_DEFINED
+
+#include <boost/numeric/odeint/external/thrust/thrust_algebra.hpp>
+#include <boost/numeric/odeint/external/thrust/thrust_operations.hpp>
+#include <boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp>
+#include <boost/numeric/odeint/external/thrust/thrust_resize.hpp>
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp
+
+  [begin_description]
+  algebra_dispatcher specialization for thrust
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_ALGEBRA_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_ALGEBRA_DISPATCHER_HPP_DEFINED
+
+#include <thrust/host_vector.h>
+#include <thrust/device_vector.h>
+
+#include <boost/numeric/odeint/external/thrust/thrust_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+// specializations for the standard thrust containers
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for thrust host_vector
+template< class T , class A >
+struct algebra_dispatcher< thrust::host_vector< T , A > >
+{
+    typedef thrust_algebra algebra_type;
+};
+
+// specialization for thrust device_vector
+template< class T , class A >
+struct algebra_dispatcher< thrust::device_vector< T , A > >
+{
+    typedef thrust_algebra algebra_type;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+// add support for thrust backend vectors, if available
+
+#include <thrust/version.h>
+
+#if THRUST_VERSION >= 100600
+
+// specialization for thrust cpp vector
+#include <thrust/system/cpp/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct algebra_dispatcher< thrust::cpp::vector< T , A > >
+    {
+        typedef thrust_algebra algebra_type;
+    };
+} } }
+
+// specialization for thrust omp vector
+#ifdef _OPENMP
+#include <thrust/system/omp/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct algebra_dispatcher< thrust::omp::vector< T , A > >
+    {
+        typedef thrust_algebra algebra_type;
+    };
+} } }
+#endif // _OPENMP
+
+// specialization for thrust tbb vector
+#ifdef TBB_VERSION_MAJOR
+#include <thrust/system/tbb/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct algebra_dispatcher< thrust::tbb::vector< T , A > >
+    {
+        typedef thrust_algebra algebra_type;
+    };
+} } }
+#endif // TBB_VERSION_MAJOR
+
+// specialization for thrust cuda vector
+#ifdef __CUDACC__
+#include <thrust/system/cuda/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct algebra_dispatcher< thrust::cuda::vector< T , A > >
+    {
+        typedef thrust_algebra algebra_type;
+    };
+} } }
+#endif // __CUDACC__
+
+#endif // THRUST_VERSION >= 100600
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_ALGEBRA_DISPATCHER_HPP_DEFINED
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp
+
+  [begin_description]
+  operations_dispatcher specialization for thrust
+  [end_description]
+
+  Copyright 2013-2014 Karsten Ahnert
+  Copyright 2013-2014 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_DISPATCHER_HPP_DEFINED
+
+#include <thrust/host_vector.h>
+#include <thrust/device_vector.h>
+
+#include <boost/numeric/odeint/external/thrust/thrust_operations.hpp>
+#include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
+
+// support for the standard thrust containers
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for thrust host_vector
+template< class T , class A >
+struct operations_dispatcher< thrust::host_vector< T , A > >
+{
+    typedef thrust_operations operations_type;
+};
+
+// specialization for thrust device_vector
+template< class T , class A >
+struct operations_dispatcher< thrust::device_vector< T , A > >
+{
+    typedef thrust_operations operations_type;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+// add support for thrust backend vectors, if available
+
+#include <thrust/version.h>
+
+#if THRUST_VERSION >= 100600
+
+// specialization for thrust cpp vector
+#include <thrust/system/cpp/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct operations_dispatcher< thrust::cpp::vector< T , A > >
+    {
+        typedef thrust_operations operations_type;
+    };
+} } }
+
+// specialization for thrust omp vector
+#ifdef _OPENMP
+#include <thrust/system/omp/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct operations_dispatcher< thrust::omp::vector< T , A > >
+    {
+        typedef thrust_operations operations_type;
+    };
+} } }
+#endif // _OPENMP
+
+// specialization for thrust tbb vector
+#ifdef TBB_VERSION_MAJOR
+#include <thrust/system/tbb/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct operations_dispatcher< thrust::tbb::vector< T , A > >
+    {
+        typedef thrust_operations operations_type;
+    };
+} } }
+#endif // TBB_VERSION_MAJOR
+
+// specialization for thrust cuda vector
+#ifdef __CUDACC__
+#include <thrust/system/cuda/vector.h>
+namespace boost { namespace numeric { namespace odeint {
+    template< class T , class A >
+    struct operations_dispatcher< thrust::cuda::vector< T , A > >
+    {
+        typedef thrust_operations operations_type;
+    };
+} } }
+#endif // __CUDACC__
+
+#endif // THRUST_VERSION >= 100600
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_DISPATCHER_HPP_DEFINED
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/vexcl/vexcl.hpp
+
+  [begin_description]
+  includes all headers required for using vexcl in odeint
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_HPP_DEFINED
+
+#include <boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/external/vexcl/vexcl_resize.hpp>
+#include <boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp>
+#include <boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp>
+#include <boost/numeric/odeint/external/vexcl/vexcl_abs.hpp>
+#include <boost/numeric/odeint/external/vexcl/vexcl_copy.hpp>
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_abs.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,61 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/vexcl/vexcl_abs.hpp
+
+  [begin_description]
+  abs() specialization for vexcl
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ABS_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ABS_HPP_DEFINED
+
+#include <vexcl/vector.hpp>
+#include <vexcl/multivector.hpp>
+#include <vexcl/operations.hpp>
+
+namespace vex {
+
+template <typename T, size_t N>
+typename std::enable_if<
+    std::is_integral<T>::value,
+    typename boost::proto::result_of::make_expr<
+        boost::proto::tag::function,
+        abs_func,
+        const vex::multivector<T, N>&
+    >::type const
+>::type
+abs(const multivector<T, N> &arg) {
+    return boost::proto::make_expr<boost::proto::tag::function>(
+            abs_func(),
+            boost::ref(arg)
+            );
+}
+
+template <typename T, size_t N>
+typename std::enable_if<
+    !std::is_integral<T>::value,
+    typename boost::proto::result_of::make_expr<
+        boost::proto::tag::function,
+        fabs_func,
+        const vex::multivector<T, N>&
+    >::type const
+>::type
+abs(const multivector<T, N> &arg) {
+    return boost::proto::make_expr<boost::proto::tag::function>(
+            fabs_func(),
+            boost::ref(arg)
+            );
+}
+
+} // namespace vex
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ABS_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp
+
+  [begin_description]
+  algebra_dispatcher specialization for vexcl
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ALGEBRA_DISPATCHER_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ALGEBRA_DISPATCHER_HPP_DEFINED
+
+#include <vexcl/vector.hpp>
+#include <vexcl/multivector.hpp>
+
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for vexcl vector
+template< typename T >
+struct algebra_dispatcher< vex::vector< T > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+// specialization for vexcl multivector
+template< typename T , size_t N >
+struct algebra_dispatcher< vex::multivector< T , N > >
+{
+    typedef vector_space_algebra algebra_type;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_ALGEBRA_DISPATCHER_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_copy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/vexcl/vexcl_copy.hpp
+
+ [begin_description]
+ copy_impl specializations for vexcl
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_COPY_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_COPY_HPP_INCLUDED
+
+#include <vexcl/vector.hpp>
+#include <vexcl/multivector.hpp>
+
+#include <boost/numeric/odeint/util/copy.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< typename T1, typename T2 >
+struct copy_impl< vex::vector<T1>, vex::vector<T2> >
+{
+    static void copy( const vex::vector<T1> &from , vex::vector<T2> &to )
+    {
+        to = from;
+    }
+};
+
+template< typename T1, typename T2, size_t N >
+struct copy_impl< vex::multivector<T1, N>, vex::multivector<T2, N> >
+{
+    static void copy( const vex::multivector<T1, N> &from , vex::multivector<T2, N> &to )
+    {
+        to = from;
+    }
+};
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_COPY_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,68 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp
+
+  [begin_description]
+  vector_space_norm_inf specialization for vexcl
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_NORM_INF_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_NORM_INF_HPP_DEFINED
+
+#include <map>
+#include <algorithm>
+
+#include <vexcl/vector.hpp>
+#include <vexcl/multivector.hpp>
+#include <vexcl/reductor.hpp>
+
+#include <boost/numeric/odeint/algebra/vector_space_algebra.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialization for vexcl vector
+template <typename T>
+struct vector_space_norm_inf< vex::vector<T> > {
+    typedef T result_type;
+
+    T operator()( const vex::vector<T> &x ) const {
+        const auto &max = vex::get_reductor<T, vex::MAX>(x.queue_list());
+
+        return max( fabs(x) );
+    }
+};
+
+// specialization for vexcl multivector
+template <typename T, size_t N>
+struct vector_space_norm_inf< vex::multivector<T, N> > {
+    typedef T result_type;
+
+    T operator()( const vex::multivector<T, N> &x ) const {
+        const auto &max = vex::get_reductor<T, vex::MAX>(x.queue_list());
+
+        // Reducing a multivector results in std::array<T, N>:
+        auto m = max( fabs(x) );
+
+        // We will need to reduce it even further:
+        return *std::max_element(m.begin(), m.end());
+    }
+};
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_NORM_INF_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,58 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp
+
+ [begin_description]
+ Check if two VexCL containers are the same instance.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_SAME_INSTANCE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_SAME_INSTANCE_HPP_INCLUDED
+
+#include <vexcl/vector.hpp>
+#include <vexcl/multivector.hpp>
+
+#include <boost/numeric/odeint/util/same_instance.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template <typename T>
+struct same_instance_impl< vex::vector<T> , vex::vector<T> >
+{
+    static bool same_instance( const vex::vector<T> &x1 , const vex::vector<T> &x2 )
+    {
+        return
+            static_cast<const vex::vector<T>*>(&x1) ==
+            static_cast<const vex::vector<T>*>(&x2);
+    }
+};
+
+template <typename T, size_t N>
+struct same_instance_impl< vex::multivector<T, N> , vex::multivector<T, N> >
+{
+    static bool same_instance( const vex::multivector<T, N> &x1 , const vex::multivector<T, N> &x2 )
+    {
+        return
+            static_cast<const vex::multivector<T, N>*>(&x1) ==
+            static_cast<const vex::multivector<T, N>*>(&x2);
+    }
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VEXCL_VEXCL_SAME_INSTANCE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/integrate/detail/functors.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/functors.hpp
+
+ [begin_description]
+ some functors for the iterator based integrate routines
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
+
+#include <utility>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+
+template< class Observer >
+struct obs_caller {
+
+    size_t &m_n;
+    Observer m_obs;
+
+    obs_caller( size_t &m , Observer &obs ) : m_n(m) , m_obs( obs ) {}
+
+    template< class State , class Time >
+    void operator()( std::pair< const State & , const Time & > x )
+    {
+        typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+        observer_type &obs = m_obs;
+        obs( x.first , x.second );
+        m_n++;
+    }
+};
+
+template< class Observer , class Time >
+struct obs_caller_time {
+
+    Time &m_t;
+    Observer m_obs;
+
+    obs_caller_time( Time &t , Observer &obs ) : m_t(t) , m_obs( obs ) {}
+
+    template< class State >
+    void operator()( std::pair< const State & , const Time & > x )
+    {
+        typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+        observer_type &obs = m_obs;
+        obs( x.first , x.second );
+        m_t = x.second;
+    }
+};
+
+} // namespace detail
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/adaptive_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,183 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/adaptive_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating throught the solution of an ODE with adaptive step size. The dereferenced types containes also the time.
+ [end_description]
+
+ Copyright 2012-2013 Karsten Ahnert
+ Copyright 2012 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_ITERATOR_HPP_INCLUDED
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+    /* use the adaptive_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class adaptive_iterator : public adaptive_iterator_impl<
+            adaptive_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef adaptive_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        adaptive_iterator( Stepper stepper , System sys , State &s , time_type t_start , time_type t_end , time_type dt )
+            : adaptive_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        adaptive_iterator( Stepper stepper , System sys , State &s )
+            : adaptive_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+
+
+
+    template< class Stepper , class System , class State >
+    adaptive_iterator< Stepper , System , State > make_adaptive_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return adaptive_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt );
+    }
+
+
+    template< class Stepper , class System , class State >
+    adaptive_iterator< Stepper , System , State > make_adaptive_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return adaptive_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+
+    template< class Stepper , class System , class State >
+    std::pair< adaptive_iterator< Stepper , System , State > , adaptive_iterator< Stepper , System , State > >
+    make_adaptive_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            adaptive_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt ) ,
+            adaptive_iterator< Stepper , System , State >( stepper , system , x )
+            );
+    }
+
+    /**
+     * \class adaptive_iterator
+     *
+     * \brief ODE Iterator with adaptive step size. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an iterator representing the solution of an ODE from t_start
+     * to t_end evaluated at steps with an adaptive step size dt.
+     * After each iteration the iterator dereferences to the state x at the next
+     * time t+dt where dt is controlled by the stepper.
+     * This iterator can be used with ControlledSteppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_adaptive routine.
+     *
+     * adaptive_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+
+
+
+
+    /**
+     * \fn make_adaptive_iterator_begin( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for adaptive_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The adaptive iterator.
+     */
+
+
+    /**
+     * \fn make_adaptive_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for adaptive_iterator. Constructs a end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state.
+     * \returns The adaptive iterator.
+     */
+
+
+    /**
+     * \fn make_adaptive_range( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function to construct a single pass range of adaptive iterators. A range is here a pair of adaptive_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The adaptive range.
+     */
+
+
+
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/adaptive_time_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,175 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/adaptive_time_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating throught the solution of an ODE with adaptive step size. The dereferenced types containes also the time.
+ [end_description]
+
+ Copyright 2012-2013 Karsten Ahnert
+ Copyright 2012-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_TIME_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_TIME_ITERATOR_HPP_INCLUDED
+
+
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+    /* use the adaptive_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class adaptive_time_iterator : public adaptive_iterator_impl<
+            adaptive_time_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef adaptive_time_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        adaptive_time_iterator( Stepper stepper , System sys , State &s , time_type t_start , time_type t_end , time_type dt )
+            : adaptive_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        adaptive_time_iterator( Stepper stepper , System sys , State &s )
+            : adaptive_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+
+
+
+    template< class Stepper , class System , class State >
+    adaptive_time_iterator< Stepper , System , State > make_adaptive_time_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return adaptive_time_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt );
+    }
+
+    template< class Stepper , class System , class State >
+    adaptive_time_iterator< Stepper , System , State > make_adaptive_time_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return adaptive_time_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+
+    template< class Stepper , class System , class State >
+    std::pair< adaptive_time_iterator< Stepper , System , State > , adaptive_time_iterator< Stepper , System , State > >
+    make_adaptive_time_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            adaptive_time_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt ) ,
+            adaptive_time_iterator< Stepper , System , State >( stepper , system , x ) );
+    }
+
+
+
+    /**
+     * \class adaptive_time_iterator
+     *
+     * \brief ODE Iterator with adaptive step size. The value type of this iterator is a std::pair containing state and time.
+     *
+     * Implements an iterator representing the solution of an ODE from t_start
+     * to t_end evaluated at steps with an adaptive step size dt.
+     * After each iteration the iterator dereferences to a pair containing state
+     * and time at the next time point t+dt where dt is controlled by the stepper.
+     * This iterator can be used with ControlledSteppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_adaptive routine.
+     *
+     * adaptive_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is a std::pair of  state and time of the stepper.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+
+    /**
+     * \fn make_adaptive_time_iterator_begin( Stepper stepper , System system , State &x ,
+         typename traits::time_type< Stepper >::type t_start ,
+         typename traits::time_type< Stepper >::type t_end ,
+         typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for adaptive_time_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The adaptive time iterator.
+     */
+
+
+    /**
+     * \fn make_adaptive_time_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for adaptive_time_iterator. Constructs a end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The adaptive time iterator.
+     */
+
+
+    /**
+     * \fn make_adaptive_time_range( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function to construct a single pass range of adaptive time iterators. A range is here a pair of adaptive_time_iterators.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The adaptive time range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_ADAPTIVE_TIME_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/const_step_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,180 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/const_step_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating through the solution of an ODE with constant step size.
+ [end_description]
+
+ Copyright 2012-2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_ODE_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_ODE_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    /* use the const_step_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+    , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class const_step_iterator : public const_step_iterator_impl<
+            const_step_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef const_step_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        const_step_iterator( Stepper stepper , System sys , State &s , time_type t_start , time_type t_end , time_type dt )
+            : const_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        const_step_iterator( Stepper stepper , System sys , State &s )
+            : const_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    /* make functions */
+
+    template< class Stepper , class System , class State >
+    const_step_iterator< Stepper , System, State > make_const_step_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return const_step_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt );
+    }
+
+    template< class Stepper , class System , class State >
+    const_step_iterator< Stepper , System , State > make_const_step_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return const_step_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+    template< class Stepper , class System , class State >
+    std::pair< const_step_iterator< Stepper , System , State > , const_step_iterator< Stepper , System , State > >
+    make_const_step_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            const_step_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt ) ,
+            const_step_iterator< Stepper , System , State >( stepper , system , x )
+            );
+    }
+
+
+
+    /**
+     * \class const_step_iterator
+     *
+     * \brief ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an iterator representing the solution of an ODE from t_start
+     * to t_end evaluated at steps with constant step size dt.
+     * After each iteration the iterator dereferences to the state x at the next
+     * time t+dt.
+     * This iterator can be used with Steppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_const routine.
+     *
+     * const_step_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+    /**
+     * \fn make_const_step_iterator_begin(
+        Stepper stepper ,
+        System system ,
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for const_step_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The const step iterator.
+     */
+
+
+    /**
+     * \fn make_const_step_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for const_step_iterator. Constructs a end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The const_step_iterator.
+     */
+
+
+    /**
+     * \fn make_const_step_range( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function to construct a single pass range of const step iterators. A range is here a pair
+     * of const_step_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator store a reference of s and changes its value during the iteration.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The const step range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+//#include <boost/numeric/odeint/iterator/impl/const_step_iterator_dense_output_impl.hpp>
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_ODE_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/const_step_time_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,173 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/const_step_time_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating throught the solution of an ODE with constant step size. The dereferences types containes also the time.
+ [end_description]
+
+ Copyright 2012-2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_TIME_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_TIME_ITERATOR_HPP_INCLUDED
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+    /* use the const_step_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class const_step_time_iterator : public const_step_iterator_impl<
+            const_step_time_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef const_step_time_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        const_step_time_iterator( Stepper stepper , System sys , State &s , time_type t_start , time_type t_end , time_type dt )
+            : const_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        const_step_time_iterator( Stepper stepper , System sys , State &s )
+            : const_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    template< class Stepper , class System , class State >
+    const_step_time_iterator< Stepper , System , State > make_const_step_time_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return const_step_time_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt );
+    }
+
+    template< class Stepper , class System , class State >
+    const_step_time_iterator< Stepper , System , State > make_const_step_time_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return const_step_time_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+
+    template< class Stepper , class System , class State >
+    std::pair< const_step_time_iterator< Stepper , System , State > , const_step_time_iterator< Stepper , System , State > >
+    make_const_step_time_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            const_step_time_iterator< Stepper , System , State >( stepper , system , x , t_start , t_end , dt ) ,
+            const_step_time_iterator< Stepper , System , State >( stepper , system , x ) );
+    }
+
+    /**
+     * \class const_step_time_iterator
+     *
+     * \brief ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time.
+     *
+     * Implements an iterator representing the solution of an ODE from t_start
+     * to t_end evaluated at steps with constant step size dt.
+     * After each iteration the iterator dereferences to a pair containing
+     * state and time at the next time point t+dt..
+     * This iterator can be used with Steppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_const routine.
+     *
+     * const_step_time_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is a pair with the state type and time type of the stepper.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+    /**
+     * \fn make_const_step_time_iterator_begin( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for const_step_time_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The const step time iterator.
+     */
+
+
+    /**
+     * \fn make_const_step_time_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for const_step_time_iterator. Constructs a end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_time_iterator store a reference of s and changes its value during the iteration.
+     * \returns The const step time iterator.
+     */
+
+
+    /**
+     * \fn make_const_step_time_range( Stepper stepper , System system , State &x ,
+        typename traits::time_type< Stepper >::type t_start ,
+        typename traits::time_type< Stepper >::type t_end ,
+        typename traits::time_type< Stepper >::type dt)
+     *
+     * \brief Factory function to construct a single pass range of const_step_time_iterator. A range is here a pair of const_step_time_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration.
+     * \param t The initial time.
+     * \param t_end The end time, at which the iteration should stop.
+     * \param dt The initial time step.
+     * \returns The const step time range.
+     */
+
+
+
+
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_CONST_STEP_TIME_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,199 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp
+
+ [begin_description]
+ Base class for const_step_iterator and adaptive_iterator.
+ [end_description]
+
+ Copyright 2012-2013 Karsten Ahnert
+ Copyright 2012-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
+
+#include <boost/iterator/iterator_facade.hpp>
+
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+    struct ode_state_iterator_tag {};
+    struct ode_state_time_iterator_tag {};
+
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class ode_iterator_base;
+
+
+    /* Specialization for the state iterator that has only state_type as its value_type */
+    template< class Iterator , class Stepper , class System , class State >
+    class ode_iterator_base< Iterator , Stepper , System , State , ode_state_iterator_tag >
+        : public boost::iterator_facade
+          <
+              Iterator ,
+              typename traits::state_type< Stepper >::type const ,
+              boost::single_pass_traversal_tag
+          >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename unwrapped_stepper_type::time_type time_type;
+        typedef typename unwrapped_stepper_type::value_type ode_value_type;
+
+    public:
+   
+        ode_iterator_base( stepper_type stepper , system_type sys , time_type t , time_type dt )
+            : m_stepper( stepper ) , m_system( sys ) ,
+              m_t( t ) , m_dt( dt ) , m_at_end( false )
+        { }
+
+        ode_iterator_base( stepper_type stepper , system_type sys )
+            : m_stepper( stepper ) , m_system( sys ) ,
+              m_t() , m_dt() , m_at_end( true )
+        { }
+
+        // this function is only for testing
+        bool same( const ode_iterator_base &iter ) const
+        {
+            return (
+                //( static_cast<Iterator>(*this).get_state() ==
+                //  static_cast<Iterator>(iter).get_state ) &&
+                ( m_t == iter.m_t ) && 
+                ( m_dt == iter.m_dt ) &&
+                ( m_at_end == iter.m_at_end )
+                );
+        }
+
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        bool equal( ode_iterator_base const& other ) const
+        {
+            if( m_at_end == other.m_at_end )
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        const state_type& dereference() const
+        {
+            return static_cast<const Iterator*>(this)->get_state();
+        }
+
+    protected:
+
+        stepper_type m_stepper;
+        system_type m_system;
+        time_type m_t;
+        time_type m_dt;
+        bool m_at_end;
+    };
+
+
+
+    /* Specialization for the state-time iterator that has pair<state_type,time_type> as its value_type */
+
+    template< class Iterator , class Stepper , class System , class State >
+    class ode_iterator_base< Iterator , Stepper , System , State , ode_state_time_iterator_tag >
+        : public boost::iterator_facade
+          <
+              Iterator ,
+              std::pair< const State , const typename traits::time_type< Stepper >::type > ,
+              boost::single_pass_traversal_tag ,
+              std::pair< const State& , const typename traits::time_type< Stepper >::type& >
+          >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename unwrapped_stepper_type::time_type time_type;
+        typedef typename unwrapped_stepper_type::value_type ode_value_type;
+
+    public:
+
+        ode_iterator_base( stepper_type stepper , system_type sys ,
+                           time_type t , time_type dt )
+            : m_stepper( stepper ) , m_system( sys ) ,
+              m_t( t ) , m_dt( dt ) , m_at_end( false )
+        { }
+
+        ode_iterator_base( stepper_type stepper , system_type sys )
+            : m_stepper( stepper ) , m_system( sys ) , m_at_end( true )
+        { }
+
+        bool same( ode_iterator_base const& iter )
+        {
+            return (
+                //( static_cast<Iterator>(*this).get_state() ==
+                //  static_cast<Iterator>(iter).get_state ) &&
+                ( m_t == iter.m_t ) &&
+                ( m_dt == iter.m_dt ) &&
+                ( m_at_end == iter.m_at_end )
+                );
+        }
+
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        bool equal( ode_iterator_base const& other ) const
+        {
+            if( m_at_end == other.m_at_end )
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        std::pair< const state_type& , const time_type& > dereference() const
+        {
+            return std::pair< const state_type & , const time_type & >(
+                    static_cast<const Iterator*>(this)->get_state() , m_t );
+        }
+
+        stepper_type m_stepper;
+        system_type m_system;
+        time_type m_t;
+        time_type m_dt;
+        bool m_at_end;
+
+    };
+
+
+
+} // namespace detail
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,253 @@
+/*
+ [auto_generated]
+  boost/numeric/odeint/iterator/detail/adaptive_iterator_impl.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ADAPTIVE_ITERATOR_IMPL_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ADAPTIVE_ITERATOR_IMPL_HPP_DEFINED
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/throw_exception.hpp>
+
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    template< class Iterator , class Stepper , class System , class State , typename Tag , typename StepperTag >
+    class adaptive_iterator_impl;
+
+    /*
+     * Specilization for controlled steppers
+     */
+    /**
+     * \brief ODE Iterator with adaptive step size control. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an ODE iterator with adaptive step size control. Uses controlled steppers. adaptive_iterator is a model
+     * of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class adaptive_iterator_impl< Iterator , Stepper , System , State , Tag , controlled_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator stores a reference of s and changes its value during the iteration.
+         * \param t The initial time.
+         * \param t_end The end time, at which the iteration should stop.
+         * \param dt The initial time step.
+         */
+        adaptive_iterator_impl( stepper_type stepper , system_type sys , state_type &s , time_type t , time_type t_end , time_type dt )
+            : base_type( stepper , sys , t , dt ) , m_t_end( t_end ) , m_state( &s )
+        {
+            if( detail::less_with_sign( this->m_t_end , this->m_t , this->m_dt ) )
+                this->m_at_end = true;
+        }
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator store a reference of s and changes its value during the iteration.
+         */
+        adaptive_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            if( detail::less_with_sign( this->m_t , this->m_t_end , this->m_dt) )
+            {
+                if( detail::less_with_sign( this->m_t_end ,
+                                            static_cast<time_type>(this->m_t + this->m_dt) ,
+                                            this->m_dt ) )
+                {
+                    this->m_dt = this->m_t_end - this->m_t;
+                }
+                unwrapped_stepper_type &stepper = this->m_stepper;
+                const size_t max_attempts = 1000;
+                size_t trials = 0;
+                controlled_step_result res = success;
+                do
+                {
+                    res = stepper.try_step( this->m_system , *( this->m_state ) , this->m_t , this->m_dt );
+                    ++trials;
+                }
+                while( ( res == fail ) && ( trials < max_attempts ) );
+                if( trials == max_attempts )
+                {
+                    BOOST_THROW_EXCEPTION( std::overflow_error( "Adaptive iterator : Maximal number of iterations reached. A step size could not be found." ));
+                }
+            } else {
+                this->m_at_end = true;
+            }
+        }
+    public:
+        const state_type& get_state() const
+        {
+            return *this->m_state;
+        }
+
+    private:
+        time_type m_t_end;
+        state_type* m_state;
+    };
+
+
+
+    /*
+     * Specilization for dense outputer steppers
+     */
+    /**
+     * \brief ODE Iterator with adaptive step size control. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an ODE iterator with adaptive step size control. Uses dense-output steppers. adaptive_iterator is a model
+     * of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class adaptive_iterator_impl< Iterator , Stepper , System , State , Tag , dense_output_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+
+   public:
+
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state.
+         * \param t The initial time.
+         * \param t_end The end time, at which the iteration should stop.
+         * \param dt The initial time step.
+         */
+        adaptive_iterator_impl( stepper_type stepper , system_type sys , state_type &s , time_type t , time_type t_end , time_type dt )
+            : base_type( stepper , sys , t , dt ) , m_t_end( t_end )
+        {
+            if( detail::less_eq_with_sign( this->m_t , this->m_t_end , this->m_dt ) )
+            {
+                unwrapped_stepper_type &st = this->m_stepper;
+                st.initialize( s , this->m_t , this->m_dt );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state.
+         */
+        adaptive_iterator_impl( stepper_type stepper , system_type sys , state_type& /* s */ )
+            : base_type( stepper , sys ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            unwrapped_stepper_type &stepper = this->m_stepper;
+            if( detail::less_with_sign( this->m_t ,
+                                        this->m_t_end ,
+                                        stepper.current_time_step() ) )
+            {
+                if( detail::less_with_sign( this->m_t_end ,
+                                            static_cast<time_type>(this->m_t + stepper.current_time_step()) ,
+                                            stepper.current_time_step() ) )
+                {
+                    // make stpper to end exactly at t_end
+                    stepper.initialize( stepper.current_state() , stepper.current_time() ,
+                                        static_cast<time_type>(this->m_t_end-this->m_t) );
+                }
+                stepper.do_step( this->m_system );
+                this->m_t = stepper.current_time();
+            } else { // we have reached t_end
+                this->m_at_end = true;
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            const unwrapped_stepper_type &stepper = this->m_stepper;
+            return stepper.current_state();
+        }
+
+    private:
+        time_type m_t_end;
+    };
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ADAPTIVE_ITERATOR_IMPL_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,228 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/iterator/detail/const_step_iterator_impl.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_CONST_STEP_ITERATOR_IMPL_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_CONST_STEP_ITERATOR_IMPL_HPP_DEFINED
+
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    template< class Iterator , class Stepper , class System , class State , typename Tag , class StepperTag >
+    class const_step_iterator_impl;
+
+
+    /*
+     * Specilization for steppers and error steppers
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class const_step_iterator_impl< Iterator , Stepper , System , State , Tag , stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+   
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         * \param t The initial time.
+         * \param t_end The end time, at which the iteration should stop.
+         * \param dt The initial time step.
+         */
+        const_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s , time_type t , time_type t_end , time_type dt )
+            : base_type( stepper , sys , t , dt ) , m_t_start( t ) , m_t_end( t_end ) , m_state( &s ) , m_step( 0 )
+        {
+            if( detail::less_with_sign( this->m_t_end , this->m_t , this->m_dt ) )
+                this->m_at_end = true;
+        }
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         */
+        const_step_iterator_impl( stepper_type stepper , system_type sys , state_type& /* s */ )
+            : base_type( stepper , sys ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            if( detail::less_eq_with_sign( static_cast<time_type>(this->m_t+this->m_dt) ,
+                                           this->m_t_end , this->m_dt ) )
+            {
+                unwrapped_stepper_type &stepper = this->m_stepper;
+                stepper.do_step( this->m_system , *this->m_state , this->m_t , this->m_dt );
+                // use integer to compute current time to reduce roundoff errors
+                this->m_step++;
+                this->m_t = this->m_t_start + static_cast< typename unit_value_type<time_type>::type >(this->m_step)*this->m_dt;
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+    private:
+        time_type m_t_start;
+        time_type m_t_end;
+        state_type* m_state;
+        size_t m_step;
+
+    };
+
+
+
+    /*
+     * Specilization for dense output stepper
+     */
+    /**
+     * \brief ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an ODE iterator solving the ODE with constant steps. Uses dense-output steppers.
+     * const_step_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class const_step_iterator_impl< Iterator , Stepper , System , State , Tag , dense_output_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         * \param t The initial time.
+         * \param t_end The end time, at which the iteration should stop.
+         * \param dt The initial time step.
+         */
+        const_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s , time_type t , time_type t_end , time_type dt )
+            : base_type( stepper , sys , t , dt ) , m_t_start( t ) , m_t_end( t_end ) , m_state( &s ) , m_step( 0 )
+        {
+            if( detail::less_eq_with_sign( this->m_t , this->m_t_end , this->m_dt ) )
+            {
+                unwrapped_stepper_type &st = this->m_stepper;
+                st.initialize( * ( this->m_state ) , this->m_t , this->m_dt );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         */
+        const_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s )
+        {
+        }
+
+
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment( void )
+        {
+            if( detail::less_eq_with_sign( static_cast<time_type>(this->m_t+this->m_dt) ,
+                                           this->m_t_end , this->m_dt ) )
+            {
+                unwrapped_stepper_type &stepper = this->m_stepper;
+                // use integer to compute current time to reduce roundoff errors
+                this->m_step++;
+                this->m_t = this->m_t_start + static_cast< typename unit_value_type<time_type>::type >(this->m_step)*this->m_dt;
+                while( detail::less_with_sign( stepper.current_time() , this->m_t ,
+                       stepper.current_time_step() ) )
+                {
+                    stepper.do_step( this->m_system );
+                }
+                stepper.calc_state( this->m_t , *( this->m_state ) );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+    private:
+        time_type m_t_start;
+        time_type m_t_end;
+        state_type* m_state;
+        size_t m_step;
+    };
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_CONST_STEP_ITERATOR_IMPL_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,239 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/iterator/detail/n_step_iterator_impl.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_N_STEP_ITERATOR_IMPL_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_N_STEP_ITERATOR_IMPL_HPP_DEFINED
+
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    template< class Iterator , class Stepper , class System , class State , typename Tag , class StepperTag >
+    class n_step_iterator_impl;
+
+
+    /*
+     * Specilization for steppers and error steppers
+     */
+    /**
+     * \brief ODE Iterator performing exactly n steps with constant step size. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an ODE iterator solving the ODE with constant step size. Uses steppers fulfilling the Stepper concept.
+     * n_step_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class n_step_iterator_impl< Iterator , Stepper , System , State , Tag , stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+   
+        /**
+         * \brief Constructs a n_step_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         * \param t The initial time.
+         * \param dt The initial time step.
+         * \param num_of_steps the number of steps to be executed.
+         */
+        n_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s ,
+                              time_type t , time_type dt , size_t num_of_steps )
+            : base_type( stepper , sys , t , dt ) , m_t_start( t ) , m_state( &s ) ,
+              m_steps(num_of_steps) , m_step( 0 )
+        { }
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         */
+        n_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            if( this->m_step < this->m_steps )
+            {
+                unwrapped_stepper_type &stepper = this->m_stepper;
+                stepper.do_step( this->m_system , *this->m_state , this->m_t , this->m_dt );
+                // use integer to compute current time to reduce roundoff errors
+                this->m_step++;
+                this->m_t = this->m_t_start + static_cast< typename unit_value_type<time_type>::type >(this->m_step)*this->m_dt;
+            } else {
+                this->m_at_end = true;
+
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+
+    private:
+        time_type m_t_start;
+        time_type m_t_end;
+        state_type* m_state;
+        size_t m_steps;
+        size_t m_step;
+
+    };
+
+
+
+
+    /*
+     * Specilization for dense output stepper
+     */
+    /**
+     * \brief ODE Iterator with step-size control and dense output.
+     *
+     * Implements an ODE iterator solving the ODE with constant steps. Uses dense-output steppers.
+     * n_step_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , typename Tag >
+    class n_step_iterator_impl< Iterator , Stepper , System , State , Tag , dense_output_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         * \param t The initial time.
+         * \param dt The initial time step.
+         * \param num_of_steps the number of steps to be executed.
+         */
+        n_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s ,
+                              time_type t , time_type dt , size_t num_of_steps )
+            : base_type( stepper , sys , t , dt ) , m_t_start( t ) , m_state( &s ) ,
+              m_steps( num_of_steps ) , m_step( 0 )
+        {
+            unwrapped_stepper_type &st = this->m_stepper;
+            st.initialize( * ( this->m_state ) , this->m_t , this->m_dt );
+        }
+
+        /**
+         * \brief Constructs a const_step_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+         */
+        n_step_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s )
+        {
+        }
+
+
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment( void )
+        {
+            if( this->m_step < this->m_steps )
+            {
+                unwrapped_stepper_type &stepper = this->m_stepper;
+                // use integer to compute current time to reduce roundoff errors
+                this->m_step++;
+                this->m_t = this->m_t_start + static_cast< typename unit_value_type<time_type>::type >(this->m_step)*this->m_dt;
+                while( detail::less_with_sign( stepper.current_time() , this->m_t ,
+                       stepper.current_time_step() ) )
+                {
+                    stepper.do_step( this->m_system );
+                }
+                stepper.calc_state( this->m_t , *( this->m_state ) );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+
+    private:
+        time_type m_t_start;
+        time_type m_t_end;
+        state_type* m_state;
+        size_t m_steps;
+        size_t m_step;
+    };
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_N_STEP_ITERATOR_IMPL_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,371 @@
+/*
+ [auto_generated]
+  boost/numeric/odeint/iterator/detail/times_iterator_impl.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2013 Karsten Ahnert
+  Copyright 2009-2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_TIMES_ITERATOR_IMPL_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_TIMES_ITERATOR_IMPL_HPP_DEFINED
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/throw_exception.hpp>
+
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    template< class Iterator , class Stepper , class System , class State , class TimeIterator ,
+              typename Tag , typename StepperTag >
+    class times_iterator_impl;
+
+    /*
+     * Specilization for basic steppers
+     */
+    /**
+     * \brief ODE Iterator with constant step size.
+     *
+     * Implements an ODE iterator with observer calls at predefined times.
+     * Uses controlled steppers. times_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , class TimeIterator , typename Tag >
+    class times_iterator_impl< Iterator , Stepper , System , State , TimeIterator , Tag , stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef TimeIterator time_iterator_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+
+        /**
+         * \brief Constructs a times_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator stores a reference of s and changes its value during the iteration.
+         * \param t_start Iterator to the begin of a sequence of time values.
+         * \param t_end Iterator to the begin of a sequence of time values.
+         * \param dt The (initial) time step.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s ,
+                             time_iterator_type t_start , time_iterator_type t_end , time_type dt )
+            : base_type( stepper , sys , *t_start , dt ) ,
+              m_t_start( t_start ) , m_t_end( t_end ) , m_state( &s )
+        {
+            if( t_start == t_end )
+                this->m_at_end = true;
+        }
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator store a reference of s and changes its value during the iteration.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            unwrapped_stepper_type &stepper = this->m_stepper;
+            if( ++m_t_start != m_t_end )
+            {
+                while( detail::less_with_sign( this->m_t , static_cast<time_type>(*m_t_start) , this->m_dt ) )
+                {
+                    const time_type current_dt = detail::min_abs( this->m_dt , static_cast<time_type>(*m_t_start) - this->m_t );
+                    stepper.do_step( this->m_system , *( this->m_state ) , this->m_t , current_dt );
+                    this->m_t += current_dt;
+                }
+
+            } else {
+                this->m_at_end = true;
+            }
+         }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+    private:
+        time_iterator_type m_t_start;
+        time_iterator_type m_t_end;
+        state_type* m_state;
+    };
+
+
+
+    /*
+     * Specilization for controlled steppers
+     */
+    /**
+     * \brief ODE Iterator with adaptive step size control. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an ODE iterator with observer calls at predefined times.
+     * Uses controlled steppers. times_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , class TimeIterator , typename Tag >
+    class times_iterator_impl< Iterator , Stepper , System , State , TimeIterator , Tag , controlled_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef TimeIterator time_iterator_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+    public:
+
+        /**
+         * \brief Constructs a times_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator stores a reference of s and changes its value during the iteration.
+         * \param t_start Iterator to the begin of a sequence of time values.
+         * \param t_end Iterator to the begin of a sequence of time values.
+         * \param dt The (initial) time step.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s ,
+                             time_iterator_type t_start , time_iterator_type t_end , time_type dt )
+            : base_type( stepper , sys , *t_start , dt ) ,
+              m_t_start( t_start ) , m_t_end( t_end ) , m_state( &s )
+        {
+            if( t_start == t_end )
+                this->m_at_end = true;
+        }
+
+        /**
+         * \brief Constructs an adaptive_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state. adaptive_iterator store a reference of s and changes its value during the iteration.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            if( ++m_t_start != m_t_end )
+            {
+                while( detail::less_with_sign( this->m_t , static_cast<time_type>(*m_t_start) , this->m_dt ) )
+                {
+                    if( detail::less_with_sign( static_cast<time_type>(*m_t_start) - this->m_t , this->m_dt , this->m_dt ) )
+                    {
+                        // we want to end exactly at the time point
+                        time_type current_dt = static_cast<time_type>(*m_t_start) - this->m_t;
+                        step_loop( current_dt );
+                    } else {
+                        step_loop( this->m_dt );
+                    }
+                }
+
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+    private:
+        void step_loop( time_type &dt )
+        {
+            unwrapped_stepper_type &stepper = this->m_stepper;
+            const size_t max_attempts = 1000;
+            size_t trials = 0;
+            controlled_step_result res = success;
+            do
+            {
+                res = stepper.try_step( this->m_system , *( this->m_state ) , this->m_t , dt );
+                ++trials;
+            }
+            while( ( res == fail ) && ( trials < max_attempts ) );
+            if( trials == max_attempts )
+            {
+                BOOST_THROW_EXCEPTION( std::overflow_error( "Adaptive iterator : Maximal number of iterations reached. A step size could not be found." ) );
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+
+    private:
+        time_iterator_type m_t_start;
+        time_iterator_type m_t_end;
+        state_type* m_state;
+    };
+
+
+    /*
+     * Specilization for dense outputer steppers
+     */
+    /**
+     * \brief ODE Iterator with step size control and dense output.
+     * Implements an ODE iterator with adaptive step size control. Uses dense-output steppers.
+     * times_iterator is a model of single-pass iterator.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     */
+    template< class Iterator , class Stepper , class System , class State , class TimeIterator , typename Tag >
+    class times_iterator_impl< Iterator , Stepper , System , State , TimeIterator , Tag , dense_output_stepper_tag >
+        : public detail::ode_iterator_base< Iterator , Stepper , System , State , Tag >
+    {
+    private:
+
+
+        typedef Stepper stepper_type;
+        typedef System system_type;
+        typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
+        typedef State state_type;
+        typedef TimeIterator time_iterator_type;
+        typedef typename traits::time_type< stepper_type >::type time_type;
+        typedef typename traits::value_type< stepper_type >::type ode_value_type;
+        #ifndef DOXYGEN_SKIP
+        typedef detail::ode_iterator_base< Iterator , Stepper , System , State , Tag > base_type;
+        #endif
+
+
+   public:
+
+
+        /**
+         * \brief Constructs a times_iterator. This constructor should be used to construct the begin iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state.
+         * \param t_start Iterator to the begin of a sequence of time values.
+         * \param t_end Iterator to the begin of a sequence of time values.
+         * \param dt The (initial) time step.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s ,
+                             time_iterator_type t_start , time_iterator_type t_end , time_type dt )
+            : base_type( stepper , sys , *t_start , dt ) ,
+              m_t_start( t_start ) , m_t_end( t_end ) , m_final_time( *(t_end-1) ) ,
+              m_state( &s )
+        {
+            if( t_start != t_end )
+            {
+                unwrapped_stepper_type &st = this->m_stepper;
+                st.initialize( *( this->m_state ) , this->m_t , this->m_dt );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+        /**
+         * \brief Constructs a times_iterator. This constructor should be used to construct the end iterator.
+         *
+         * \param stepper The stepper to use during the iteration.
+         * \param sys The system function (ODE) to solve.
+         * \param s The initial state.
+         */
+        times_iterator_impl( stepper_type stepper , system_type sys , state_type &s )
+            : base_type( stepper , sys ) , m_state( &s ) { }
+
+    protected:
+
+        friend class boost::iterator_core_access;
+
+        void increment()
+        {
+            unwrapped_stepper_type &st = this->m_stepper;
+            if( ++m_t_start != m_t_end )
+            {
+                this->m_t = static_cast<time_type>(*m_t_start);
+                while( detail::less_with_sign( st.current_time() , this->m_t , this->m_dt ) )
+                {
+                    // make sure we don't go beyond the last point
+                    if( detail::less_with_sign( m_final_time-st.current_time() , st.current_time_step() , st.current_time_step() ) )
+                    {
+                        st.initialize( st.current_state() , st.current_time() , m_final_time-st.current_time() );
+                    }
+                    st.do_step( this->m_system );
+                }
+                st.calc_state( this->m_t , *( this->m_state ) );
+            } else {
+                this->m_at_end = true;
+            }
+        }
+
+    public:
+        const state_type& get_state() const
+        {
+            return *m_state;
+        }
+
+
+    private:
+        time_iterator_type m_t_start;
+        time_iterator_type m_t_end;
+        time_type m_final_time;
+        state_type* m_state;
+    };
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_TIMES_ITERATOR_IMPL_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/functors.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/functors.hpp
+
+ [begin_description]
+ some functors for the iterator based integrate routines
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
+
+#include <utility>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+
+template< class Observer >
+struct obs_caller {
+
+    size_t &m_n;
+    Observer m_obs;
+
+    obs_caller( size_t &m , Observer &obs ) : m_n(m) , m_obs( obs ) {}
+
+    template< class State , class Time >
+    void operator()( std::pair< const State & , const Time & > x )
+    {
+        typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+        observer_type &obs = m_obs;
+        obs( x.first , x.second );
+        m_n++;
+    }
+};
+
+template< class Observer , class Time >
+struct obs_caller_time {
+
+    Time &m_t;
+    Observer m_obs;
+
+    obs_caller_time( Time &t , Observer &obs ) : m_t(t) , m_obs( obs ) {}
+
+    template< class State >
+    void operator()( std::pair< const State & , const Time & > x )
+    {
+        typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+        observer_type &obs = m_obs;
+        obs( x.first , x.second );
+        m_t = x.second;
+    }
+};
+
+} // namespace detail
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_FUNCTORS_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,121 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp
+
+ [begin_description]
+ Default Integrate adaptive implementation.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
+
+#include <stdexcept>
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp>
+#include <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/functors.hpp>
+#include <boost/numeric/odeint/util/bind.hpp>
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+// forward declaration
+template< class Stepper , class System , class State , class Time , class Observer>
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , stepper_tag );
+
+/*
+ * integrate_adaptive for simple stepper is basically an integrate_const + some last step
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , stepper_tag
+)
+{
+    size_t steps = detail::integrate_const( stepper , system , start_state , start_time ,
+                                            end_time , dt , observer , stepper_tag() );
+    typename odeint::unwrap_reference< Observer >::type &obs = observer;
+    typename odeint::unwrap_reference< Stepper >::type &st = stepper;
+
+    Time end = start_time + dt*steps;
+    if( less_with_sign( end , end_time , dt ) )
+    {   //make a last step to end exactly at end_time
+        st.do_step( system , start_state , end , end_time - end );
+        steps++;
+        obs( start_state , end_time );
+    }
+    return steps;
+}
+
+
+/*
+ * classical integrate adaptive
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time &start_time , Time end_time , Time &dt ,
+        Observer observer , controlled_stepper_tag
+)
+{
+    size_t obs_calls = 0;
+
+    boost::for_each( make_adaptive_time_range( stepper , system , start_state ,
+                                               start_time , end_time , dt ) ,
+                     obs_caller< Observer >( obs_calls , observer ) );
+
+    return obs_calls-1;
+}
+
+
+/*
+ * integrate adaptive for dense output steppers
+ *
+ * step size control is used if the stepper supports it
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , dense_output_stepper_tag )
+{
+    size_t obs_calls = 0;
+
+    boost::for_each( make_adaptive_time_range( stepper , system , start_state ,
+                                               start_time , end_time , dt ) ,
+                     obs_caller< Observer >( obs_calls , observer ) );
+
+    return obs_calls-1;
+}
+
+
+
+
+} // namespace detail
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,111 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/integrate_const.hpp
+
+ [begin_description]
+ integrate const implementation
+ [end_description]
+
+ Copyright 2009-2012 Karsten Ahnert
+ Copyright 2009-2012 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_CONST_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_CONST_HPP_INCLUDED
+
+#include <boost/range/algorithm/for_each.hpp>
+
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/functors.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+// forward declaration
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time &start_time , Time end_time , Time &dt ,
+        Observer observer , controlled_stepper_tag
+);
+
+
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , stepper_tag 
+)
+{
+    size_t obs_calls = 0;
+
+    boost::for_each( make_const_step_time_range( stepper , system , start_state ,
+                                                 start_time , end_time , dt ) ,
+                     // should we use traits<Stepper>::state_type here instead of State? NO!
+                     obs_caller< Observer >( obs_calls , observer ) );
+
+    // step integration steps gives step+1 observer calls
+    return obs_calls-1;
+}
+
+
+
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , controlled_stepper_tag 
+)
+{
+    typename odeint::unwrap_reference< Observer >::type &obs = observer;
+    
+    Time time = start_time;
+    const Time time_step = dt;
+    int step = 0;
+    
+    while( less_eq_with_sign( static_cast<Time>(time+time_step) , end_time , dt ) )
+    {
+        obs( start_state , time );
+        detail::integrate_adaptive( stepper , system , start_state , time , time+time_step , dt ,
+                                    null_observer() , controlled_stepper_tag() );
+        // direct computation of the time avoids error propagation happening when using time += dt
+        // we need clumsy type analysis to get boost units working here
+        ++step;
+        time = start_time + static_cast< typename unit_value_type<Time>::type >(step) * time_step;
+    }
+    obs( start_state , time );
+    
+    return step;
+}
+
+
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer , dense_output_stepper_tag 
+)
+{
+    size_t obs_calls = 0;
+
+    boost::for_each( make_const_step_time_range( stepper , system , start_state ,
+                                                 start_time , end_time , dt ) ,
+                     obs_caller< Observer >( obs_calls , observer ) );
+    return obs_calls-1;
+}
+
+
+} } } }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_n_steps.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp
+
+ [begin_description]
+ integrate steps implementation
+ [end_description]
+
+ Copyright 2009-2012 Karsten Ahnert
+ Copyright 2009-2012 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_N_STEPS_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_N_STEPS_HPP_INCLUDED
+
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/functors.hpp>
+#include <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+// forward declaration
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time &start_time , Time end_time , Time &dt ,
+        Observer observer , controlled_stepper_tag
+);
+
+
+/* basic version */
+template< class Stepper , class System , class State , class Time , class Observer>
+Time integrate_n_steps(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps ,
+        Observer observer , stepper_tag )
+{
+    // ToDo: is there a better way to extract the final time?
+    Time t = start_time; // Assignment is only here to avoid warnings.
+    boost::for_each( make_n_step_time_range( stepper , system , start_state ,
+                                             start_time , dt , num_of_steps ) ,
+                     obs_caller_time< Observer , Time >( t , observer ) );
+    return t;
+}
+
+
+/* controlled version */
+template< class Stepper , class System , class State , class Time , class Observer>
+Time integrate_n_steps(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps ,
+        Observer observer , controlled_stepper_tag )
+{
+    typename odeint::unwrap_reference< Observer >::type &obs = observer;
+
+    Time time = start_time;
+    Time time_step = dt;
+
+    for( size_t step = 0; step < num_of_steps ; ++step )
+    {
+        obs( start_state , time );
+        detail::integrate_adaptive( stepper , system , start_state , time , static_cast<Time>(time+time_step) , dt ,
+                null_observer() , controlled_stepper_tag() );
+        // direct computation of the time avoids error propagation happening when using time += dt
+        // we need clumsy type analysis to get boost units working here
+        time = start_time + static_cast< typename unit_value_type<Time>::type >(step+1) * time_step;
+    }
+    obs( start_state , time );
+
+    return time;
+}
+
+
+/* dense output version */
+template< class Stepper , class System , class State , class Time , class Observer>
+Time integrate_n_steps(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps ,
+        Observer observer , dense_output_stepper_tag )
+{
+    // ToDo: is there a better way to extract the final time?
+    Time t = start_time;  // Assignment is only here to avoid warnings.
+    boost::for_each( make_n_step_time_range( stepper , system , start_state ,
+                                             start_time , dt , num_of_steps ) ,
+                     obs_caller_time< Observer , Time >( t , observer ) );
+    return t;
+}
+
+
+}
+}
+}
+}
+
+#endif /* BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_N_STEPS_HPP_INCLUDED */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/detail/integrate_times.hpp
+
+ [begin_description]
+ Default integrate times implementation.
+ [end_description]
+
+ Copyright 2009-2012 Karsten Ahnert
+ Copyright 2009-2012 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_TIMES_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_TIMES_HPP_INCLUDED
+
+#include <stdexcept>
+
+#include <boost/config.hpp>
+#include <boost/range/algorithm/for_each.hpp>
+
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+#include <boost/numeric/odeint/iterator/times_time_iterator.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/functors.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+
+
+/*
+ * integrate_times for all steppers
+ */
+template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer , class StepperTag >
+size_t integrate_times(
+        Stepper stepper , System system , State &start_state ,
+        TimeIterator start_time , TimeIterator end_time , Time dt ,
+        Observer observer , StepperTag
+)
+{
+    size_t obs_calls = 0;
+
+    boost::for_each( make_times_time_range( stepper , system , start_state ,
+                                            start_time , end_time , dt ) ,
+                         // should we use traits<Stepper>::state_type here instead of State? NO!
+                     obs_caller< Observer >( obs_calls , observer ) );
+
+        // step integration steps gives step+1 observer calls
+    return obs_calls-1;
+}
+
+
+} // namespace detail
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,111 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/integrate.hpp
+
+ [begin_description]
+ Convenience methods which choose the stepper for the current ODE.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_HPP_INCLUDED
+
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
+#include <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
+#include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/iterator/integrate/integrate_adaptive.hpp>
+
+// for has_value_type trait
+#include <boost/numeric/odeint/algebra/detail/extract_value_type.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/*
+ * ToDo :
+ *
+ * determine type of dxdt for units
+ *
+ */
+template< class System , class State , class Time , class Observer >
+typename boost::enable_if< typename has_value_type<State>::type , size_t >::type
+integrate( System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
+{
+    typedef controlled_runge_kutta< runge_kutta_dopri5< State , typename State::value_type , State , Time > > stepper_type;
+    return integrate_adaptive( stepper_type() , system , start_state , start_time , end_time , dt , observer );
+}
+
+
+
+/*
+ * the two overloads are needed in order to solve the forwarding problem
+ */
+template< class System , class State , class Time >
+size_t integrate( System system , State &start_state , Time start_time , Time end_time , Time dt )
+{
+    return integrate( system , start_state , start_time , end_time , dt , null_observer() );
+}
+
+
+/**
+ * \fn integrate( System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
+ * \brief Integrates the ODE.
+ *
+ * Integrates the ODE given by system from start_time to end_time starting 
+ * with start_state as initial condition and dt as initial time step.
+ * This function uses a dense output dopri5 stepper and performs an adaptive
+ * integration with step size control, thus dt changes during the integration.
+ * This method uses standard error bounds of 1E-6.
+ * After each step, the observer is called.
+ *
+ * \param system The system function to solve, hence the r.h.s. of the 
+ * ordinary differential equation.
+ * \param start_state The initial state.
+ * \param start_time Start time of the integration.
+ * \param end_time End time of the integration.
+ * \param dt Initial step size, will be adjusted during the integration.
+ * \param observer Observer that will be called after each time step.
+ * \return The number of steps performed.
+ */
+
+
+/**
+ * \fn integrate( System system , State &start_state , Time start_time , Time end_time , Time dt )
+ * \brief Integrates the ODE without observer calls.
+ *
+ * Integrates the ODE given by system from start_time to end_time starting 
+ * with start_state as initial condition and dt as initial time step.
+ * This function uses a dense output dopri5 stepper and performs an adaptive
+ * integration with step size control, thus dt changes during the integration.
+ * This method uses standard error bounds of 1E-6.
+ * No observer is called.
+ *
+ * \param system The system function to solve, hence the r.h.s. of the 
+ * ordinary differential equation.
+ * \param start_state The initial state.
+ * \param start_time Start time of the integration.
+ * \param end_time End time of the integration.
+ * \param dt Initial step size, will be adjusted during the integration.
+ * \return The number of steps performed.
+ */
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_adaptive.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,129 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/integrate_adaptive.hpp
+
+ [begin_description]
+ Adaptive integration of ODEs.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_ADAPTIVE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_ADAPTIVE_HPP_INCLUDED
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/*
+ * the two overloads are needed in order to solve the forwarding problem
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_adaptive(
+            stepper , system , start_state ,
+            start_time , end_time , dt ,
+            observer , stepper_category() );
+
+    /*
+     * Suggestion for a new extendable version:
+     *
+     * integrator_adaptive< Stepper , System, State , Time , Observer , typename Stepper::stepper_category > integrator;
+     * return integrator.run( stepper , system , start_state , start_time , end_time , dt , observer );
+     */
+}
+
+/**
+ * \brief Second version to solve the forwarding problem,
+ * can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_adaptive(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_adaptive(
+            stepper , system , start_state ,
+            start_time , end_time , dt ,
+            observer , stepper_category() );
+}
+
+
+
+
+/**
+ * \brief integrate_adaptive without an observer.
+ */
+template< class Stepper , class System , class State , class Time >
+size_t integrate_adaptive(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt )
+{
+    return integrate_adaptive( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+}
+
+/**
+ * \brief Second version to solve the forwarding problem,
+ * can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time >
+size_t integrate_adaptive(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time end_time , Time dt )
+{
+    return integrate_adaptive( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+}
+
+
+/************* DOXYGEN ************/
+
+    /** 
+     * \fn integrate_adaptive( Stepper stepper , System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
+     * \brief Integrates the ODE with adaptive step size.
+     * 
+     * This function integrates the ODE given by system with the given stepper.
+     * The observer is called after each step. If the stepper has no error 
+     * control, the step size remains constant and the observer is called at
+     * equidistant time points t0+n*dt. If the stepper is a ControlledStepper,
+     * the step size is adjusted and the observer is called in non-equidistant
+     * intervals.
+     *
+     * \param stepper The stepper to be used for numerical integration.
+     * \param system Function/Functor defining the rhs of the ODE.
+     * \param start_state The initial condition x0.
+     * \param start_time The initial time t0.
+     * \param end_time The final integration time tend.
+     * \param dt The time step between observer calls, _not_ necessarily the 
+     * time step of the integration.
+     * \param observer Function/Functor called at equidistant time intervals.
+     * \return The number of steps performed.
+     */
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_ADAPTIVE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_const.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,158 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/integrate_const.hpp
+
+ [begin_description]
+ Constant integration of ODEs, meaning that the state of the ODE is observed on constant time intervals.
+ The routines makes full use of adaptive and dense-output methods.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_CONST_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_CONST_HPP_INCLUDED
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+
+
+
+/*
+ * Integrates with constant time step dt.
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer
+)
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    // we want to get as fast as possible to the end
+    if( boost::is_same< null_observer , Observer >::value )
+    {
+        return detail::integrate_adaptive(
+                stepper , system , start_state ,
+                start_time , end_time  , dt ,
+                observer , stepper_category() );
+    }
+    else
+    {
+        return detail::integrate_const( stepper , system , start_state , 
+                                        start_time , end_time , dt ,
+                                        observer , stepper_category() );
+      }
+}
+
+/**
+ * \brief Second version to solve the forwarding problem, 
+ * can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+size_t integrate_const(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time end_time , Time dt ,
+        Observer observer
+)
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    // we want to get as fast as possible to the end
+    if( boost::is_same< null_observer , Observer >::value )
+    {
+        return detail::integrate_adaptive(
+                stepper , system , start_state ,
+                start_time , end_time  , dt ,
+                observer , stepper_category() );
+    }
+    else
+    {
+        return detail::integrate_const( stepper , system , start_state , 
+                                        start_time , end_time , dt ,
+                                        observer , stepper_category() );
+    }
+}
+
+
+
+
+
+/**
+ * \brief integrate_const without observer calls
+ */
+template< class Stepper , class System , class State , class Time >
+size_t integrate_const(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time end_time , Time dt
+)
+{
+    return integrate_const( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+}
+
+/**
+ * \brief Second version to solve the forwarding problem,
+ * can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time >
+size_t integrate_const(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time end_time , Time dt
+)
+{
+    return integrate_const( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+}
+
+
+
+
+
+
+/********* DOXYGEN *********/
+    /**
+     * \fn integrate_const( Stepper stepper , System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
+     * \brief Integrates the ODE with constant step size.
+     *
+     * Integrates the ODE defined by system using the given stepper.
+     * This method ensures that the observer is called at constant intervals dt.
+     * If the Stepper is a normal stepper without step size control, dt is also
+     * used for the numerical scheme. If a ControlledStepper is provided, the 
+     * algorithm might reduce the step size to meet the error bounds, but it is 
+     * ensured that the observer is always called at equidistant time points
+     * t0 + n*dt. If a DenseOutputStepper is used, the step size also may vary
+     * and the dense output is used to call the observer at equidistant time
+     * points.
+     *
+     * \param stepper The stepper to be used for numerical integration.
+     * \param system Function/Functor defining the rhs of the ODE.
+     * \param start_state The initial condition x0.
+     * \param start_time The initial time t0.
+     * \param end_time The final integration time tend.
+     * \param dt The time step between observer calls, _not_ necessarily the 
+     * time step of the integration.
+     * \param observer Function/Functor called at equidistant time intervals.
+     * \return The number of steps performed.
+     */
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_CONST_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_n_steps.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,125 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/integrate_n_steps.hpp
+
+ [begin_description]
+ Integration of n steps with constant time size. Adaptive and dense-output methods are fully supported.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_N_STEPS_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_N_STEPS_HPP_INCLUDED
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_n_steps.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/*
+ * Integrates n steps
+ *
+ * the two overloads are needed in order to solve the forwarding problem
+ */
+template< class Stepper , class System , class State , class Time , class Observer>
+Time integrate_n_steps(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_n_steps(
+                stepper , system , start_state ,
+                start_time , dt , num_of_steps ,
+                observer , stepper_category() );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time , class Observer >
+Time integrate_n_steps(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_n_steps(
+                 stepper , system , start_state ,
+                 start_time , dt , num_of_steps ,
+                 observer , stepper_category() );
+}
+
+
+/**
+ * \brief The same function as above, but without observer calls.
+ */
+template< class Stepper , class System , class State , class Time >
+Time integrate_n_steps(
+        Stepper stepper , System system , State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps )
+{
+    return integrate_n_steps( stepper , system , start_state , start_time , dt , num_of_steps , null_observer() );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class Time >
+Time integrate_n_steps(
+        Stepper stepper , System system , const State &start_state ,
+        Time start_time , Time dt , size_t num_of_steps )
+{
+    return integrate_n_steps( stepper , system , start_state , start_time , dt , num_of_steps , null_observer() );
+}
+
+
+
+/************* DOXYGEN *************/
+    /**
+     * \fn Time integrate_n_steps( Stepper stepper , System system , State &start_state , Time start_time , Time dt , size_t num_of_steps , Observer observer )
+     * \brief Integrates the ODE with constant step size.
+     *
+     * This function is similar to integrate_const. The observer is called at
+     * equidistant time intervals t0 + n*dt.
+     * If the Stepper is a normal stepper without step size control, dt is also
+     * used for the numerical scheme. If a ControlledStepper is provided, the 
+     * algorithm might reduce the step size to meet the error bounds, but it is 
+     * ensured that the observer is always called at equidistant time points
+     * t0 + n*dt. If a DenseOutputStepper is used, the step size also may vary
+     * and the dense output is used to call the observer at equidistant time
+     * points. The final integration time is always t0 + num_of_steps*dt.
+     *
+     * \param stepper The stepper to be used for numerical integration.
+     * \param system Function/Functor defining the rhs of the ODE.
+     * \param start_state The initial condition x0.
+     * \param start_time The initial time t0.
+     * \param dt The time step between observer calls, _not_ necessarily the 
+     * time step of the integration.
+     * \param num_of_steps Number of steps to be performed
+     * \param observer Function/Functor called at equidistant time intervals.
+     * \return The number of steps performed.
+     */
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_N_STEPS_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/integrate_times.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,133 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/integrate_times.hpp
+
+ [begin_description]
+ Integration of ODEs with observation at user defined points
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/range.hpp>
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/*
+ * the two overloads are needed in order to solve the forwarding problem
+ */
+template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
+size_t integrate_times(
+        Stepper stepper , System system , State &start_state ,
+        TimeIterator times_start , TimeIterator times_end , Time dt ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_times(
+            stepper , system , start_state ,
+            times_start , times_end , dt ,
+            observer , stepper_category() );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
+size_t integrate_times(
+        Stepper stepper , System system , const State &start_state ,
+        TimeIterator times_start , TimeIterator times_end , Time dt ,
+        Observer observer )
+{
+    typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+    return detail::integrate_times(
+            stepper , system , start_state ,
+            times_start , times_end , dt ,
+            observer , stepper_category() );
+}
+
+/**
+ * \brief The same function as above, but without observer calls.
+ */
+template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
+size_t integrate_times(
+        Stepper stepper , System system , State &start_state ,
+        const TimeRange &times , Time dt ,
+        Observer observer )
+{
+    return integrate_times(
+            stepper , system , start_state ,
+            boost::begin( times ) , boost::end( times ) , dt , observer );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
+size_t integrate_times(
+        Stepper stepper , System system , const State &start_state ,
+        const TimeRange &times , Time dt ,
+        Observer observer )
+{
+    return integrate_times(
+            stepper , system , start_state ,
+            boost::begin( times ) , boost::end( times ) , dt , observer );
+}
+
+
+
+
+/********* DOXYGEN ***********/
+
+    /**
+     * \fn size_t integrate_times( Stepper stepper , System system , State &start_state , TimeIterator times_start , TimeIterator times_end , Time dt , Observer observer )
+     * \brief Integrates the ODE with observer calls at given time points.
+     *
+     * Integrates the ODE given by system using the given stepper. This function
+     * does observer calls at the subsequent time points given by the range 
+     * times_start, times_end. If the stepper has not step size control, the 
+     * step size might be reduced occasionally to ensure observer calls exactly
+     * at the time points from the given sequence. If the stepper is a 
+     * ControlledStepper, the step size is adjusted to meet the error bounds, 
+     * but also might be reduced occasionally to ensure correct observer calls.
+     * If a DenseOutputStepper is provided, the dense output functionality is
+     * used to call the observer at the given times. The end time of the 
+     * integration is always *(end_time-1).
+     *
+     * \param stepper The stepper to be used for numerical integration.
+     * \param system Function/Functor defining the rhs of the ODE.
+     * \param start_state The initial condition x0.
+     * \param times_start Iterator to the start time
+     * \param times_end Iterator to the end time
+     * \param dt The time step between observer calls, _not_ necessarily the 
+     * time step of the integration.
+     * \param observer Function/Functor called at equidistant time intervals.
+     * \return The number of steps performed.
+     */
+
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/null_observer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/null_observer.hpp
+
+ [begin_description]
+ null_observer
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_NULL_OBSERVER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_NULL_OBSERVER_HPP_INCLUDED
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+struct null_observer
+{
+    template< class State , class Time >
+    void operator()( const State& /* x */ , Time /* t */ ) const
+    {
+
+    }
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_NULL_OBSERVER_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/integrate/observer_collection.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/observer_collection.hpp
+
+ [begin_description]
+ Collection of observers, which are all called during the evolution of the ODE.
+ [end_description]
+
+ Copyright 2009-2011 Karsten Ahnert
+ Copyright 2009-2011 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_OBSERVER_COLLECTION_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_OBSERVER_COLLECTION_HPP_INCLUDED
+
+#include <vector>
+
+#include <boost/function.hpp>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template< class State , class Time >
+class observer_collection
+{
+public:
+
+    typedef boost::function< void( const State& , const Time& ) > observer_type;
+    typedef std::vector< observer_type > collection_type;
+
+    void operator()( const State& x , Time t )
+    {
+        for( size_t i=0 ; i<m_observers.size() ; ++i )
+            m_observers[i]( x , t );
+    }
+
+    collection_type& observers( void ) { return m_observers; }
+    const collection_type& observers( void ) const { return m_observers; }
+
+private:
+
+    collection_type m_observers;
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_INTEGRATE_OBSERVER_COLLECTION_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/n_step_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,168 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/n_step_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating through the solution of an ODE with constant step size performing exactly n steps.
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_N_STEP_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_N_STEP_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    /* use the n_step_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+     , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+     >
+    class n_step_iterator : public n_step_iterator_impl<
+            n_step_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef n_step_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        n_step_iterator( Stepper stepper , System sys , State &s , time_type t , time_type dt , size_t num_of_steps )
+            : n_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s , t , dt , num_of_steps )
+        {}
+
+        n_step_iterator( Stepper stepper , System sys , State &s )
+            : n_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    /* make functions */
+
+    template< class Stepper , class System , class State >
+    n_step_iterator< Stepper , System, State > make_n_step_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t ,
+        typename traits::time_type< Stepper >::type dt ,
+        size_t num_of_steps )
+    {
+        return n_step_iterator< Stepper , System , State >( stepper , system , x , t , dt , num_of_steps );
+    }
+
+    template< class Stepper , class System , class State >
+    n_step_iterator< Stepper , System , State > make_n_step_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return n_step_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+    template< class Stepper , class System , class State >
+    std::pair< n_step_iterator< Stepper , System , State > , n_step_iterator< Stepper , System , State > >
+    make_n_step_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t ,
+        typename traits::time_type< Stepper >::type dt ,
+        size_t num_of_steps )
+    {
+        return std::make_pair(
+            n_step_iterator< Stepper , System , State >( stepper , system , x , t , dt , num_of_steps ) ,
+            n_step_iterator< Stepper , System , State >( stepper , system , x )
+            );
+    }
+
+
+    /**
+     * \class n_step_iterator
+     *
+     * \brief ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an iterator representing the solution of an ODE starting from t
+     * with n steps and a constant step size dt.
+     * After each iteration the iterator dereferences to the state x at the next
+     * time t+dt.
+     * This iterator can be used with Steppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_n_steps routine.
+     *
+     * n_step_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+    /**
+     * \fn make_n_step_iterator_begin( Stepper stepper , System system , State &x , typename traits::time_type< Stepper >::type t , typename traits::time_type< Stepper >::type dt , size_t num_of_steps )
+     *
+     * \brief Factory function for n_step_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \param t The initial time.
+     * \param dt The initial time step.
+     * \param num_of_steps The number of steps to be executed.
+     * \returns The n-step iterator.
+     */
+
+
+    /**
+     * \fn make_n_step_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for n_step_iterator. Constructs an end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The const_step_iterator.
+     */
+
+
+    /**
+     * \fn make_n_step_range( Stepper stepper , System system , State &x , typename traits::time_type< Stepper >::type t , typename traits::time_type< Stepper >::type dt , , size_t num_of_steps )
+     *
+     * \brief Factory function to construct a single pass range of n-step iterators. A range is here a pair
+     * of n_step_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator store a reference of s and changes its value during the iteration.
+     * \param t The initial time.
+     * \param dt The initial time step.
+     * \param num_of_steps The number of steps to be executed.
+     * \returns The n-step range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_CONST_N_STEP_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/n_step_time_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,169 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/n_step_time_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating through the solution of an ODE with constant step size performing exactly n steps.
+ The dereferenced type contains also the time.
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_N_STEP_TIME_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_N_STEP_TIME_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    /* use the n_step_iterator_impl with the right tags */
+    template< class Stepper , class System , class State
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class n_step_time_iterator : public n_step_iterator_impl<
+            n_step_time_iterator< Stepper , System , State , StepperTag > ,
+            Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef n_step_time_iterator< Stepper , System , State , StepperTag > iterator_type;
+
+    public:
+        n_step_time_iterator( Stepper stepper , System sys , State &s , time_type t , time_type dt , size_t num_of_steps )
+            : n_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s , t , dt , num_of_steps )
+        {}
+
+        n_step_time_iterator( Stepper stepper , System sys , State &s )
+            : n_step_iterator_impl< iterator_type , Stepper , System , State , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    /* make functions */
+
+    template< class Stepper , class System , class State >
+    n_step_time_iterator< Stepper , System, State > make_n_step_time_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t ,
+        typename traits::time_type< Stepper >::type dt ,
+        size_t num_of_steps )
+    {
+        return n_step_time_iterator< Stepper , System , State >( stepper , system , x , t , dt , num_of_steps );
+    }
+
+    template< class Stepper , class System , class State >
+    n_step_time_iterator< Stepper , System , State > make_n_step_time_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+    {
+        return n_step_time_iterator< Stepper , System , State >( stepper , system , x );
+    }
+
+    template< class Stepper , class System , class State >
+    std::pair< n_step_time_iterator< Stepper , System , State > , n_step_time_iterator< Stepper , System , State > >
+    make_n_step_time_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        typename traits::time_type< Stepper >::type t ,
+        typename traits::time_type< Stepper >::type dt ,
+        size_t num_of_steps )
+    {
+        return std::make_pair(
+            n_step_time_iterator< Stepper , System , State >( stepper , system , x , t , dt , num_of_steps ) ,
+            n_step_time_iterator< Stepper , System , State >( stepper , system , x )
+            );
+    }
+
+
+    /**
+     * \class n_step_time_iterator
+     *
+     * \brief ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time.
+     *
+     * Implements an iterator representing the solution of an ODE starting from t
+     * with n steps and a constant step size dt.
+     * After each iteration the iterator dereferences to a pair of state and time at the next
+     * time t+dt.
+     * This iterator can be used with Steppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_n_steps routine.
+     *
+     * n_step_time_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is pair of state and time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     */
+
+
+    /**
+     * \fn make_n_step_time_iterator_begin( Stepper stepper , System system , State &x , typename traits::time_type< Stepper >::type t , typename traits::time_type< Stepper >::type dt , size_t num_of_steps )
+     *
+     * \brief Factory function for n_step_time_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \param t The initial time.
+     * \param dt The initial time step.
+     * \param num_of_steps The number of steps to be executed.
+     * \returns The n-step iterator.
+     */
+
+
+    /**
+     * \fn make_n_step_time_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for n_step_time_iterator. Constructs an end iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The const_step_iterator.
+     */
+
+
+    /**
+     * \fn make_n_step_time_range( Stepper stepper , System system , State &x , typename traits::time_type< Stepper >::type t , typename traits::time_type< Stepper >::type dt , size_t num_of_steps )
+     *
+     * \brief Factory function to construct a single pass range of n-step iterators. A range is here a pair
+     * of n_step_time_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator store a reference of s and changes its value during the iteration.
+     * \param t The initial time.
+     * \param dt The initial time step.
+     * \param num_of_steps The number of steps to be executed.
+     * \returns The n-step range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_CONST_N_STEP_TIME_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/times_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,189 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/times_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating through the solution of an ODE with oscillator calls at times from a given sequence.
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    /* use the times_iterator_impl with the right tags */
+    template< class Stepper , class System , class State , class TimeIterator
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class times_iterator : public times_iterator_impl<
+            times_iterator< Stepper , System , State , TimeIterator , StepperTag > ,
+            Stepper , System , State , TimeIterator , detail::ode_state_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef times_iterator< Stepper , System , State , TimeIterator , StepperTag > iterator_type;
+
+    public:
+        times_iterator( Stepper stepper , System sys , State &s ,
+                        TimeIterator t_start , TimeIterator t_end , time_type dt )
+            : times_iterator_impl< iterator_type , Stepper , System , State , TimeIterator, detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        times_iterator( Stepper stepper , System sys , State &s )
+            : times_iterator_impl< iterator_type , Stepper , System , State , TimeIterator , detail::ode_state_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    /* make functions */
+
+    template< class Stepper , class System , class State , class TimeIterator >
+    times_iterator< Stepper , System, State , TimeIterator > make_times_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return times_iterator< Stepper , System , State , TimeIterator >( stepper , system , x , t_start , t_end , dt );
+    }
+
+    // ToDo: requires to specifically provide the TimeIterator template parameter, can this be improved?
+    template< class TimeIterator , class Stepper , class System , class State >
+    times_iterator< Stepper , System , State , TimeIterator > make_times_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+        //TimeIterator t_end )
+    {
+        return times_iterator< Stepper , System , State , TimeIterator >( stepper , system , x );
+    }
+
+    template< class Stepper , class System , class State , class TimeIterator >
+    std::pair< times_iterator< Stepper , System , State , TimeIterator > ,
+               times_iterator< Stepper , System , State , TimeIterator > >
+    make_times_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            times_iterator< Stepper , System , State , TimeIterator >( stepper , system , x , t_start , t_end , dt ) ,
+            times_iterator< Stepper , System , State , TimeIterator >( stepper , system , x )
+            );
+    }
+
+
+    /**
+     * \class times_iterator
+     *
+     * \brief ODE Iterator with given evaluation points. The value type of this iterator is the state type of the stepper.
+     *
+     * Implements an iterator representing the solution of an ODE from *t_start
+     * to *t_end evaluated at time points given by the sequence t_start to t_end.
+     * t_start and t_end are iterators representing a sequence of time points
+     * where the solution of the ODE should be evaluated.
+     * After each iteration the iterator dereferences to the state x at the next
+     * time *t_start++ until t_end is reached.
+     * This iterator can be used with Steppers, ControlledSteppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_times routine.
+     *
+     * times_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     * \tparam TimeIterator The iterator type for the sequence of time points.
+     */
+
+
+
+    /**
+     * \fn make_times_iterator_begin( Stepper stepper ,
+        System system ,
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for times_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start Begin iterator of the sequence of evaluation time points.
+     * \param t_end End iterator of the sequence of evaluation time points.
+     * \param dt The initial time step.
+     * \returns The times iterator.
+     */
+
+
+    /**
+     * \fn make_times_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for times_iterator. Constructs an end iterator.
+     *
+     * \tparam TimesIterator The iterator type of the time sequence, must be specifically provided.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The times iterator.
+     *
+     * This function needs the TimeIterator type specifically defined as a
+     * template parameter.
+     */
+
+
+    /**
+     * \fn make_times_range( Stepper stepper , System system , State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function to construct a single pass range of times iterators. A range is here a pair
+     * of times_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator store a reference of s and changes its value during the iteration.
+     * \param t_start Begin iterator of the sequence of evaluation time points.
+     * \param t_end End iterator of the sequence of evaluation time points.
+     * \param dt The initial time step.
+     * \returns The times iterator range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/iterator/times_time_iterator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,193 @@
+
+/*
+ [auto_generated]
+ boost/numeric/odeint/iterator/times_time_iterator.hpp
+
+ [begin_description]
+ Iterator for iterating through the solution of an ODE with oscillator calls at times from a given sequence.
+ The dereferenced type contains also the time.
+ [end_description]
+
+ Copyright 2009-2013 Karsten Ahnert
+ Copyright 2009-2013 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_TIME_ITERATOR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_TIME_ITERATOR_HPP_INCLUDED
+
+
+#include <boost/numeric/odeint/util/stepper_traits.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp>
+#include <boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+    /* use the times_iterator_impl with the right tags */
+    template< class Stepper , class System , class State , class TimeIterator
+#ifndef DOXYGEN_SKIP
+        , class StepperTag = typename base_tag< typename traits::stepper_category< Stepper >::type >::type
+#endif
+    >
+    class times_time_iterator : public times_iterator_impl<
+            times_time_iterator< Stepper , System , State , TimeIterator , StepperTag > ,
+            Stepper , System , State , TimeIterator , detail::ode_state_time_iterator_tag , StepperTag
+        >
+    {
+        typedef typename traits::time_type< Stepper >::type time_type;
+        typedef times_time_iterator< Stepper , System , State , TimeIterator , StepperTag > iterator_type;
+
+    public:
+        times_time_iterator( Stepper stepper , System sys , State &s ,
+                        TimeIterator t_start , TimeIterator t_end , time_type dt )
+            : times_iterator_impl< iterator_type , Stepper , System , State , TimeIterator, detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s , t_start , t_end , dt )
+        {}
+
+        times_time_iterator( Stepper stepper , System sys , State &s )
+            : times_iterator_impl< iterator_type , Stepper , System , State , TimeIterator , detail::ode_state_time_iterator_tag , StepperTag >( stepper , sys , s )
+        {}
+    };
+
+    /* make functions */
+
+    template< class Stepper , class System , class State , class TimeIterator >
+    times_time_iterator< Stepper , System, State , TimeIterator > make_times_time_iterator_begin(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return times_time_iterator< Stepper , System , State , TimeIterator >( stepper , system , x , t_start , t_end , dt );
+    }
+
+    // ToDo: requires to specifically provide the TimeIterator template parameter, can this be improved?
+    template< class TimeIterator , class Stepper , class System , class State >
+    times_time_iterator< Stepper , System , State , TimeIterator > make_times_time_iterator_end(
+        Stepper stepper ,
+        System system , 
+        State &x )
+        //TimeIterator t_end )
+    {
+        return times_time_iterator< Stepper , System , State , TimeIterator >( stepper , system , x );
+    }
+
+    template< class Stepper , class System , class State , class TimeIterator >
+    std::pair< times_time_iterator< Stepper , System , State , TimeIterator > ,
+               times_time_iterator< Stepper , System , State , TimeIterator > >
+    make_times_time_range(
+        Stepper stepper ,
+        System system , 
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+    {
+        return std::make_pair(
+            times_time_iterator< Stepper , System , State , TimeIterator >( stepper , system , x , t_start , t_end , dt ) ,
+            times_time_iterator< Stepper , System , State , TimeIterator >( stepper , system , x )
+            );
+    }
+
+
+
+
+
+    /**
+     * \class times_time_iterator
+     *
+     * \brief ODE Iterator with given evaluation points. The value type of this iterator is a std::pair containing state and time.
+     *
+     * Implements an iterator representing the solution of an ODE from *t_start
+     * to *t_end evaluated at time points given by the sequence t_start to t_end.
+     * t_start and t_end are iterators representing a sequence of time points
+     * where the solution of the ODE should be evaluated.
+     * After each iteration the iterator dereferences to a pair with the state
+     * and the time at the next evaluation point *t_start++ until t_end is reached.
+     * This iterator can be used with Steppers, ControlledSteppers and
+     * DenseOutputSteppers and it always makes use of the all the given steppers
+     * capabilities. A for_each over such an iterator range behaves similar to
+     * the integrate_times routine.
+     *
+     * times_time_iterator is a model of single-pass iterator.
+     *
+     * The value type of this iterator is a pair of state and time type.
+     *
+     * \tparam Stepper The stepper type which should be used during the iteration.
+     * \tparam System The type of the system function (ODE) which should be solved.
+     * \tparam State The state type of the ODE.
+     * \tparam TimeIterator The iterator type for the sequence of time points.
+     */
+
+
+
+    /**
+     * \fn make_times_time_iterator_begin( Stepper stepper ,
+        System system ,
+        State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function for times_time_iterator. Constructs a begin iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \param t_start Begin iterator of the sequence of evaluation time points.
+     * \param t_end End iterator of the sequence of evaluation time points.
+     * \param dt The initial time step.
+     * \returns The times_time iterator.
+     */
+
+
+    /**
+     * \fn make_times_time_iterator_end( Stepper stepper , System system , State &x )
+     * \brief Factory function for times_time_iterator. Constructs an end iterator.
+     *
+     * \tparam TimesIterator The iterator type of the time sequence, must be specifically provided.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.
+     * \returns The times_time iterator.
+     *
+     * This function needs the TimeIterator type specifically defined as a
+     * template parameter.
+     */
+
+
+    /**
+     * \fn make_times_time_range( Stepper stepper , System system , State &x ,
+        TimeIterator t_start ,
+        TimeIterator t_end ,
+        typename traits::time_type< Stepper >::type dt )
+     *
+     * \brief Factory function to construct a single pass range of times_time iterators. A range is here a pair
+     * of times_iterator.
+     *
+     * \param stepper The stepper to use during the iteration.
+     * \param system The system function (ODE) to solve.
+     * \param x The initial state. const_step_iterator store a reference of s and changes its value during the iteration.
+     * \param t_start Begin iterator of the sequence of evaluation time points.
+     * \param t_end End iterator of the sequence of evaluation time points.
+     * \param dt The initial time step.
+     * \returns The times_time iterator range.
+     */
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif // BOOST_NUMERIC_ODEINT_ITERATOR_TIMES_TIME_ITERATOR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/stepper/extrapolation_stepper.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,293 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/stepper/extrapolation_stepper.hpp
+
+  [begin_description]
+  extrapolation stepper
+  [end_description]
+
+  Copyright 2009-2015 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_NUMERIC_ODEINT_STEPPER_EXTRAPOLATION_STEPPER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_STEPPER_EXTRAPOLATION_STEPPER_HPP_INCLUDED
+
+#include <iostream>
+
+#include <algorithm>
+
+#include <boost/config.hpp> // for min/max guidelines
+#include <boost/static_assert.hpp>
+
+#include <boost/numeric/odeint/util/bind.hpp>
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+
+#include <boost/numeric/odeint/stepper/base/explicit_error_stepper_base.hpp>
+#include <boost/numeric/odeint/stepper/modified_midpoint.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/algebra/range_algebra.hpp>
+#include <boost/numeric/odeint/algebra/default_operations.hpp>
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
+
+#include <boost/numeric/odeint/util/state_wrapper.hpp>
+#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/util/resizer.hpp>
+#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+
+namespace boost
+{
+namespace numeric
+{
+namespace odeint
+{
+
+template < unsigned short Order, class State, class Value = double,
+           class Deriv = State, class Time = Value,
+           class Algebra = typename algebra_dispatcher< State >::algebra_type,
+           class Operations =
+               typename operations_dispatcher< State >::operations_type,
+           class Resizer = initially_resizer >
+#ifndef DOXYGEN_SKIP
+class extrapolation_stepper
+    : public explicit_error_stepper_base<
+          extrapolation_stepper< Order, State, Value, Deriv, Time, Algebra,
+                                 Operations, Resizer >,
+          Order, Order, Order - 2, State, Value, Deriv, Time, Algebra,
+          Operations, Resizer >
+#else
+class extrapolation_stepper : public explicit_error_stepper_base
+#endif
+{
+
+  private:
+    // check for Order being odd
+    BOOST_STATIC_ASSERT_MSG(
+        ( ( Order % 2 ) == 0 ) && ( Order > 2 ),
+        "extrapolation_stepper requires even Order larger than 2" );
+
+  public:
+#ifndef DOXYGEN_SKIP
+    typedef explicit_error_stepper_base<
+        extrapolation_stepper< Order, State, Value, Deriv, Time, Algebra,
+                               Operations, Resizer >,
+        Order, Order, Order - 2, State, Value, Deriv, Time, Algebra, Operations,
+        Resizer > stepper_base_type;
+#else
+    typedef explicit_error_stepper_base< extrapolation_stepper< ... >, ... >
+    stepper_base_type;
+#endif
+
+    typedef typename stepper_base_type::state_type state_type;
+    typedef typename stepper_base_type::value_type value_type;
+    typedef typename stepper_base_type::deriv_type deriv_type;
+    typedef typename stepper_base_type::time_type time_type;
+    typedef typename stepper_base_type::algebra_type algebra_type;
+    typedef typename stepper_base_type::operations_type operations_type;
+    typedef typename stepper_base_type::resizer_type resizer_type;
+
+#ifndef DOXYGEN_SKIP
+    typedef typename stepper_base_type::stepper_type stepper_type;
+    typedef typename stepper_base_type::wrapped_state_type wrapped_state_type;
+    typedef typename stepper_base_type::wrapped_deriv_type wrapped_deriv_type;
+
+    typedef std::vector< value_type > value_vector;
+    typedef std::vector< value_vector > value_matrix;
+    typedef std::vector< size_t > int_vector;
+    typedef std::vector< wrapped_state_type > state_table_type;
+    typedef modified_midpoint< state_type, value_type, deriv_type, time_type,
+                               algebra_type, operations_type,
+                               resizer_type > midpoint_stepper_type;
+
+#endif // DOXYGEN_SKIP
+
+    typedef unsigned short order_type;
+    static const order_type order_value = stepper_base_type::order_value;
+    static const order_type stepper_order_value =
+        stepper_base_type::stepper_order_value;
+    static const order_type error_order_value =
+        stepper_base_type::error_order_value;
+
+    const static size_t m_k_max = ( order_value - 2 ) / 2;
+
+    extrapolation_stepper( const algebra_type &algebra = algebra_type() )
+        : stepper_base_type( algebra ), m_interval_sequence( m_k_max + 1 ),
+          m_coeff( m_k_max + 1 ), m_table( m_k_max )
+    {
+        for ( unsigned short i = 0; i < m_k_max + 1; i++ )
+        {
+            m_interval_sequence[i] = 2 * ( i + 1 );
+            m_coeff[i].resize( i );
+            for ( size_t k = 0; k < i; ++k )
+            {
+                const value_type r =
+                    static_cast< value_type >( m_interval_sequence[i] ) /
+                    static_cast< value_type >( m_interval_sequence[k] );
+                m_coeff[i][k] =
+                    static_cast< value_type >( 1 ) /
+                    ( r * r - static_cast< value_type >(
+                                  1 ) ); // coefficients for extrapolation
+            }
+        }
+    }
+
+    template < class System, class StateIn, class DerivIn, class StateOut,
+               class Err >
+    void do_step_impl( System system, const StateIn &in, const DerivIn &dxdt,
+                       time_type t, StateOut &out, time_type dt, Err &xerr )
+    {
+        // std::cout << "dt: " << dt << std::endl;
+        // normal step
+        do_step_impl( system, in, dxdt, t, out, dt );
+
+        static const value_type val1( 1.0 );
+        // additionally, perform the error calculation
+        stepper_base_type::m_algebra.for_each3(
+            xerr, out, m_table[0].m_v,
+            typename operations_type::template scale_sum2<
+                value_type, value_type >( val1, -val1 ) );
+    }
+
+    template < class System, class StateInOut, class DerivIn, class Err >
+    void do_step_impl_io( System system, StateInOut &inout, const DerivIn &dxdt,
+                          time_type t, time_type dt, Err &xerr )
+    {
+        // normal step
+        do_step_impl_io( system, inout, dxdt, t, dt );
+
+        static const value_type val1( 1.0 );
+        // additionally, perform the error calculation
+        stepper_base_type::m_algebra.for_each3(
+            xerr, inout, m_table[0].m_v,
+            typename operations_type::template scale_sum2<
+                value_type, value_type >( val1, -val1 ) );
+    }
+
+    template < class System, class StateIn, class DerivIn, class StateOut >
+    void do_step_impl( System system, const StateIn &in, const DerivIn &dxdt,
+                       time_type t, StateOut &out, time_type dt )
+    {
+        m_resizer.adjust_size(
+            in, detail::bind( &stepper_type::template resize_impl< StateIn >,
+                              detail::ref( *this ), detail::_1 ) );
+        size_t k = 0;
+        m_midpoint.set_steps( m_interval_sequence[k] );
+        m_midpoint.do_step( system, in, dxdt, t, out, dt );
+        for ( k = 1; k <= m_k_max; ++k )
+        {
+            m_midpoint.set_steps( m_interval_sequence[k] );
+            m_midpoint.do_step( system, in, dxdt, t, m_table[k - 1].m_v, dt );
+            extrapolate( k, m_table, m_coeff, out );
+        }
+    }
+
+    template < class System, class StateInOut, class DerivIn >
+    void do_step_impl_io( System system, StateInOut &inout, const DerivIn &dxdt,
+                          time_type t, time_type dt )
+    {
+        // special care for inout
+        m_xout_resizer.adjust_size(
+            inout,
+            detail::bind( &stepper_type::template resize_m_xout< StateInOut >,
+                          detail::ref( *this ), detail::_1 ) );
+        do_step_impl( system, inout, dxdt, t, m_xout.m_v, dt );
+        boost::numeric::odeint::copy( m_xout.m_v, inout );
+    }
+
+    template < class System, class StateInOut, class DerivIn >
+    void do_step_dxdt_impl( System system, StateInOut &x, const DerivIn &dxdt,
+                            time_type t, time_type dt )
+    {
+        do_step_impl_io( system , x , dxdt , t , dt );
+    }
+
+    template < class System, class StateIn, class DerivIn, class StateOut >
+    void do_step_dxdt_impl( System system, const StateIn &in,
+                            const DerivIn &dxdt, time_type t, StateOut &out,
+                            time_type dt )
+    {
+        do_step_impl( system , in , dxdt , t , out , dt );
+    }
+
+
+    template < class StateIn > void adjust_size( const StateIn &x )
+    {
+        resize_impl( x );
+        m_midpoint.adjust_size( x );
+    }
+
+  private:
+    template < class StateIn > bool resize_impl( const StateIn &x )
+    {
+        bool resized( false );
+        for ( size_t i = 0; i < m_k_max; ++i )
+            resized |= adjust_size_by_resizeability(
+                m_table[i], x, typename is_resizeable< state_type >::type() );
+        return resized;
+    }
+
+    template < class StateIn > bool resize_m_xout( const StateIn &x )
+    {
+        return adjust_size_by_resizeability(
+            m_xout, x, typename is_resizeable< state_type >::type() );
+    }
+
+    template < class StateInOut >
+    void extrapolate( size_t k, state_table_type &table,
+                      const value_matrix &coeff, StateInOut &xest )
+    /* polynomial extrapolation, see http://www.nr.com/webnotes/nr3web21.pdf
+       uses the obtained intermediate results to extrapolate to dt->0
+    */
+    {
+        static const value_type val1 = static_cast< value_type >( 1.0 );
+
+        for ( int j = k - 1; j > 0; --j )
+        {
+            stepper_base_type::m_algebra.for_each3(
+                table[j - 1].m_v, table[j].m_v, table[j - 1].m_v,
+                typename operations_type::template scale_sum2<
+                    value_type, value_type >( val1 + coeff[k][j],
+                                              -coeff[k][j] ) );
+        }
+        stepper_base_type::m_algebra.for_each3(
+            xest, table[0].m_v, xest,
+            typename operations_type::template scale_sum2<
+                value_type, value_type >( val1 + coeff[k][0], -coeff[k][0] ) );
+    }
+
+  private:
+    midpoint_stepper_type m_midpoint;
+
+    resizer_type m_resizer;
+    resizer_type m_xout_resizer;
+
+    int_vector m_interval_sequence; // stores the successive interval counts
+    value_matrix m_coeff;
+
+    wrapped_state_type m_xout;
+    state_table_type m_table; // sequence of states for extrapolation
+};
+
+/******** DOXYGEN *******/
+
+/**
+ * \class extrapolation_stepper
+ * \brief Extrapolation stepper with configurable order, and error estimation.
+ *
+ * The extrapolation stepper is a stepper with error estimation and configurable
+ * order. The order is given as template parameter and needs to be an _odd_
+ * number. The stepper is based on several executions of the modified midpoint
+ * method and a Richardson extrapolation. This is essentially the same technique
+ * as for bulirsch_stoer, but without the variable order.
+ *
+ * \note The Order parameter has to be an even number greater 2.
+ */
+}
+}
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/stepper/velocity_verlet.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,381 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/stepper/velocity_verlet.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_STEPPER_VELOCITY_VERLET_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_STEPPER_VELOCITY_VERLET_HPP_DEFINED
+
+#include <boost/numeric/odeint/stepper/base/algebra_stepper_base.hpp>
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+
+#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
+#include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
+#include <boost/numeric/odeint/util/resizer.hpp>
+#include <boost/numeric/odeint/util/state_wrapper.hpp>
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+
+#include <boost/numeric/odeint/util/bind.hpp>
+#include <boost/numeric/odeint/util/copy.hpp>
+#include <boost/numeric/odeint/util/resizer.hpp>
+// #include <boost/numeric/odeint/util/is_pair.hpp>
+// #include <boost/array.hpp>
+
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+
+template <
+    class Coor ,
+    class Velocity = Coor ,
+    class Value = double ,
+    class Acceleration = Coor ,
+    class Time = Value ,
+    class TimeSq = Time ,
+    class Algebra = typename algebra_dispatcher< Coor >::algebra_type ,
+    class Operations = typename operations_dispatcher< Coor >::operations_type ,
+    class Resizer = initially_resizer
+      >
+class velocity_verlet : public algebra_stepper_base< Algebra , Operations >
+{
+public:
+
+    typedef algebra_stepper_base< Algebra , Operations > algebra_stepper_base_type;
+    typedef typename algebra_stepper_base_type::algebra_type algebra_type;
+    typedef typename algebra_stepper_base_type::operations_type operations_type;
+
+    typedef Coor coor_type;
+    typedef Velocity velocity_type;
+    typedef Acceleration acceleration_type;
+    typedef std::pair< coor_type , velocity_type > state_type;
+    typedef std::pair< velocity_type , acceleration_type > deriv_type;
+    typedef state_wrapper< acceleration_type > wrapped_acceleration_type;
+    typedef Value value_type;
+    typedef Time time_type;
+    typedef TimeSq time_square_type;
+    typedef Resizer resizer_type;
+    typedef stepper_tag stepper_category;
+
+    typedef unsigned short order_type;
+
+    static const order_type order_value = 1;
+
+    /**
+     * \return Returns the order of the stepper.
+     */
+    order_type order( void ) const
+    {
+        return order_value;
+    }
+
+
+    velocity_verlet( const algebra_type & algebra = algebra_type() )
+        : algebra_stepper_base_type( algebra ) , m_first_call( true )
+        , m_a1() , m_a2() , m_current_a1( true ) { }
+
+
+    template< class System , class StateInOut >
+    void do_step( System system , StateInOut & x , time_type t , time_type dt )
+    {
+        do_step_v1( system , x , t , dt );
+    }
+
+    
+    template< class System , class StateInOut >
+    void do_step( System system , const StateInOut & x , time_type t , time_type dt )
+    {
+        do_step_v1( system , x , t , dt );
+    }
+
+    
+    template< class System , class CoorIn , class VelocityIn , class AccelerationIn ,
+                             class CoorOut , class VelocityOut , class AccelerationOut >
+    void do_step( System system , CoorIn const & qin , VelocityIn const & pin , AccelerationIn const & ain ,
+                  CoorOut & qout , VelocityOut & pout , AccelerationOut & aout , time_type t , time_type dt )
+    {
+        const value_type one = static_cast< value_type >( 1.0 );
+        const value_type one_half = static_cast< value_type >( 0.5 );
+
+        algebra_stepper_base_type::m_algebra.for_each4(
+            qout , qin , pin , ain ,
+            typename operations_type::template scale_sum3< value_type , time_type , time_square_type >( one , one * dt , one_half * dt * dt ) );
+
+        typename odeint::unwrap_reference< System >::type & sys = system;
+
+        sys( qout , pin , aout , t + dt );
+
+        algebra_stepper_base_type::m_algebra.for_each4(
+            pout , pin , ain , aout ,
+            typename operations_type::template scale_sum3< value_type , time_type , time_type >( one , one_half * dt , one_half * dt ) );
+    }
+
+
+    template< class StateIn >
+    void adjust_size( const StateIn & x )
+    {
+        if( resize_impl( x ) )
+            m_first_call = true;
+    }
+
+    void reset( void )
+    {
+        m_first_call = true;
+    }
+
+    
+    /**
+     * \fn velocity_verlet::initialize( const AccelerationIn &qin )
+     * \brief Initializes the internal state of the stepper.
+     * \param deriv The acceleration of x. The next call of `do_step` expects that the acceleration of `x` passed to `do_step`
+     *              has the value of `qin`.
+     */
+    template< class AccelerationIn >
+    void initialize( const AccelerationIn & ain )
+    {
+        // alloc a
+        m_resizer.adjust_size( ain ,
+                               detail::bind( &velocity_verlet::template resize_impl< AccelerationIn > ,
+                                             detail::ref( *this ) , detail::_1 ) );
+        boost::numeric::odeint::copy( ain , get_current_acc() );
+        m_first_call = false;
+    }
+
+
+    template< class System , class CoorIn , class VelocityIn >
+    void initialize( System system , const CoorIn & qin , const VelocityIn & pin , time_type t )
+    {
+        m_resizer.adjust_size( qin ,
+                               detail::bind( &velocity_verlet::template resize_impl< CoorIn > ,
+                                             detail::ref( *this ) , detail::_1 ) );
+        initialize_acc( system , qin , pin , t );
+    }
+
+    bool is_initialized( void ) const
+    {
+        return ! m_first_call;
+    }
+
+
+private:
+    
+    template< class System , class CoorIn , class VelocityIn >
+    void initialize_acc( System system , const CoorIn & qin , const VelocityIn & pin , time_type t )
+    {
+        typename odeint::unwrap_reference< System >::type & sys = system;
+        sys( qin , pin , get_current_acc() , t );
+        m_first_call = false;
+    }
+    
+    template< class System , class StateInOut >
+    void do_step_v1( System system , StateInOut & x , time_type t , time_type dt )
+    {
+        typedef typename odeint::unwrap_reference< StateInOut >::type state_in_type;
+        typedef typename odeint::unwrap_reference< typename state_in_type::first_type >::type coor_in_type;
+        typedef typename odeint::unwrap_reference< typename state_in_type::second_type >::type momentum_in_type;
+        
+        typedef typename boost::remove_reference< coor_in_type >::type xyz_type;
+        state_in_type & statein = x;
+        coor_in_type & qinout = statein.first;
+        momentum_in_type & pinout = statein.second;
+
+        // alloc a
+        if( m_resizer.adjust_size( qinout ,
+                                   detail::bind( &velocity_verlet::template resize_impl< xyz_type > ,
+                                                 detail::ref( *this ) , detail::_1 ) )
+         || m_first_call )
+        {
+            initialize_acc( system , qinout , pinout , t );
+        }
+
+        // check first
+        do_step( system , qinout , pinout , get_current_acc() , qinout , pinout , get_old_acc() , t , dt );
+        toggle_current_acc();
+    }
+
+    template< class StateIn >
+    bool resize_impl( const StateIn & x )
+    {
+        bool resized = false;
+        resized |= adjust_size_by_resizeability( m_a1 , x , typename is_resizeable< acceleration_type >::type() );
+        resized |= adjust_size_by_resizeability( m_a2 , x , typename is_resizeable< acceleration_type >::type() );
+        return resized;
+    }
+
+    acceleration_type & get_current_acc( void )
+    {
+        return m_current_a1 ? m_a1.m_v : m_a2.m_v ;
+    }
+
+    const acceleration_type & get_current_acc( void ) const
+    {
+        return m_current_a1 ? m_a1.m_v : m_a2.m_v ;
+    }
+
+    acceleration_type & get_old_acc( void )
+    {
+        return m_current_a1 ? m_a2.m_v : m_a1.m_v ;
+    }
+
+    const acceleration_type & get_old_acc( void ) const
+    {
+        return m_current_a1 ? m_a2.m_v : m_a1.m_v ;
+    }
+
+    void toggle_current_acc( void )
+    {
+        m_current_a1 = ! m_current_a1;
+    }
+
+    resizer_type m_resizer;
+    bool m_first_call;
+    wrapped_acceleration_type m_a1 , m_a2;
+    bool m_current_a1;
+};
+
+/**
+ * \class velocity_verlet
+ * \brief The Velocity-Verlet algorithm.
+ *
+ * <a href="http://en.wikipedia.org/wiki/Verlet_integration" >The Velocity-Verlet algorithm</a> is a method for simulation of molecular dynamics systems. It solves the ODE
+ * a=f(r,v',t)  where r are the coordinates, v are the velocities and a are the accelerations, hence v = dr/dt, a=dv/dt.
+ * 
+ * \tparam Coor The type representing the coordinates.
+ * \tparam Velocity The type representing the velocities.
+ * \tparam Value The type value type.
+ * \tparam Acceleration The type representing the acceleration.
+ * \tparam Time The time representing the independent variable - the time.
+ * \tparam TimeSq The time representing the square of the time.
+ * \tparam Algebra The algebra.
+ * \tparam Operations The operations type.
+ * \tparam Resizer The resizer policy type.
+ */
+
+
+    /**
+     * \fn velocity_verlet::velocity_verlet( const algebra_type &algebra )
+     * \brief Constructs the velocity_verlet class. This constructor can be used as a default
+     * constructor if the algebra has a default constructor. 
+     * \param algebra A copy of algebra is made and stored.
+     */
+
+    
+    /**
+     * \fn velocity_verlet::do_step( System system , StateInOut &x , time_type t , time_type dt )
+     * \brief This method performs one step. It transforms the result in-place.
+     * 
+     * It can be used like
+     * \code
+     * pair< coordinates , velocities > state;
+     * stepper.do_step( sys , x , t , dt );
+     * \endcode
+     *
+     * \param system The system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the
+     *               Second Order System concept.
+     * \param x The state of the ODE which should be solved. The state is pair of Coor and Velocity.
+     * \param t The value of the time, at which the step should be performed.
+     * \param dt The step size.
+     */
+
+    /**
+     * \fn velocity_verlet::do_step( System system , const StateInOut &x , time_type t , time_type dt )
+     * \brief This method performs one step. It transforms the result in-place.
+     * 
+     * It can be used like
+     * \code
+     * pair< coordinates , velocities > state;
+     * stepper.do_step( sys , x , t , dt );
+     * \endcode
+     *
+     * \param system The system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the
+     *               Second Order System concept.
+     * \param x The state of the ODE which should be solved. The state is pair of Coor and Velocity.
+     * \param t The value of the time, at which the step should be performed.
+     * \param dt The step size.
+     */    
+
+    
+
+    /**
+     * \fn velocity_verlet::do_step( System system , CoorIn const & qin , VelocityIn const & pin , AccelerationIn const & ain , CoorOut & qout , VelocityOut & pout , AccelerationOut & aout , time_type t , time_type dt )
+     * \brief This method performs one step. It transforms the result in-place. Additionally to the other methods
+     * the coordinates, velocities and accelerations are passed directly to do_step and they are transformed out-of-place.
+     * 
+     * It can be used like
+     * \code
+     * coordinates qin , qout;
+     * velocities pin , pout;
+     * accelerations ain, aout;
+     * stepper.do_step( sys , qin , pin , ain , qout , pout , aout , t , dt );
+     * \endcode
+     *
+     * \param system The system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the
+     *               Second Order System concept.
+     * \param x The state of the ODE which should be solved. The state is pair of Coor and Velocity.
+     * \param t The value of the time, at which the step should be performed.
+     * \param dt The step size.
+     */
+
+    
+    /**
+     * \fn void velocity_verlet::adjust_size( const StateIn &x )
+     * \brief Adjust the size of all temporaries in the stepper manually.
+     * \param x A state from which the size of the temporaries to be resized is deduced.
+     */
+
+
+    /**
+     * \fn velocity_verlet::reset( void )
+     * \brief Resets the internal state of this stepper. After calling this method it is safe to use all
+     * `do_step` method without explicitly initializing the stepper.
+     */
+
+    
+
+    /**
+     * \fn velocity_verlet::initialize( System system , const CoorIn &qin , const VelocityIn &pin , time_type t )
+     * \brief Initializes the internal state of the stepper.
+     *
+     * This method is equivalent to 
+     * \code
+     * Acceleration a;
+     * system( qin , pin , a , t );
+     * stepper.initialize( a );
+     * \endcode
+     *
+     * \param system The system function for the next calls of `do_step`.
+     * \param qin The current coordinates of the ODE.
+     * \param pin The current velocities of the ODE.
+     * \param t The current time of the ODE.
+     */
+    
+    
+    /**
+     * \fn velocity_verlet::is_initialized()
+     * \returns Returns if the stepper is initialized.
+    */
+    
+    
+    
+    
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_STEPPER_VELOCITY_VERLET_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/util/multi_array_adaption.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,130 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/util/multi_array_adaption.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2009-2012 Karsten Ahnert
+  Copyright 2009-2012 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED
+
+
+
+#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
+#include <boost/numeric/odeint/util/same_size.hpp>
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/multi_array.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+    
+template< typename T >
+struct is_multi_array
+{
+    typedef boost::false_type type;
+    const static bool value = type::value;
+};
+    
+template< typename T >
+struct is_resizeable_multi_array
+{
+    typedef boost::false_type type;
+    const static bool value = type::value;
+};
+
+
+
+template< typename V , size_t Dim , typename A >
+struct is_multi_array< boost::multi_array< V , Dim , A > >
+{
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+template< typename V , size_t Dim , typename A >
+struct is_resizeable_multi_array< boost::multi_array< V , Dim , A > >
+{
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+
+
+
+template< typename T  >
+struct is_resizeable_sfinae< T , typename boost::enable_if< typename is_resizeable_multi_array< T >::type >::type >
+{
+    typedef boost::true_type type;
+    const static bool value = type::value;
+};
+
+
+
+
+
+template< typename T1 , typename T2  >
+struct same_size_impl_sfinae< T1 , T2 ,
+                       typename boost::enable_if<
+                           typename boost::mpl::and_< 
+                               is_multi_array< T1 > ,
+                               is_multi_array< T2 > ,
+                               boost::mpl::bool_< T1::dimensionality == T2::dimensionality >
+                           >::type
+                       >::type >
+{
+    static bool same_size( T1 const &x1 , T2 const &x2 )
+    {
+        for( size_t i=0 ; i<T1::dimensionality ; ++i )
+        {
+            if( x1.shape()[i] != x2.shape()[i] ) return false;
+            if( x1.index_bases()[i] != x2.index_bases()[i] ) return false;
+        }
+        return true;
+    }
+};
+
+
+template< typename T1 , typename T2 >
+struct resize_impl_sfinae< T1 , T2 ,
+                    typename boost::enable_if<
+                        typename boost::mpl::and_<
+                            is_resizeable_multi_array< T1 > ,
+                            is_multi_array< T2 > ,
+                            boost::mpl::bool_< T1::dimensionality == T2::dimensionality >
+                        >::type
+                    >::type >
+{
+    static void resize( T1 &x1 , const T2 &x2 )
+    {
+        boost::array< int , T1::dimensionality > extents;
+        for( size_t i=0 ; i<T1::dimensionality ; ++i ) extents[i] = x2.shape()[i];
+        x1.resize( extents );
+        boost::array< int , T1::dimensionality > origins;
+        for( size_t i=0 ; i<T1::dimensionality ; ++i ) origins[i] = x2.index_bases()[i];
+        x1.reindex( origins );
+    }
+};
+                            
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/util/n_ary_helper.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,96 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/util/n_ary_helper.hpp
+
+ Macros to generate scale_sumN and for_eachN functors.
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_N_ARY_HELPER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_UTIL_N_ARY_HELPER_HPP_INCLUDED
+
+#include <boost/preprocessor/repetition.hpp>
+
+// like BOOST_PP_ENUM_SHIFTED but with a comma in front like _TRAILING
+#define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_PARAMS(count, param) \
+    BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \
+    BOOST_PP_ENUM_SHIFTED_PARAMS(count, param)
+
+#define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_BINARY_PARAMS(count, p1, p2) \
+    BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \
+    BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2)
+
+// like BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(n, p1, p2) but p2 is shifted left.
+// generate "p1 ## 0 = p2, p1 ## 1 = p3 ## 0, p1 ## 2 = p3 ## 1"
+#define BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS(count, p1, p2, p3) \
+    BOOST_PP_ENUM(count, BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS_, (p1, p2, p3))
+#define BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS_(z, n, data) \
+    BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 0, data), n) \
+    BOOST_PP_IF(n, \
+        BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 2, data), BOOST_PP_DEC(n)), \
+        BOOST_PP_TUPLE_ELEM(3, 1, data))
+
+// like BOOST_PP_ENUM_BINARY_PARAMS(n, p1, p2) but with statements.
+// "p1 ## 0 p2 ## 0 ; p1 ## 1 p2 ## 1 ; ..."
+#define BOOST_ODEINT_ENUM_BINARY_STATEMENTS(count, p1, p2) \
+    BOOST_PP_REPEAT(count, BOOST_ODEINT_ENUM_BINARY_STATEMENTS_, (p1, p2))
+#define BOOST_ODEINT_ENUM_BINARY_STATEMENTS_(z, n, data) \
+    BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, data), n) \
+    BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, data), n) ;
+
+// like BOOST_PP_ENUM_BINARY_PARAMS(n, p1, p2) but p2 is in parens.
+// "p1 ## 0 (p2 ## 0) , p1 ## 1 (p2 ## 1) , ..."
+#define BOOST_ODEINT_ENUM_UNARY_CALLS(count, p1, p2) \
+    BOOST_PP_ENUM(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2))
+#define BOOST_ODEINT_ENUM_SHIFTED_UNARY_CALLS(count, p1, p2) \
+    BOOST_PP_ENUM_SHIFTED(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2))
+#define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_UNARY_CALLS(count, p1, p2) \
+    BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \
+    BOOST_PP_ENUM_SHIFTED(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2))
+#define BOOST_ODEINT_ENUM_UNARY_CALLS_(z, n, data) \
+      BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, data), n) \
+    ( BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, data), n) )
+
+
+// maximum arity + 1 for scale_sum and for_each
+#define BOOST_ODEINT_N_ARY_MAX 16
+
+
+// generate scale_sum1 to scale_sumN, operator body generated by macro(N)
+#define BOOST_ODEINT_GEN_SCALE_SUM(macro) \
+    BOOST_PP_REPEAT_FROM_TO(1, BOOST_ODEINT_N_ARY_MAX, BOOST_ODEINT_GEN_SCALE_SUM_, macro)
+#define BOOST_ODEINT_GEN_SCALE_SUM_(z, n, macro) \
+    template< BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS(n, class Fac, = double, = Fac) > \
+    struct BOOST_PP_CAT(scale_sum, n) \
+    { \
+        BOOST_ODEINT_ENUM_BINARY_STATEMENTS(n, const Fac, m_alpha) \
+        \
+        BOOST_PP_CAT(scale_sum, n) \
+        ( BOOST_PP_ENUM_BINARY_PARAMS(n, Fac, alpha) ) \
+        : BOOST_ODEINT_ENUM_UNARY_CALLS(n, m_alpha, alpha) {} \
+        \
+        template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), class T) > \
+        void operator()( T0 &t0 \
+            BOOST_ODEINT_ENUM_TRAILING_SHIFTED_BINARY_PARAMS(BOOST_PP_INC(n), const T, &t) \
+        ) const \
+        { macro(n) } \
+        typedef void result_type; \
+    };
+
+// generate for_each1 to for_eachN, body generated by macro(N)
+#define BOOST_ODEINT_GEN_FOR_EACH(macro) \
+    BOOST_PP_REPEAT_FROM_TO(1, BOOST_ODEINT_N_ARY_MAX, BOOST_ODEINT_GEN_FOR_EACH_, macro)
+#define BOOST_ODEINT_GEN_FOR_EACH_(z, n, macro) \
+    template< BOOST_PP_ENUM_PARAMS(n, class S) , class Op > \
+    static void for_each##n ( BOOST_PP_ENUM_BINARY_PARAMS(n, S, &s) , Op op ) \
+    { macro(n) }
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/util/split.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/util/split.hpp
+
+ [begin_description]
+ Split abstraction for parallel backends.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_SPLIT_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_UTIL_SPLIT_HPP_INCLUDED
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/*
+ * No default implementation of the split operation
+ */
+template< class Container1, class Container2 , class Enabler = void >
+struct split_impl
+{
+    static void split( const Container1 &from , Container2 &to );
+};
+
+template< class Container1 , class Container2 >
+void split( const Container1 &from , Container2 &to )
+{
+    split_impl< Container1 , Container2 >::split( from , to );
+}
+
+
+/*
+ * No default implementation of the unsplit operation
+ */
+template< class Container1, class Container2 , class Enabler = void >
+struct unsplit_impl
+{
+    static void unsplit( const Container1 &from , Container2 &to );
+};
+
+template< class Container1 , class Container2 >
+void unsplit( const Container1 &from , Container2 &to )
+{
+    unsplit_impl< Container1 , Container2 >::unsplit( from , to );
+}
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_UTIL_COPY_HPP_INCLUDED
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/util/split_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,102 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/util/split_adaptor.hpp
+
+ [begin_description]
+ A range adaptor which returns even-sized slices.
+ [end_description]
+
+ Copyright 2013 Karsten Ahnert
+ Copyright 2013 Mario Mulansky
+ Copyright 2013 Pascal Germroth
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_SPLIT_ADAPTOR_INCLUDED
+#define BOOST_NUMERIC_ODEINT_UTIL_SPLIT_ADAPTOR_INCLUDED
+
+#include <boost/range/adaptor/argument_fwd.hpp>
+#include <boost/range/size_type.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <algorithm>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+/** \brief Returns the begin and end offset for a sub-range */
+inline std::pair<std::size_t, std::size_t>
+split_offsets( std::size_t total_length, std::size_t index, std::size_t parts )
+{
+    BOOST_ASSERT( parts > 0 );
+    BOOST_ASSERT( index < parts );
+    const std::size_t
+        slice = total_length / parts,
+        partial = total_length % parts,
+        lo = (std::min)(index, partial),
+        hi = (std::max<std::ptrdiff_t>)(0, index - partial),
+        begin_offset = lo * (slice + 1) + hi * slice,
+        length = slice + (index < partial ? 1 : 0),
+        end_offset = begin_offset + length;
+    return std::make_pair( begin_offset, end_offset );
+}
+
+/** \brief Return the sub-range `index` from a range which is split into `parts`.
+ *
+ * For example, splitting a range into three about equal-sized sub-ranges:
+ * \code
+ * sub0 = make_split_range(rng, 0, 3);
+ * sub1 = rng | split(1, 3);
+ * sub2 = rng | split(2, 3);
+ * \endcode
+ */
+template< class RandomAccessRange >
+inline iterator_range< typename range_iterator<RandomAccessRange>::type >
+make_split_range( RandomAccessRange& rng, std::size_t index, std::size_t parts )
+{
+    const std::pair<std::size_t, std::size_t> off = split_offsets(boost::size(rng), index, parts);
+    return make_iterator_range( boost::begin(rng) + off.first, boost::begin(rng) + off.second );
+}
+
+template< class RandomAccessRange >
+inline iterator_range< typename range_iterator<const RandomAccessRange>::type >
+make_split_range( const RandomAccessRange& rng, std::size_t index, std::size_t parts )
+{
+    const std::pair<std::size_t, std::size_t> off = split_offsets(boost::size(rng), index, parts);
+    return make_iterator_range( boost::begin(rng) + off.first, boost::begin(rng) + off.second );
+}
+
+
+struct split
+{
+    split(std::size_t index, std::size_t parts)
+        : index(index), parts(parts) {}
+    std::size_t index, parts;
+};
+
+template< class RandomAccessRange >
+inline iterator_range< typename range_iterator<RandomAccessRange>::type >
+operator|( RandomAccessRange& rng, const split& f )
+{
+    return make_split_range( rng, f.index, f.parts );
+}
+
+template< class RandomAccessRange >
+inline iterator_range< typename range_iterator<const RandomAccessRange>::type >
+operator|( const RandomAccessRange& rng, const split& f )
+{
+    return make_split_range( rng, f.index, f.parts );
+}
+
+
+}
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/odeint/util/stepper_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+/*
+  [auto_generated]
+  boost/numeric/odeint/util/stepper_traits.hpp
+
+  [begin_description]
+  tba.
+  [end_description]
+
+  Copyright 2013 Karsten Ahnert
+  Copyright 2013 Mario Mulansky
+
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or
+  copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_STEPPER_TRAITS_HPP_DEFINED
+#define BOOST_NUMERIC_ODEINT_UTIL_STEPPER_TRAITS_HPP_DEFINED
+
+#include <boost/numeric/odeint/util/unwrap_reference.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace traits {
+
+template< class Stepper >
+struct state_type
+{
+    typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type stepper_type;
+    typedef typename stepper_type::state_type type;
+};
+
+template< class Stepper >
+struct time_type
+{
+    typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type stepper_type;
+    typedef typename stepper_type::time_type type;
+};
+
+template< class Stepper >
+struct stepper_category
+{
+    typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type stepper_type;
+    typedef typename stepper_type::stepper_category type;
+};
+
+template< class Stepper >
+struct value_type
+{
+    typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type stepper_type;
+    typedef typename stepper_type::value_type type;
+};
+
+} // namespace traits
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+
+#endif // BOOST_NUMERIC_ODEINT_UTIL_STEPPER_TRAITS_HPP_DEFINED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/numeric/ublas/matrix_vector.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,348 @@
+//  Copyright (c) 2012 Oswin Krause
+//  Copyright (c) 2013 Joaquim Duran
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_UBLAS_MATRIX_VECTOR_HPP
+#define BOOST_UBLAS_MATRIX_VECTOR_HPP
+
+#include <boost/numeric/ublas/matrix_proxy.hpp>//for matrix_row, matrix_column and matrix_expression
+#include <boost/numeric/ublas/vector.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace numeric { namespace ublas {
+
+namespace detail{
+
+/** \brief Iterator used in the represention of a matrix as a vector of rows or columns
+ *
+ * Iterator used in the represention of a matrix as a vector of rows/columns. It refers
+ * to the i-th element of the matrix, a column or a row depending of Reference type.
+ *
+ * The type of Reference should provide a constructor Reference(matrix, i)
+ *
+ * This iterator is invalidated when the underlying matrix is resized.
+ *
+ * \tparameter Matrix type of matrix that is represented as a vector of row/column
+ * \tparameter Reference Matrix row or matrix column type.
+ */
+template<class Matrix, class Reference>
+class matrix_vector_iterator: public boost::iterator_facade<
+    matrix_vector_iterator<Matrix,Reference>,
+    typename vector_temporary_traits<Reference>::type,
+    boost::random_access_traversal_tag,
+    Reference
+>{
+public:
+    matrix_vector_iterator(){}
+
+    ///\brief constructs a matrix_vector_iterator as pointing to the i-th proxy
+    matrix_vector_iterator(Matrix& matrix, std::size_t position)
+    : matrix_(&matrix),position_(position) {}
+
+    template<class M, class R>
+    matrix_vector_iterator(matrix_vector_iterator<M,R> const& other)
+    : matrix_(other.matrix_),position_(other.position_) {}
+
+private:
+    friend class boost::iterator_core_access;
+    template <class M,class R> friend class matrix_vector_iterator;
+
+    void increment() {
+        ++position_;
+    }
+    void decrement() {
+        --position_;
+    }
+
+    void advance(std::ptrdiff_t n){
+        position_ += n;
+    }
+
+    template<class M,class R>
+    std::ptrdiff_t distance_to(matrix_vector_iterator<M,R> const& other) const{
+        BOOST_UBLAS_CHECK (matrix_ == other.matrix_, external_logic ());
+        return (std::ptrdiff_t)other.position_ - (std::ptrdiff_t)position_;
+    }
+
+    template<class M,class R>
+    bool equal(matrix_vector_iterator<M,R> const& other) const{
+        BOOST_UBLAS_CHECK (matrix_ == other.matrix_, external_logic ());
+        return (position_ == other.position_);
+    }
+    Reference dereference() const {
+        return Reference(*matrix_,position_);
+    }
+
+    Matrix* matrix_;//no matrix_closure here to ensure easy usage
+    std::size_t position_;
+};
+
+}
+
+/** \brief Represents a \c Matrix as a vector of rows.
+ *
+ * Implements an interface to Matrix that the underlaying matrix is represented as a
+ * vector of rows.
+ *
+ * The vector could be resized which causes the resize of the number of rows of
+ * the underlaying matrix.
+ */
+template<class Matrix>
+class matrix_row_vector {
+public:
+    typedef ublas::matrix_row<Matrix> value_type;
+    typedef ublas::matrix_row<Matrix> reference;
+    typedef ublas::matrix_row<Matrix const> const_reference;
+
+    typedef ublas::detail::matrix_vector_iterator<Matrix, ublas::matrix_row<Matrix> > iterator;
+    typedef ublas::detail::matrix_vector_iterator<Matrix const, ublas::matrix_row<Matrix const> const> const_iterator;
+    typedef boost::reverse_iterator<iterator> reverse_iterator;
+    typedef boost::reverse_iterator<const_iterator> const_reverse_iterator;
+
+    typedef typename boost::iterator_difference<iterator>::type difference_type;
+    typedef typename Matrix::size_type size_type;
+
+    matrix_row_vector(Matrix& matrix) :
+        matrix_(matrix) {
+    }
+
+
+    iterator begin(){
+        return iterator(matrix_, 0);
+    }
+
+    const_iterator begin() const {
+        return const_iterator(matrix_, 0);
+    }
+
+    const_iterator cbegin() const {
+        return begin();
+    }
+
+    iterator end() {
+        return iterator(matrix_, matrix_.size1());
+    }
+
+    const_iterator end() const {
+        return const_iterator(matrix_, matrix_.size1());
+    }
+
+    const_iterator cend() const {
+        return end();
+    }
+
+    reverse_iterator rbegin() {
+        return reverse_iterator(end());
+    }
+
+    const_reverse_iterator rbegin() const {
+        return const_reverse_iterator(end());
+    }
+
+    const_reverse_iterator crbegin() const {
+        return rbegin();
+    }  
+
+    reverse_iterator rend() {
+        return reverse_iterator(begin());
+    }
+
+    const_reverse_iterator rend() const {
+        return const_reverse_iterator(begin());
+    }
+
+    const_reverse_iterator crend() const {
+        return end();
+    }
+
+    value_type operator()(difference_type index) const {
+        return value_type(matrix_, index);
+    }
+
+    reference operator[](difference_type index){
+        return reference(matrix_, index);
+    }
+
+    const_reference operator[](difference_type index) const {
+        return const_reference(matrix_, index);
+    }
+
+    size_type size() const {
+        return matrix_.size1();
+    }
+
+    void resize(size_type size, bool preserve = true) {
+        matrix_.resize(size, matrix_.size2(), preserve);
+    }
+
+private:
+    Matrix& matrix_;
+};
+
+
+/** \brief Convenience function to create \c matrix_row_vector.
+ *
+ * Function to create \c matrix_row_vector objects.
+ * \param matrix the \c matrix_expression that generates the matrix that \c matrix_row_vector is referring.
+ * \return Created \c matrix_row_vector object.
+ *
+ * \tparam Matrix the type of matrix that \c matrix_row_vector is referring.
+ */
+template<class Matrix>
+matrix_row_vector<Matrix> make_row_vector(matrix_expression<Matrix>& matrix){
+    return matrix_row_vector<Matrix>(matrix());
+}
+
+
+/** \brief Convenience function to create \c matrix_row_vector.
+ *
+ * Function to create \c matrix_row_vector objects.
+ * \param matrix the \c matrix_expression that generates the matrix that \c matrix_row_vector is referring.
+ * \return Created \c matrix_row_vector object.
+ *
+ * \tparam Matrix the type of matrix that \c matrix_row_vector is referring.
+ */
+template<class Matrix>
+matrix_row_vector<Matrix const> make_row_vector(matrix_expression<Matrix> const& matrix){
+    return matrix_row_vector<Matrix const>(matrix());
+}
+
+
+/** \brief Represents a \c Matrix as a vector of columns.
+ *
+ * Implements an interface to Matrix that the underlaying matrix is represented as a
+ * vector of columns.
+ *
+ * The vector could be resized which causes the resize of the number of columns of
+ * the underlaying matrix.
+ */
+template<class Matrix>
+class matrix_column_vector
+{
+public:
+    typedef ublas::matrix_column<Matrix> value_type;
+    typedef ublas::matrix_column<Matrix> reference;
+    typedef const ublas::matrix_column<Matrix const> const_reference;
+
+    typedef ublas::detail::matrix_vector_iterator<Matrix, ublas::matrix_column<Matrix> > iterator;
+    typedef ublas::detail::matrix_vector_iterator<Matrix const, ublas::matrix_column<Matrix const> const > const_iterator;
+    typedef boost::reverse_iterator<iterator> reverse_iterator;
+    typedef boost::reverse_iterator<const_iterator> const_reverse_iterator;
+
+    typedef typename boost::iterator_difference<iterator>::type difference_type;
+    typedef typename Matrix::size_type size_type;
+
+    matrix_column_vector(Matrix& matrix) :
+        matrix_(matrix){
+    }
+
+    iterator begin() {
+        return iterator(matrix_, 0);
+    }
+
+    const_iterator begin() const {
+        return const_iterator(matrix_, 0);
+    }
+
+    const_iterator cbegin() const {
+        return begin();
+    }
+
+    iterator end() {
+        return iterator(matrix_, matrix_.size2());
+    }
+
+    const_iterator end() const {
+        return const_iterator(matrix_, matrix_.size2());
+    }
+
+    const_iterator cend() const {
+        return end();
+    }
+
+    reverse_iterator rbegin() {
+        return reverse_iterator(end());
+    }
+
+    const_reverse_iterator rbegin() const {
+        return const_reverse_iterator(end());
+    }
+
+    const_reverse_iterator crbegin() const {
+        return rbegin();
+    } 
+
+    reverse_iterator rend() {
+        return reverse_iterator(begin());
+    }
+
+    const_reverse_iterator rend() const {
+        return const_reverse_iterator(begin());
+    }
+
+    const_reverse_iterator crend() const {
+        return rend();
+    }
+
+    value_type operator()(difference_type index) const {
+        return value_type(matrix_, index);
+    }
+
+    reference operator[](difference_type index) {
+        return reference(matrix_, index);
+    }
+
+    const_reference operator[](difference_type index) const {
+        return const_reference(matrix_, index);
+    }
+
+    size_type size() const {
+        return matrix_.size2();
+    }
+
+    void resize(size_type size, bool preserve = true) {
+        matrix_.resize(matrix_.size1(), size, preserve);
+    }
+
+private:
+    Matrix& matrix_;
+};
+
+
+/** \brief Convenience function to create \c matrix_column_vector.
+ *
+ * Function to create \c matrix_column_vector objects.
+ * \param matrix the \c matrix_expression that generates the matrix that \c matrix_column_vector is referring.
+ * \return Created \c matrix_column_vector object.
+ *
+ * \tparam Matrix the type of matrix that \c matrix_column_vector is referring.
+ */
+template<class Matrix>
+matrix_column_vector<Matrix> make_column_vector(matrix_expression<Matrix>& matrix){
+    return matrix_column_vector<Matrix>(matrix());
+}
+
+
+/** \brief Convenience function to create \c matrix_column_vector.
+ *
+ * Function to create \c matrix_column_vector objects.
+ * \param matrix the \c matrix_expression that generates the matrix that \c matrix_column_vector is referring.
+ * \return Created \c matrix_column_vector object.
+ *
+ * \tparam Matrix the type of matrix that \c matrix_column_vector is referring.
+ */
+template<class Matrix>
+matrix_column_vector<Matrix const> make_column_vector(matrix_expression<Matrix> const& matrix){
+    return matrix_column_vector<Matrix const>(matrix());
+}
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/optional/bad_optional_access.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+// Copyright (C) 2014, Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  akrzemi1@gmail.com
+//
+#ifndef BOOST_BAD_OPTIONAL_ACCESS_22MAY2014_HPP
+#define BOOST_BAD_OPTIONAL_ACCESS_22MAY2014_HPP
+
+#include <stdexcept>
+#if __cplusplus < 201103L
+#include <string> // to make converting-ctor std::string(char const*) visible
+#endif
+
+namespace boost {
+
+class bad_optional_access : public std::logic_error
+{
+public:
+  bad_optional_access()
+    : std::logic_error("Attempted to access the value of an uninitialized optional object.")
+    {}
+};
+
+} // namespace boost
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/pending/cstddef.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-// -*- C++ -*- forwarding header.
-//  (C) Copyright Jeremy Siek 2004 
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_CSTDDEF_HPP
-#define BOOST_CSTDDEF_HPP
-
-#if defined(__sgi) && !defined(__GNUC__)
-# include <stddef.h>
-#else
-# include <cstddef>
-#endif
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,12 @@
+/*==============================================================================
+    Copyright (c) 2001-2010 Joel de Guzman
+    Copyright (c) 2010 Eric Niebler
+    Copyright (c) 2014 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef BOOST_PHOENIX_CONFIG_HPP
+#define BOOST_PHOENIX_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/core/debug.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,50 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    Copyright (c) 2010 Thomas Heller
+    Copyright (c) 2014 John Fletcher
+ 
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef BOOST_PHOENIX_CORE_DEBUG_HPP
+#define BOOST_PHOENIX_CORE_DEBUG_HPP
+
+#include <iostream>
+#include <boost/phoenix/version.hpp>
+// Some other things may be needed here...
+
+// Include all proto for the time being...
+#include <boost/proto/proto.hpp>
+
+namespace boost { namespace phoenix
+  {
+
+    // For now just drop through to the Proto versions.
+
+    /// \brief Pretty-print a Phoenix expression tree using the Proto code.
+    ///
+    /// \note Equivalent to <tt>functional::display_expr(0, sout)(expr)</tt>
+    /// \param expr The Phoenix expression tree to pretty-print
+    /// \param sout The \c ostream to which the output should be
+    ///             written. If not specified, defaults to
+    ///             <tt>std::cout</tt>.
+    template<typename Expr>
+    void display_expr(Expr const &expr, std::ostream &sout)
+    {
+      boost::proto::display_expr(expr,sout);
+    }
+
+    /// \overload
+    ///
+    template<typename Expr>
+    void display_expr(Expr const &expr)
+    {
+      boost::proto::display_expr(expr);
+    }
+
+  } // namespace phoenix
+} // namespace boost
+
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/core/is_value.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    Copyright (c) 2015 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef BOOST_PHOENIX_CORE_IS_VALUE_HPP
+#define BOOST_PHOENIX_CORE_IS_VALUE_HPP
+
+#include <boost/mpl/bool.hpp>
+
+// Copied from is_actor.hpp
+
+// Note to Thomas and any future maintainer: please make this as
+// lightweight as possible (as it is right now).
+
+namespace boost { namespace phoenix
+{
+///////////////////////////////////////////////////////////////////////////////
+//
+//  is_value<T>
+//
+//      Tests if T is a value. Evaluates to mpl::true_ or mpl::false_
+//
+///////////////////////////////////////////////////////////////////////////////
+
+    namespace expression {
+        template <typename T>
+        struct value;
+    }
+
+    template <typename T, typename Enable = void>
+    struct is_value
+        : mpl::false_
+    {};
+
+    template <typename T>
+    struct is_value<T const>
+        : is_value<T>
+    {};
+
+    template <typename T>
+    struct is_value<T &>
+        : is_value<T>
+    {};
+
+    // This does not seem to work.
+    // There is an alternative in value.hpp which does work.
+    template <typename T>
+    struct is_value< expression::value<T> >
+        : mpl::true_
+    {};
+
+    template <typename T>
+    bool is_val(T const & /* t */)
+    {
+      return is_value<T>::value;
+    }
+
+  }}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/function/lazy_list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,1514 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy_list.hpp
+//
+// Build lazy operations for Phoenix equivalents for FC++
+//
+// These are equivalents of the Boost FC++ functoids in list.hpp
+//
+// Implemented so far:
+//
+// head tail null
+//
+// strict_list<T> and associated iterator.
+//
+// list<T> and odd_list<T>
+//
+// cons cat
+//
+// Comparisons between list and odd_list types and separately for strict_list.
+//
+// NOTES: There is a fix at the moment as I have not yet sorted out
+//        how to get back the return type of a functor returning a list type.
+//        For the moment I have fixed this as odd_list<T> at two locations,
+//        one in list<T> and one in Cons. I am going to leave it like this
+//        for now as reading the code, odd_list<T> seems to be correct.
+//
+//        I am also not happy at the details needed to detect types in Cons.
+//
+// I think the structure of this file is now complete.
+// John Fletcher  February 2015.
+//
+////////////////////////////////////////////////////////////////////////////
+/*=============================================================================
+    Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2015 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+///////////////////////////////////////////////////////////////////////
+// This is from Boost FC++ list.hpp reimplemented without Fun0 or Full0
+///////////////////////////////////////////////////////////////////////
+
+/*
+concept ListLike: Given a list representation type L
+
+L<T> inherits ListLike and has
+   // typedefs just show typical values
+   typedef T value_type
+   typedef L<T> force_result_type
+   typedef L<T> delay_result_type
+   typedef L<T> tail_result_type
+   template <class UU> struct cons_rebind {
+      typedef L<UU> type;        // force type
+      typedef L<UU> delay_type;  // delay type
+   };
+
+   L()
+   L( a_unique_type_for_nil )
+   template <class F> L(F)       // F :: ()->L
+
+   constructor: force_result_type( T, L<T> )
+   template <class F>
+   constructor: force_result_type( T, F )  // F :: ()->L
+
+   template <class It>
+   L( It, It )
+
+   // FIX THIS instead of operator bool(), does Boost have something better?
+   operator bool() const
+   force_result_type force() const
+   delay_result_type delay() const
+   T head() const
+   tail_result_type tail() const
+
+   static const bool is_lazy;   // true if can represent infinite lists
+
+   typedef const_iterator;
+   typedef const_iterator iterator;  // ListLikes are immutable
+   iterator begin() const
+   iterator end() const
+*/
+
+//////////////////////////////////////////////////////////////////////
+// End of section from Boost FC++ list.hpp
+//////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_LIST
+#define BOOST_PHOENIX_FUNCTION_LAZY_LIST
+
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/intrusive_ptr.hpp>
+#include <boost/function.hpp>
+#include <boost/type_traits/type_with_alignment.hpp>
+//#include "lazy_reuse.hpp"
+
+namespace boost {
+
+  namespace phoenix {
+
+//////////////////////////////////////////////////////////////////////
+// These are the list types being declared.
+//////////////////////////////////////////////////////////////////////
+
+   template <class T> class strict_list;
+    namespace impl {
+   template <class T> class list;
+   template <class T> class odd_list;
+    }
+   // in ref_count.hpp in BoostFC++ now in lazy_operator.hpp
+   //typedef unsigned int RefCountType;
+
+//////////////////////////////////////////////////////////////////////
+// a_unique_type_for_nil moved to lazy_operator.hpp.
+//////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////
+// Distinguish lazy lists (list and odd_list) from strict_list.
+//////////////////////////////////////////////////////////////////////
+
+    namespace lazy {
+      // Copied from Boost FC++ list.hpp
+      template <class L, bool is_lazy> struct ensure_lazy_helper {};
+      template <class L> struct ensure_lazy_helper<L,true> {
+         static void requires_lazy_list_to_prevent_infinite_recursion() {}
+      };
+      template <class L>
+      void ensure_lazy() {
+        ensure_lazy_helper<L,L::is_lazy>::
+        requires_lazy_list_to_prevent_infinite_recursion();
+      }
+
+    }
+
+//////////////////////////////////////////////////////////////////////
+// Provide remove reference for types defined for list types.
+//////////////////////////////////////////////////////////////////////
+
+    namespace result_of {
+
+      template < typename L >
+      class ListType
+      {
+      public:
+        typedef typename boost::remove_reference<L>::type LType;
+        typedef typename LType::value_type value_type;
+        typedef typename LType::tail_result_type tail_result_type;
+        typedef typename LType::force_result_type force_result_type;
+        typedef typename LType::delay_result_type delay_result_type;
+      };
+
+      template <>
+      class ListType<a_unique_type_for_nil>
+      {
+      public:
+        typedef a_unique_type_for_nil LType;
+        //typedef a_unique_type_for_nil value_type;
+      };
+
+      template <typename F, typename T>
+      struct ResultType {
+        typedef typename impl::odd_list<T> type;
+      };
+  
+    }
+
+//////////////////////////////////////////////////////////////////////
+// ListLike is a property inherited by any list type to enable it to
+// work with the functions being implemented in this file.
+// It provides the check for the structure described above.
+//////////////////////////////////////////////////////////////////////
+
+   namespace listlike {
+
+       struct ListLike {};   // This lets us use is_base_and_derived() to see
+       // (at compile-time) what classes are user-defined lists.
+
+ 
+       template <class L, bool is_lazy> struct ensure_lazy_helper {};
+       template <class L> struct ensure_lazy_helper<L,true> {
+           static void requires_lazy_list_to_prevent_infinite_recursion() {}
+       };
+       template <class L>
+       void ensure_lazy() {
+         ensure_lazy_helper<L,L::is_lazy>::
+         requires_lazy_list_to_prevent_infinite_recursion();
+       }
+
+       template <class L, bool b>
+       struct EnsureListLikeHelp {
+           static void trying_to_call_a_list_function_on_a_non_list() {}
+       };
+       template <class L> struct EnsureListLikeHelp<L,false> { };
+       template <class L>
+       void EnsureListLike() {
+          typedef typename result_of::ListType<L>::LType LType;
+          EnsureListLikeHelp<L,boost::is_base_and_derived<ListLike,LType>::value>::
+             trying_to_call_a_list_function_on_a_non_list();
+       }
+
+      template <class L>
+      bool is_a_unique_type_for_nil(const L& l) {
+         return false;
+      }
+  
+      template <>
+      bool is_a_unique_type_for_nil<a_unique_type_for_nil>
+      (const a_unique_type_for_nil& /* n */) {
+         return true;
+      }
+
+      template <class L>
+      struct detect_nil {
+        static const bool is_nil = false;
+      };
+
+      template <>
+      struct detect_nil<a_unique_type_for_nil> {
+       static const bool is_nil = true;
+      };
+
+      template <>
+      struct detect_nil<a_unique_type_for_nil&> {
+       static const bool is_nil = true;
+      };
+
+      template <>
+      struct detect_nil<const a_unique_type_for_nil&> {
+       static const bool is_nil = true;
+      };
+          
+    }
+
+//////////////////////////////////////////////////////////////////////
+// Implement lazy functions for list types. cat and cons come later.
+//////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH
+#define BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH 1000
+#endif
+
+    namespace impl {
+
+      struct Head
+      {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename L>
+        struct result<This(L)>
+        {
+          typedef typename result_of::ListType<L>::value_type type;
+        };
+
+        template <typename L>
+        typename result<Head(L)>::type
+        operator()(const L & l) const
+        {
+          listlike::EnsureListLike<L>();
+          return l.head();
+        }
+
+      };
+
+      struct Tail
+      {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename L>
+        struct result<This(L)>
+        {
+          typedef typename result_of::ListType<L>::tail_result_type type;
+        };
+
+        template <typename L>
+        typename result<Tail(L)>::type
+        operator()(const L & l) const
+        {
+          listlike::EnsureListLike<L>();
+          return l.tail();
+        }
+
+      };
+
+      struct Null
+      {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename L>
+        struct result<This(L)>
+        {
+            typedef bool type;
+        };
+
+        template <typename L>
+        typename result<Null(L)>::type
+        //bool
+        operator()(const L& l) const
+        {
+          listlike::EnsureListLike<L>();
+          return !l;
+        }
+
+      };
+
+      struct Delay {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename L>
+        struct result<This(L)>
+        {
+          typedef typename result_of::ListType<L>::delay_result_type type;
+        };
+
+        template <typename L>
+        typename result<Delay(L)>::type
+        operator()(const L & l) const
+        {
+          listlike::EnsureListLike<L>();
+          return l.delay();
+        }
+
+      };
+
+      struct Force {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename L>
+        struct result<This(L)>
+        {
+          typedef typename result_of::ListType<L>::force_result_type type;
+        };
+
+        template <typename L>
+        typename result<Force(L)>::type
+        operator()(const L & l) const
+        {
+          listlike::EnsureListLike<L>();
+          return l.force();
+        }
+
+      };
+
+    }
+    //BOOST_PHOENIX_ADAPT_CALLABLE(head, impl::head, 1)
+    //BOOST_PHOENIX_ADAPT_CALLABLE(tail, impl::tail, 1)
+    //BOOST_PHOENIX_ADAPT_CALLABLE(null, impl::null, 1)
+    typedef boost::phoenix::function<impl::Head> Head;
+    typedef boost::phoenix::function<impl::Tail> Tail;
+    typedef boost::phoenix::function<impl::Null> Null;
+    typedef boost::phoenix::function<impl::Delay> Delay;
+    typedef boost::phoenix::function<impl::Force> Force;
+    Head head;
+    Tail tail;
+    Null null;
+    Delay delay;
+    Force force;
+
+//////////////////////////////////////////////////////////////////////
+// These definitions used for strict_list are imported from BoostFC++
+// unchanged.
+//////////////////////////////////////////////////////////////////////
+
+namespace impl {
+template <class T>
+struct strict_cons : public boost::noncopyable {
+   mutable RefCountType refC;
+   T head;
+   typedef boost::intrusive_ptr<strict_cons> tail_type;
+   tail_type tail;
+   strict_cons( const T& h, const tail_type& t ) : refC(0), head(h), tail(t) {}
+
+};
+template <class T>
+void intrusive_ptr_add_ref( const strict_cons<T>* p ) {
+   ++ (p->refC);
+}
+template <class T>
+void intrusive_ptr_release( const strict_cons<T>* p ) {
+   if( !--(p->refC) ) delete p;
+}
+
+template <class T>
+class strict_list_iterator
+: public std::iterator<std::input_iterator_tag,T,ptrdiff_t> {
+   typedef boost::intrusive_ptr<strict_cons<T> > rep_type;
+   rep_type l;
+   bool is_nil;
+   void advance() {
+      l = l->tail;
+      if( !l )
+         is_nil = true;
+   }
+   class Proxy {  // needed for operator->
+      const T x;
+      friend class strict_list_iterator;
+      Proxy( const T& xx ) : x(xx) {}
+   public:
+      const T* operator->() const { return &x; }
+   };
+public:
+   strict_list_iterator() : l(), is_nil(true) {}
+   explicit strict_list_iterator( const rep_type& ll ) : l(ll), is_nil(!ll) {}
+   
+   const T operator*() const { return l->head; }
+   const Proxy operator->() const { return Proxy(l->head); }
+   strict_list_iterator<T>& operator++() {
+      advance();
+      return *this;
+   }
+   const strict_list_iterator<T> operator++(int) {
+      strict_list_iterator<T> i( *this );
+      advance();
+      return i;
+   }
+   bool operator==( const strict_list_iterator<T>& i ) const {
+      return is_nil && i.is_nil;
+   }
+   bool operator!=( const strict_list_iterator<T>& i ) const {
+      return ! this->operator==(i);
+   }
+};
+}
+
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+
+   template <class T>
+   class strict_list : public listlike::ListLike
+   {
+       typedef boost::intrusive_ptr<impl::strict_cons<T> > rep_type;
+       rep_type rep;
+       struct Make {};
+
+       template <class Iter>
+       static rep_type help( Iter a, const Iter& b ) {
+           rep_type r;
+           while( a != b ) {
+              T x( *a );
+              r = rep_type( new impl::strict_cons<T>( x, r ) );
+              ++a;
+           }
+           return r;
+       }
+
+   public:
+       static const bool is_lazy = false;
+
+       typedef T value_type;
+       typedef strict_list force_result_type;
+       typedef strict_list delay_result_type;
+       typedef strict_list tail_result_type;
+       template <class UU> struct cons_rebind {
+           typedef strict_list<UU> type;
+           typedef strict_list<UU> delay_type;
+       };
+ 
+
+   strict_list( Make, const rep_type& r ) : rep(r) {}
+
+   strict_list() : rep() {}
+
+   strict_list( a_unique_type_for_nil ) : rep() {}
+
+   template <class F>
+   strict_list( const F& f ) : rep( f().rep ) {
+     // I cannot do this yet.
+     //functoid_traits<F>::template ensure_accepts<0>::args();
+   }
+
+   strict_list( const T& x, const strict_list& y )
+      : rep( new impl::strict_cons<T>(x,y.rep) ) {}
+
+   template <class F>
+   strict_list( const T& x, const F& f )
+      : rep( new impl::strict_cons<T>(x,f().rep) ) {}
+   
+     operator bool() const { return (bool)rep; }
+   force_result_type force() const { return *this; }
+   delay_result_type delay() const { return *this; }
+   T head() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+      if( !*this )
+         throw lazy_exception("Tried to take head() of empty strict_list");
+#endif
+      return rep->head;
+   }
+   tail_result_type tail() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+      if( !*this )
+         throw lazy_exception("Tried to take tail() of empty strict_list");
+#endif
+      return strict_list(Make(),rep->tail);
+   }
+
+   template <class Iter>
+   strict_list( const Iter& a, const Iter& b ) : rep( rep_type() ) {
+      // How ironic.  We need to reverse the iterator range in order to
+      // non-recursively build this!
+      std::vector<T> tmp(a,b);
+      rep = help( tmp.rbegin(), tmp.rend() );
+   }
+
+   // Since the strict_cons destructor can't call the strict_list
+   // destructor, the "simple" iterative destructor is correct and
+   // efficient.  Hurray.
+   ~strict_list() { while(rep && (rep->refC == 1)) rep = rep->tail; }
+
+   // The following helps makes strict_list almost an STL "container"
+   typedef impl::strict_list_iterator<T> const_iterator;
+   typedef const_iterator iterator;         // strict_list is immutable
+   iterator begin() const { return impl::strict_list_iterator<T>( rep ); }
+   iterator end() const   { return impl::strict_list_iterator<T>(); }
+
+   };
+
+    // All of these null head and tail are now non lazy using e.g. null(a)().
+    // They need an extra () e.g. null(a)().
+    template <class T>
+    bool operator==( const strict_list<T>& a, a_unique_type_for_nil ) {
+      return null(a)();
+    }
+    template <class T>
+    bool operator==( a_unique_type_for_nil, const strict_list<T>& a ) {
+      return null(a)();
+    }
+    template <class T>
+    bool operator==( const strict_list<T>& a, const strict_list<T>& b ) {
+        if( null(a)() && null(b)() )
+            return true;
+        if( null(a)() || null(b)() )
+            return false;
+        return (head(a)()==head(b)()) &&
+            (tail(a)()==tail(b)());
+    }
+
+    template <class T>
+    bool operator<( const strict_list<T>& a, const strict_list<T>& b ) {
+      if( null(a)() && !null(b)() )  return true;
+        if( null(b)() )                      return false;
+        if( head(b)() < head(a)() )    return false;
+        if( head(a)() < head(b)() )    return true;
+        return (tail(a)() < tail(b)());
+    }
+    template <class T>
+    bool operator<( const strict_list<T>&, a_unique_type_for_nil ) {
+        return false;
+    }
+    template <class T>
+    bool operator<( a_unique_type_for_nil, const strict_list<T>& b ) {
+      return !(null(b)());
+    }
+
+//////////////////////////////////////////////////////////////////////
+// Class list<T> is the primary interface to the user for lazy lists.
+//////////////////////////////////////////////////////////////////////{
+    namespace impl {
+      using fcpp::INV;
+      using fcpp::VAR;
+      using fcpp::reuser2;
+
+      struct CacheEmpty {};
+
+      template <class T> class Cache;
+      template <class T> class odd_list;
+      template <class T> class list_iterator;
+      template <class It, class T>
+      struct ListItHelp2 /*: public c_fun_type<It,It,odd_list<T> >*/ {
+        // This will need a return type.
+        typedef odd_list<T> return_type;
+        odd_list<T> operator()( It begin, const It& end,
+          reuser2<INV,VAR,INV,ListItHelp2<It,T>,It,It> r = NIL ) const;
+      };
+      template <class U,class F> struct cvt;
+      template <class T, class F, class R> struct ListHelp;
+      template <class T> Cache<T>* xempty_helper();
+      template <class T, class F, class L, bool b> struct ConsHelp2;
+
+      struct ListRaw {};
+
+      template <class T>
+      class list : public listlike::ListLike
+      {
+        // never NIL, unless an empty odd_list
+        boost::intrusive_ptr<Cache<T> > rep;
+
+        template <class U> friend class Cache;
+        template <class U> friend class odd_list;
+        template <class TT, class F, class L, bool b> friend struct ConsHelp2;
+        template <class U,class F> friend struct cvt;
+
+        list( const boost::intrusive_ptr<Cache<T> >& p ) : rep(p) { }
+        list( ListRaw, Cache<T>* p ) : rep(p) { }
+
+        bool priv_isEmpty() const {
+          return rep->cache().second.rep == Cache<T>::XNIL();
+        }
+        T priv_head() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+          if( priv_isEmpty() )
+             throw lazy_exception("Tried to take head() of empty list");
+#endif
+          return rep->cache().first();
+        }
+        list<T> priv_tail() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+          if( priv_isEmpty() )
+            throw lazy_exception("Tried to take tail() of empty list");
+#endif
+          return rep->cache().second;
+        }
+
+
+      public:
+        static const bool is_lazy = true;
+
+        typedef T value_type;
+        typedef list tail_result_type;
+        typedef odd_list<T> force_result_type;
+        typedef list delay_result_type;
+        template <class UU> struct cons_rebind {
+           typedef odd_list<UU> type;
+           typedef list<UU> delay_type;
+        };
+
+        list( a_unique_type_for_nil ) : rep( Cache<T>::XEMPTY() ) { }
+        list() : rep( Cache<T>::XEMPTY() ) { }
+
+        template <class F>  // works on both ()->odd_list and ()->list
+        // At the moment this is fixed for odd_list<T>.
+        // I need to do more work to get the general result.
+        list( const F& f )
+          : rep( ListHelp<T,F,odd_list<T> >()(f) ) { }
+        //: rep( ListHelp<T,F,typename F::result_type>()(f) ) { }
+
+        operator bool() const { return !priv_isEmpty(); }
+        const force_result_type& force() const { return rep->cache(); }
+        const delay_result_type& delay() const { return *this; }
+        // Note: force returns a reference;
+        // implicit conversion now returns a copy.
+        operator odd_list<T>() const { return force(); }
+
+        T head() const { return priv_head(); }
+        tail_result_type tail() const { return priv_tail(); }
+
+        // The following helps makes list almost an STL "container"
+        typedef list_iterator<T> const_iterator;
+        typedef const_iterator iterator;         // list is immutable
+        iterator begin() const { return list_iterator<T>( *this ); }
+        iterator end() const   { return list_iterator<T>(); }
+
+        // end of list<T>
+      };
+
+//////////////////////////////////////////////////////////////////////
+// Class odd_list<T> is not normally accessed by the user.
+//////////////////////////////////////////////////////////////////////
+
+      struct OddListDummyY {};
+
+      template <class T>
+      class odd_list : public listlike::ListLike
+      {
+      public:
+        typedef
+        typename boost::type_with_alignment<boost::alignment_of<T>::value>::type
+        xfst_type;
+      private:
+        union { xfst_type fst; unsigned char dummy[sizeof(T)]; };
+
+        const T& first() const {
+           return *static_cast<const T*>(static_cast<const void*>(&fst));
+        }
+        T& first() {
+           return *static_cast<T*>(static_cast<void*>(&fst));
+        }
+        list<T>  second;   // If XNIL, then this odd_list is NIL
+
+        template <class U> friend class list;
+        template <class U> friend class Cache;
+
+        odd_list( OddListDummyY )
+          : second( Cache<T>::XBAD() ) { }
+
+        void init( const T& x ) {
+           new (static_cast<void*>(&fst)) T(x);
+        }
+
+        bool fst_is_valid() const {
+           if( second.rep != Cache<T>::XNIL() )
+              if( second.rep != Cache<T>::XBAD() )
+                 return true;
+           return false;
+        }
+
+        bool priv_isEmpty() const { return second.rep == Cache<T>::XNIL(); }
+        T priv_head() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+           if( priv_isEmpty() )
+             throw lazy_exception("Tried to take head() of empty odd_list");
+#endif
+           return first();
+        }
+
+        list<T> priv_tail() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+           if( priv_isEmpty() )
+             throw lazy_exception("Tried to take tail() of empty odd_list");
+#endif
+           return second;
+        }
+
+      public:
+        static const bool is_lazy = true;
+
+        typedef T value_type;
+        typedef list<T> tail_result_type;
+        typedef odd_list<T> force_result_type;
+        typedef list<T> delay_result_type;
+        template <class UU> struct cons_rebind {
+          typedef odd_list<UU> type;
+          typedef list<UU> delay_type;
+        };
+
+        odd_list() : second( Cache<T>::XNIL() ) { }
+        odd_list( a_unique_type_for_nil ) : second( Cache<T>::XNIL() ) { }
+        odd_list( const T& x, const list<T>& y ) : second(y) { init(x); }
+        odd_list( const T& x, a_unique_type_for_nil ) : second(NIL) { init(x); }
+
+        odd_list( const odd_list<T>& x ) : second(x.second) {
+           if( fst_is_valid() ) {
+              init( x.first() );
+           }
+        }
+
+        template <class It>
+        odd_list( It begin, const It& end )
+          : second( begin==end ? Cache<T>::XNIL() :
+             ( init(*begin++), list<T>( begin, end ) ) ) {}
+
+        odd_list<T>& operator=( const odd_list<T>& x ) {
+           if( this == &x ) return *this;
+           if( fst_is_valid() ) {
+             if( x.fst_is_valid() )
+               first() = x.first();
+             else
+               first().~T();
+           }
+           else {
+              if( x.fst_is_valid() )
+                 init( x.first() );
+           }
+           second = x.second;
+           return *this;
+        }
+      
+       ~odd_list() {
+          if( fst_is_valid() ) {
+            first().~T();
+          }
+        }
+
+        operator bool() const { return !priv_isEmpty(); }
+        const force_result_type& force() const { return *this; }
+        delay_result_type delay() const { return list<T>(*this); }
+
+        T head() const { return priv_head(); }
+        tail_result_type tail() const { return priv_tail(); }
+
+        // The following helps makes odd_list almost an STL "container"
+        typedef list_iterator<T> const_iterator;
+        typedef const_iterator iterator;         // odd_list is immutable
+        iterator begin() const { return list_iterator<T>( this->delay() ); }
+        iterator end() const   { return list_iterator<T>(); }
+
+        // end of odd_list<T>
+      };
+
+//////////////////////////////////////////////////////////////////////
+// struct cvt
+//////////////////////////////////////////////////////////////////////
+
+      // This converts ()->list<T> to ()->odd_list<T>.
+      // In other words, here is the 'extra work' done when using the
+      // unoptimized interface.
+      template <class U,class F>
+      struct cvt /*: public c_fun_type<odd_list<U> >*/ {
+        typedef odd_list<U> return_type;
+        F f;
+        cvt( const F& ff ) : f(ff) {}
+        odd_list<U> operator()() const {
+           list<U> l = f();
+           return l.force();
+        }
+      };
+
+
+//////////////////////////////////////////////////////////////////////
+// Cache<T> and associated functions.
+//////////////////////////////////////////////////////////////////////
+
+// I malloc a RefCountType to hold the refCount and init it to 1 to ensure the
+// refCount will never get to 0, so the destructor-of-global-object
+// order at the end of the program is a non-issue.  In other words, the
+// memory allocated here is only reclaimed by the operating system.
+    template <class T>
+    Cache<T>* xnil_helper() {
+       void *p = std::malloc( sizeof(RefCountType) );
+       *((RefCountType*)p) = 1;
+       return static_cast<Cache<T>*>( p );
+    }
+
+    template <class T>
+    Cache<T>* xnil_helper_nil() {
+       Cache<T>* p = xnil_helper<T>();
+       return p;
+    }
+
+    template <class T>
+    Cache<T>* xnil_helper_bad() {
+       Cache<T>* p = xnil_helper<T>();
+       return p;
+    }
+
+    template <class T>
+    Cache<T>* xempty_helper() {
+       Cache<T>* p = new Cache<T>( CacheEmpty() );
+       return p;
+    }
+
+    // This makes a boost phoenix function type with return type
+    // odd_list<T>
+    template <class T>
+    struct fun0_type_helper{
+       typedef boost::function0<odd_list<T> > fun_type;
+       typedef boost::phoenix::function<fun_type> phx_type;
+    };
+
+
+      template <class T>
+      struct make_fun0_odd_list {
+
+        typedef typename fun0_type_helper<T>::fun_type fun_type;
+        typedef typename fun0_type_helper<T>::phx_type phx_type;
+        typedef phx_type result_type;
+
+        template <class F>
+        result_type operator()(const F& f) const
+        {
+            fun_type ff(f);
+            phx_type g(ff);
+            return g;
+        }
+
+        // Overload for the case where it is a boost phoenix function already.
+        template <class F>
+        typename boost::phoenix::function<F> operator()
+          (const boost::phoenix::function<F>& f) const
+        {
+            return f;
+        }
+
+    };
+
+    template <class T>
+    class Cache : boost::noncopyable {
+       mutable RefCountType refC;
+       // This is the boost::function type
+       typedef typename fun0_type_helper<T>::fun_type fun_odd_list_T;
+       // This is the boost::phoenix::function type;
+       typedef typename fun0_type_helper<T>::phx_type fun0_odd_list_T;
+       mutable fun0_odd_list_T fxn;
+       mutable odd_list<T>     val;
+       // val.second.rep can be XBAD, XNIL, or a valid ptr
+       //  - XBAD: val is invalid (fxn is valid)
+       //  - XNIL: this is the empty list
+       //  - anything else: val.first() is head, val.second is tail()
+
+       // This functoid should never be called; it represents a
+       // self-referent Cache, which should be impossible under the current
+       // implementation.  Nonetheless, we need a 'dummy' function object to
+       // represent invalid 'fxn's (val.second.rep!=XBAD), and this
+       // implementation seems to be among the most reasonable.
+       struct blackhole_helper /*: c_fun_type< odd_list<T> >*/ {
+          typedef odd_list<T> return_type;
+          odd_list<T> operator()() const {
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+            throw lazy_exception("You have entered a black hole.");
+#else
+            return odd_list<T>();
+#endif
+          }
+       };
+
+       // Don't get rid of these XFOO() functions; they impose no overhead,
+       // and provide a useful place to add debugging code for tracking down
+       // before-main()-order-of-initialization problems.
+       static const boost::intrusive_ptr<Cache<T> >& XEMPTY() {
+          static boost::intrusive_ptr<Cache<T> > xempty( xempty_helper<T>() );
+          return xempty;
+       }
+       static const boost::intrusive_ptr<Cache<T> >& XNIL() {
+       // this list is nil
+          static boost::intrusive_ptr<Cache<T> > xnil( xnil_helper_nil<T>() );
+          return xnil;
+       }
+
+       static const boost::intrusive_ptr<Cache<T> >& XBAD() {
+       // the pair is invalid; use fxn
+          static boost::intrusive_ptr<Cache<T> > xbad( xnil_helper_bad<T>() );
+          return xbad;
+       }
+
+       static fun0_odd_list_T /*<odd_list<T> >*/ the_blackhole;
+       static fun0_odd_list_T& blackhole() {
+         static fun0_odd_list_T the_blackhole;
+         //( make_fun0_odd_list<T>()( blackhole_helper() ) );
+         return the_blackhole;
+       }
+
+       odd_list<T>& cache() const {
+         if( val.second.rep == XBAD() ) {
+            val = fxn()();
+            fxn = blackhole();
+         }
+         return val;
+       }
+
+       template <class U> friend class list;
+       template <class U> friend class odd_list;
+       template <class TT, class F, class L, bool b> friend struct ConsHelp2;
+       template <class U,class F> friend struct cvt;
+       template <class U, class F, class R> friend struct ListHelp;
+       template <class U> friend Cache<U>* xempty_helper();
+
+       Cache( CacheEmpty ) : refC(0), fxn(blackhole()), val() {}
+       Cache( const odd_list<T>& x ) : refC(0), fxn(blackhole()), val(x) {}
+       Cache( const T& x, const list<T>& l ) : refC(0),fxn(blackhole()),val(x,l)
+          {}
+
+       Cache( const fun0_odd_list_T& f )
+         : refC(0), fxn(f), val( OddListDummyY() ) {}
+
+       // f must be a boost phoenix function object?
+       template <class F>
+       Cache( const F& f )    // ()->odd_list
+         : refC(0), fxn(make_fun0_odd_list<T>()(f)), val( OddListDummyY() ) {}
+
+       // This is for ()->list<T> to ()->odd_list<T>
+       struct CvtFxn {};
+       template <class F>
+       Cache( CvtFxn, const F& f )    // ()->list
+         :  refC(0), fxn(make_fun0_odd_list<T>()(cvt<T,F>(f))), val( OddListDummyY() ) {}
+
+       template <class X>
+       friend void intrusive_ptr_add_ref( const Cache<X>* p );
+       template <class X>
+       friend void intrusive_ptr_release( const Cache<X>* p );
+    };
+
+    template <class T>
+    void intrusive_ptr_add_ref( const Cache<T>* p ) {
+        ++ (p->refC);
+    }
+    template <class T>
+    void intrusive_ptr_release( const Cache<T>* p ) {
+        if( !--(p->refC) ) delete p;
+    }
+
+//////////////////////////////////////////////////////////////////////
+// Rest of list's stuff
+//////////////////////////////////////////////////////////////////////
+
+template <class T, class F> struct ListHelp<T,F,list<T> > {
+   boost::intrusive_ptr<Cache<T> > operator()( const F& f ) const {
+      return boost::intrusive_ptr<Cache<T> >
+         (new Cache<T>(typename Cache<T>::CvtFxn(),f));
+   }
+};
+template <class T, class F> struct ListHelp<T,F,odd_list<T> > {
+   boost::intrusive_ptr<Cache<T> > operator()( const F& f ) const {
+      return boost::intrusive_ptr<Cache<T> >(new Cache<T>(f));
+   }
+};
+
+template <class T>
+class list_iterator
+: public std::iterator<std::input_iterator_tag,T,ptrdiff_t> {
+   list<T> l;
+   bool is_nil;
+   void advance() {
+      l = l.tail();
+      if( !l )
+         is_nil = true;
+   }
+   class Proxy {  // needed for operator->
+      const T x;
+      friend class list_iterator;
+      Proxy( const T& xx ) : x(xx) {}
+   public:
+      const T* operator->() const { return &x; }
+   };
+public:
+   list_iterator() : l(), is_nil(true) {}
+   explicit list_iterator( const list<T>& ll ) : l(ll), is_nil(!ll) {}
+   
+   const T operator*() const { return l.head(); }
+   const Proxy operator->() const { return Proxy(l.head()); }
+   list_iterator<T>& operator++() {
+      advance();
+      return *this;
+   }
+   const list_iterator<T> operator++(int) {
+      list_iterator<T> i( *this );
+      advance();
+      return i;
+   }
+   bool operator==( const list_iterator<T>& i ) const {
+      return is_nil && i.is_nil;
+   }
+   bool operator!=( const list_iterator<T>& i ) const {
+      return ! this->operator==(i);
+   }
+};
+
+
+    } // namespace impl
+
+  using impl::list;
+  using impl::odd_list;
+  using impl::list_iterator;
+
+//////////////////////////////////////////////////////////////////////
+// op== and op<, overloaded for all combos of list, odd_list, and NIL
+//////////////////////////////////////////////////////////////////////
+// All of these null head and tail are now non lazy using e.g. null(a)().
+// They need an extra () e.g. null(a)().
+
+// FIX THIS comparison operators can be implemented simpler with enable_if
+template <class T>
+bool operator==( const odd_list<T>& a, a_unique_type_for_nil ) {
+  return null(a)();
+}
+template <class T>
+bool operator==( const list<T>& a, a_unique_type_for_nil ) {
+  return null(a)();
+}
+template <class T>
+bool operator==( a_unique_type_for_nil, const odd_list<T>& a ) {
+  return null(a)();
+}
+template <class T>
+bool operator==( a_unique_type_for_nil, const list<T>& a ) {
+  return null(a)();
+}
+template <class T>
+bool operator==( const list<T>& a, const list<T>& b ) {
+  if( null(a)() && null(b)() )
+      return true;
+  if( null(a)() || null(b)() )
+      return false;
+  return (head(a)()==head(b)()) && (tail(a)()==tail(b)());
+}
+template <class T>
+bool operator==( const odd_list<T>& a, const odd_list<T>& b ) {
+  if( null(a)() && null(b)() )
+      return true;
+  if( null(a)() || null(b)() )
+      return false;
+  return (head(a)()==head(b)()) && (tail(a)()==tail(b)());
+}
+template <class T>
+bool operator==( const list<T>& a, const odd_list<T>& b ) {
+  if( null(a)() && null(b)() )
+      return true;
+  if( null(a)() || null(b)() )
+      return false;
+  return (head(a)()==head(b)()) && (tail(a)()==tail(b)());
+}
+template <class T>
+bool operator==( const odd_list<T>& a, const list<T>& b ) {
+  if( null(a)() && null(b)() )
+      return true;
+  if( null(a)() || null(b)() )
+      return false;
+  return (head(a)()==head(b)()) && (tail(a)()==tail(b)());
+}
+
+template <class T>
+bool operator<( const list<T>& a, const list<T>& b ) {
+  if( null(a)() && !null(b)() )  return true;
+  if( null(b)() )              return false;
+  if( head(b)() < head(a)() )    return false;
+  if( head(a)() < head(b)() )    return true;
+  return (tail(a)() < tail(b)());
+}
+template <class T>
+bool operator<( const odd_list<T>& a, const list<T>& b ) {
+  if( null(a)() && !null(b)() )  return true;
+  if( null(b)() )              return false;
+  if( head(b)() < head(a)() )    return false;
+  if( head(a)() < head(b)() )    return true;
+  return (tail(a)() < tail(b)());
+}
+template <class T>
+bool operator<( const list<T>& a, const odd_list<T>& b ) {
+   if( null(a) && !null(b) )  return true;
+   if( null(b) )              return false;
+   if( head(b) < head(a) )    return false;
+   if( head(a) < head(b) )    return true;
+   return (tail(a) < tail(b));
+}
+template <class T>
+bool operator<( const odd_list<T>& a, const odd_list<T>& b ) {
+  if( null(a)() && !null(b)() )  return true;
+  if( null(b)() )              return false;
+  if( head(b)() < head(a)() )    return false;
+  if( head(a)() < head(b)() )    return true;
+  return (tail(a)() < tail(b)());
+}
+template <class T>
+bool operator<( const odd_list<T>&, a_unique_type_for_nil ) {
+   return false;
+}
+template <class T>
+bool operator<( const list<T>&, a_unique_type_for_nil ) {
+   return false;
+}
+template <class T>
+bool operator<( a_unique_type_for_nil, const odd_list<T>& b ) {
+  return !null(b)();
+}
+template <class T>
+bool operator<( a_unique_type_for_nil, const list<T>& b ) {
+  return !null(b)();
+}
+
+//////////////////////////////////////////////////////////////////////
+// Implement cat and cons after the list types are defined.
+//////////////////////////////////////////////////////////////////////
+    namespace impl {
+      using listlike::ListLike;
+
+      template <class T, class F, class L>
+      struct ConsHelp2<T,F,L,true>
+      {
+         typedef typename boost::remove_reference<T>::type TT;
+         typedef typename L::force_result_type type;
+         static type go( const TT& x, const F& f ) {
+            return type( x, f );
+         }
+      };
+      template <class T, class F>
+      struct ConsHelp2<T,F,list<T>,true>
+      {
+         typedef typename boost::remove_reference<T>::type TT;
+         typedef list<TT> L;
+         typedef typename L::force_result_type type;
+         static type go( const TT& x, const F& f ) {
+            return odd_list<TT>(x, list<TT>(
+            boost::intrusive_ptr<Cache<TT> >(new Cache<T>(
+            typename Cache<TT>::CvtFxn(),f))));
+         }
+       };
+       template <class T, class F>
+       struct ConsHelp2<T,F,odd_list<T>,true>
+       {
+          typedef typename boost::remove_reference<T>::type TT;
+          typedef odd_list<TT> L;
+          typedef typename L::force_result_type type;
+          static type go( const TT& x, const F& f ) {
+              return odd_list<TT>(x, list<TT>( ListRaw(), new Cache<T>(f) ));
+          }
+       };
+       template <class T, class F>
+       struct ConsHelp2<T,F,a_unique_type_for_nil,false>
+       {
+          typedef typename boost::remove_reference<T>::type TT;
+          typedef odd_list<TT> type;
+          static type go( const TT& x, const F& f ) {
+             return odd_list<TT>(x, list<TT>( ListRaw(), new Cache<T>(f) ));
+          }
+       };
+
+       template <class T, class L, bool b> struct ConsHelp1 {
+          typedef typename boost::remove_reference<T>::type TT;
+          typedef typename L::force_result_type type;
+          static type go( const TT& x, const L& l ) {
+             return type(x,l);
+          }
+       };
+      template <class T> struct ConsHelp1<T,a_unique_type_for_nil,false> {
+        typedef typename boost::remove_reference<T>::type TT;
+        typedef odd_list<TT> type;
+        static type go( const TT& x, const a_unique_type_for_nil& n ) {
+        return type(x,n);
+        }
+      };
+      template <class T, class F> struct ConsHelp1<T,F,false> {
+        // It's a function returning a list
+        // This is the one I have not fixed yet....
+        // typedef typename F::result_type L;
+        // typedef typename result_of::template ListType<F>::result_type L;
+        typedef odd_list<T> L;
+        typedef ConsHelp2<T,F,L,boost::is_base_and_derived<ListLike,L>::value> help;
+        typedef typename help::type type;
+        static type go( const T& x, const F& f ) {
+           return help::go(x,f);
+        }
+      };
+
+      template <class T, class L, bool b>
+      struct ConsHelp0;
+
+      template <class T>
+      struct ConsHelp0<T,a_unique_type_for_nil,true> {
+        typedef typename boost::remove_reference<T>::type TT;
+        typedef odd_list<T> type;
+      };
+
+      template <class T>
+      struct ConsHelp0<const T &,const a_unique_type_for_nil &,true> {
+        typedef typename boost::remove_reference<T>::type TT;
+        typedef odd_list<TT> type;
+      };
+
+      template <class T>
+      struct ConsHelp0<T &,a_unique_type_for_nil &,true> {
+        typedef typename boost::remove_reference<T>::type TT;
+        typedef odd_list<TT> type;
+      };
+
+      template <class T, class L>
+      struct ConsHelp0<T,L,false> {
+          // This removes any references from L for correct return type
+          // identification.
+           typedef typename boost::remove_reference<L>::type LType;
+           typedef typename ConsHelp1<T,LType,
+           boost::is_base_and_derived<ListLike,LType>::value>::type type;
+      };
+
+      /////////////////////////////////////////////////////////////////////
+      // cons (t,l) - cons a value to the front of a list.
+      // Note: The first arg,  t, must be a value.
+      //       The second arg, l, can be a list or NIL
+      //       or a function that returns a list.
+      /////////////////////////////////////////////////////////////////////
+      struct Cons
+      {
+        /* template <class T, class L> struct sig : public fun_type<
+        typename ConsHelp1<T,L,
+      boost::is_base_and_derived<ListLike,L>::value>::type> {};
+        */
+        template <typename Sig> struct result;
+
+        template <typename This, typename T, typename L>
+        struct result<This(T, L)>
+        {
+          typedef typename ConsHelp0<T,L,
+          listlike::detect_nil<L>::is_nil>::type type;
+        };
+
+        template <typename This, typename T>
+        struct result<This(T,a_unique_type_for_nil)>
+        {
+          typedef typename boost::remove_reference<T>::type TT;
+          typedef odd_list<TT> type;
+        };
+
+        template <typename T, typename L>
+        typename result<Cons(T,L)>::type
+        operator()( const T& x, const L& l ) const {
+           typedef typename result<Cons(T,L)>::type LL;
+           typedef typename result_of::ListType<L>::LType LType;
+           typedef ConsHelp1<T,LType,
+           boost::is_base_and_derived<ListLike,LType>::value> help;
+           return help::go(x,l);
+          }
+      
+        template <typename T>
+        typename result<Cons(T,a_unique_type_for_nil)>::type
+        operator()( const T& x, const a_unique_type_for_nil &n ) const {
+           typedef typename result<Cons(T,a_unique_type_for_nil)>::type LL;
+           typedef ConsHelp1<T,LL,
+           boost::is_base_and_derived<ListLike,LL>::value> help;
+           return help::go(x,n);
+          }
+
+      };
+    }
+
+    typedef boost::phoenix::function<impl::Cons> Cons;
+    Cons cons;
+
+    namespace impl {
+
+      template <class L, class M, bool b>
+      struct CatHelp0;
+
+      template <class L>
+      struct CatHelp0<L,a_unique_type_for_nil,true> {
+        typedef typename result_of::template ListType<L>::LType type;
+      };
+
+      template <class L>
+      struct CatHelp0<const L &,const a_unique_type_for_nil &,true> {
+        typedef typename result_of::template ListType<L>::LType type;
+        //typedef L type;
+      };
+
+      template <class L>
+      struct CatHelp0<L &,a_unique_type_for_nil &,true> {
+        typedef typename result_of::template ListType<L>::LType type;
+        //typedef L type;
+      };
+
+      template <class L, class M>
+      struct CatHelp0<L,M,false> {
+          // This removes any references from L for correct return type
+          // identification.
+        typedef typename result_of::template ListType<L>::LType type;
+        //    typedef typename ConsHelp1<T,LType,
+        //   boost::is_base_and_derived<ListLike,LType>::value>::type type;
+      };
+
+      /////////////////////////////////////////////////////////////////////
+      // cat (l,m) - concatenate lists.
+      // Note: The first arg,  l, must be a list or NIL.
+      //       The second arg, m, can be a list or NIL
+      //       or a function that returns a list.
+      /////////////////////////////////////////////////////////////////////
+      struct Cat
+      {
+         template <class L, class M, bool b, class R>
+         struct Helper /*: public c_fun_type<L,M,R>*/ {
+           template <typename Sig> struct result;
+           
+           template <typename This>
+           struct result<This(L,M)>
+          {
+             typedef typename result_of::ListType<L>::tail_result_type type;
+          };
+
+           typedef R return_type;
+           R operator()( const L& l, const M& m,
+             reuser2<INV,VAR,INV,Helper,
+             typename result_of::template ListType<L>::tail_result_type,M>
+             r = NIL ) const {
+             if( null(l)() )
+                return m().force();
+             else
+                return cons( head(l)(), r( Helper<L,M,b,R>(), tail(l), m )() );
+         }
+      };
+          template <class L, class M, class R>
+          struct Helper<L,M,true,R> /*: public c_fun_type<L,M,R>*/ {
+           template <typename Sig> struct result;
+           
+           template <typename This>
+           struct result<This(L,M)>
+          {
+             typedef typename result_of::ListType<L>::tail_result_type type;
+          };
+          typedef R return_type;
+          R operator()( const L& l, const M& m,
+             reuser2<INV,VAR,INV,Helper,
+             typename result_of::template ListType<L>::tail_result_type,M>
+             r = NIL ) const {
+             if( null(l)() )
+                return m.force();
+             else
+                return cons( head(l)(), r(Helper<L,M,true,R>(), tail(l), m )());
+         }
+      };
+      template <class L, class R>
+      struct Helper<L,a_unique_type_for_nil,false,R>
+      /*: public c_fun_type<L,
+        a_unique_type_for_nil,odd_list<typename L::value_type> > */
+      {
+        typedef odd_list<typename result_of::template ListType<L>::value_type> type;
+        odd_list<typename result_of::template ListType<L>::value_type>
+        operator()( const L& l, const a_unique_type_for_nil& ) const {
+         return l;
+        }
+      };
+   public:
+        /*template <class L, class M> struct sig : public fun_type<
+        typename RT<cons_type,typename L::value_type,M>::result_type>
+      {}; */
+   // Need to work out the return type here.
+      template <typename Sig> struct result;
+
+      template <typename This, typename L, typename M>
+      struct result<This(L,M)>
+      {
+        typedef typename CatHelp0<L,M,
+          listlike::detect_nil<M>::is_nil>::type type;
+        // typedef typename result_of::ListType<L>::tail_result_type type;
+      };
+      
+      template <typename This, typename L>
+      struct result<This(L,a_unique_type_for_nil)>
+      {
+         typedef typename result_of::ListType<L>::tail_result_type type;
+      };
+      template <class L, class M>
+      typename result<Cat(L,M)>::type operator()( const L& l, const M& m ) const
+      {
+         listlike::EnsureListLike<L>();
+         return Helper<L,M,
+         boost::is_base_and_derived<typename listlike::ListLike,M>::value,
+                typename result<Cat(L,M)>::type>()(l,m);
+      }
+
+      template <class L>
+      typename result<Cat(L,a_unique_type_for_nil)>::type operator()( const L& l, const a_unique_type_for_nil& /* n */ ) const
+      {
+         listlike::EnsureListLike<L>();
+         return l;
+      }
+       
+      };
+
+
+    }
+
+    typedef boost::phoenix::function<impl::Cat> Cat;
+    Cat cat;
+
+
+//////////////////////////////////////////////////////////////////////
+// Handy functions for making list literals
+//////////////////////////////////////////////////////////////////////
+// Yes, these aren't functoids, they're just template functions.  I'm
+// lazy and created these mostly to make it easily to make little lists
+// in the sample code snippets that appear in papers.
+
+struct UseList {
+   template <class T> struct List { typedef list<T> type; };
+};
+struct UseOddList {
+   template <class T> struct List { typedef odd_list<T> type; };
+};
+struct UseStrictList {
+   template <class T> struct List { typedef strict_list<T> type; };
+};
+
+template <class Kind = UseList>
+struct list_with {
+   template <class T>
+   typename Kind::template List<T>::type
+   operator()( const T& a ) const {
+      typename Kind::template List<T>::type l;
+      l = cons( a, l );
+      return l;
+   }
+   
+   template <class T>
+   typename Kind::template List<T>::type
+   operator()( const T& a, const T& b ) const {
+      typename Kind::template List<T>::type l;
+      l = cons( b, l );
+      l = cons( a, l );
+      return l;
+   }
+   
+   template <class T>
+   typename Kind::template List<T>::type
+   operator()( const T& a, const T& b, const T& c ) const {
+      typename Kind::template List<T>::type l;
+      l = cons( c, l );
+      l = cons( b, l );
+      l = cons( a, l );
+      return l;
+   }
+   
+   template <class T>
+   typename Kind::template List<T>::type
+   operator()( const T& a, const T& b, const T& c, const T& d ) const {
+      typename Kind::template List<T>::type l;
+      l = cons( d, l );
+      l = cons( c, l );
+      l = cons( b, l );
+      l = cons( a, l );
+      return l;
+   }
+   
+   template <class T>
+   typename Kind::template List<T>::type
+   operator()( const T& a, const T& b, const T& c, const T& d,
+               const T& e ) const {
+      typename Kind::template List<T>::type l;
+      l = cons( e, l );
+      l = cons( d, l );
+      l = cons( c, l );
+      l = cons( b, l );
+      l = cons( a, l );
+      return l;
+   }
+};
+//////////////////////////////////////////////////////////////////////
+
+  }
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/function/lazy_operator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,670 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy operator.hpp
+//
+// Build lazy operations for Phoenix equivalents for FC++
+//
+// These are equivalents of the Boost FC++ functoids in operator.hpp
+//
+// Implemented so far:
+//
+// make_pair
+// plus minus multiplies divides modulus
+// negate equal not_equal greater less
+// greater_equal less_equal logical_and logical_or
+// logical_not min max inc dec
+//
+// These are not from the FC++ operator.hpp but were made for testing purposes.
+//
+// identity (renamed id)
+// sin
+//
+// These are now being modified to use boost::phoenix::function
+// so that they are available for use as arguments.
+// Types are being defined in capitals e.g. Id id;
+////////////////////////////////////////////////////////////////////////////
+/*=============================================================================
+    Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2015 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_OPERATOR
+#define BOOST_PHOENIX_FUNCTION_LAZY_OPERATOR
+
+#include <cmath>
+#include <cstdlib>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/function.hpp>
+
+namespace boost {
+
+  namespace phoenix {
+
+//////////////////////////////////////////////////////////////////////
+// a_unique_type_for_nil
+//////////////////////////////////////////////////////////////////////
+
+// This may need to be moved elsewhere to define reuser.
+   struct a_unique_type_for_nil {
+     bool operator==( a_unique_type_for_nil ) const { return true; }
+     bool operator< ( a_unique_type_for_nil ) const { return false; }
+     typedef a_unique_type_for_nil value_type;
+   };
+    // This maybe put into a namespace.
+   a_unique_type_for_nil NIL;
+
+//////////////////////////////////////////////////////////////////////
+// lazy_exception - renamed from fcpp_exception.
+//////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+   struct lazy_exception : public std::exception {
+       const char* s;
+       lazy_exception( const char* ss ) : s(ss) {}
+       const char* what() const throw() { return s; }
+   };
+#endif
+
+//////////////////////////////////////////////////////////////////////
+
+   // in ref_count.hpp in BoostFC++
+   typedef unsigned int RefCountType;
+
+    namespace impl {
+
+      struct Id
+      {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0>
+        A0 operator()(A0 const & a0) const
+        {
+            return a0;
+        }
+
+      };
+
+
+    }
+
+    //BOOST_PHOENIX_ADAPT_CALLABLE(id, impl::id, 1)
+    typedef boost::phoenix::function<impl::Id> Id;
+    Id id;
+
+#ifdef BOOST_RESULT_OF_USE_TR1
+    // Experiment following examples in
+    // phoenix/stl/container/container.hpp
+
+    namespace result_of {
+
+      template <
+          typename Arg1
+        , typename Arg2
+      >
+      class make_pair
+      {
+      public:
+        typedef typename boost::remove_reference<Arg1>::type Arg1Type;
+        typedef typename boost::remove_reference<Arg2>::type Arg2Type;
+        typedef std::pair<Arg1Type,Arg2Type> type;
+        typedef std::pair<Arg1Type,Arg2Type> result_type;
+      };
+    }
+#endif
+
+  namespace impl
+  {
+
+    struct make_pair {
+
+
+#ifdef BOOST_RESULT_OF_USE_TR1
+       template <typename Sig>
+       struct result;
+       // This fails with -O2 unless refs are removed from A1 and A2.
+       template <typename This, typename A0, typename A1>
+       struct result<This(A0, A1)>
+       {
+         typedef typename result_of::make_pair<A0,A1>::type type;
+       };
+#else
+       template <typename Sig>
+       struct result;
+
+       template <typename This, typename A0, typename A1>
+       struct result<This(A0, A1)>
+         : boost::remove_reference<std::pair<A0, A1> >
+       {};
+      
+#endif
+
+
+       template <typename A0, typename A1>
+#ifdef BOOST_RESULT_OF_USE_TR1
+       typename result<make_pair(A0,A1)>::type
+#else
+       std::pair<A0, A1>
+#endif
+       operator()(A0 const & a0, A1 const & a1) const
+       {
+          return std::make_pair(a0,a1);
+       }
+
+    };
+  }
+
+BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
+
+  namespace impl
+  {
+
+    // For now I will leave the return type deduction as it is.
+    // I want to look at bringing in the sort of type deduction for
+    // mixed types which I have in FC++.
+    // Also I could look at the case where one of the arguments is
+    // another functor or a Phoenix placeholder.
+    struct Plus
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+             : boost::remove_reference<A0>
+        {};
+
+        template <typename This, typename A0, typename A1, typename A2>
+        struct result<This(A0, A1, A2)>
+             : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+          //A0 res = a0 + a1;
+          //return res;
+          return a0 + a1;
+        }
+
+        template <typename A0, typename A1, typename A2>
+        A0 operator()(A0 const & a0, A1 const & a1, A2 const & a2) const
+        {
+            return a0 + a1 + a2;
+        }
+    };
+
+    struct Minus
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 - a1;
+        }
+
+    };
+
+    struct multiplies
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 * a1;
+        }
+
+    };
+
+    struct divides
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 / a1;
+        }
+
+    };
+
+    struct modulus
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+          : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 % a1;
+        }
+
+    };
+
+    struct negate
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0>
+        A0 operator()(A0 const & a0) const
+        {
+            return -a0;
+        }
+    };
+
+    struct equal
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 == a1;
+        }
+    };
+
+    struct not_equal
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 != a1;
+        }
+    };
+
+    struct greater
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 > a1;
+        }
+    };
+
+    struct less
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 < a1;
+        }
+    };
+
+    struct greater_equal
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 >= a1;
+        }
+    };
+
+    struct less_equal
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 <= a1;
+        }
+    };
+
+    struct logical_and
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 && a1;
+        }
+    };
+
+    struct logical_or
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0,A1)>
+        {
+            typedef bool type;
+        };
+
+        template <typename A0, typename A1>
+        bool operator()(A0 const & a0, A1 const & a1) const
+        {
+            return a0 || a1;
+        }
+    };
+
+    struct logical_not
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+        {
+             typedef bool type;
+        };
+
+        template <typename A0>
+        bool operator()(A0 const & a0) const
+        {
+            return !a0;
+        }
+    };
+
+    struct min
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+          : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+           if ( a0 < a1 ) return a0; else return a1;
+        }
+
+    };
+
+    struct max
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename A1>
+        struct result<This(A0, A1)>
+          : boost::remove_reference<A0>
+        {};
+
+        template <typename A0, typename A1>
+        A0 operator()(A0 const & a0, A1 const & a1) const
+        {
+           if ( a0 < a1 ) return a1; else return a0;
+        }
+
+    };
+
+    struct Inc
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0>
+        A0 operator()(A0 const & a0) const
+        {
+            return a0 + 1;
+        }
+
+    };
+
+    struct Dec
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0>
+        A0 operator()(A0 const & a0) const
+        {
+            return a0 - 1;
+        }
+
+    };
+
+    struct Sin
+    {
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0>
+        struct result<This(A0)>
+           : boost::remove_reference<A0>
+        {};
+
+        template <typename A0>
+        A0 operator()(A0 const & a0) const
+        {
+          return std::sin(a0);
+        }
+
+    };
+
+    // Example of templated struct.
+    // How do I make it callable?
+    template <typename Result>
+    struct what {
+
+      typedef Result result_type;
+
+      Result operator()(Result const & r) const
+      {
+        return r;
+      }
+      // what is not complete - error.
+      //static boost::function1<Result,Result> res = what<Result>();
+    };
+
+    template <typename Result>
+    struct what0 {
+
+      typedef Result result_type;
+
+      Result operator()() const
+      {
+        return Result(100);
+      }
+
+    };
+
+      template <class Result, class F>
+      class MonomorphicWrapper0 /* : public c_fun_type<Res> */
+      {
+          F f;
+      public:
+          typedef Result result_type;
+          MonomorphicWrapper0( const F& g ) : f(g) {}
+             Result operator()() const {
+             return f();
+          }
+      };
+
+      /* I need the equivalent of this
+      template <class Res, class F>
+      full0<impl::XMonomorphicWrapper0<Res,F> > monomorphize0( const F& f )
+      {
+         return make_full0( impl::XMonomorphicWrapper0<Res,F>( f ) );
+      }*/
+      
+
+    // boost::function0<int> res = MonomorphicWrapper0<int,F>(f);
+ 
+     
+      template <class Res, class F>
+      boost::function<Res()> monomorphize0( const F& f )
+      {
+        boost::function0<Res> ff =  MonomorphicWrapper0<Res,F>( f );
+        //BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(Res,fres,ff)
+        return ff;
+      }
+
+    // This is C++1y
+    //template <typename Result>
+    //static boost::function1<Result,Result> res = what<Result>();
+
+
+  }
+    /////////////////////////////////////////////////////////
+    // Look at this. How to use Phoenix with a templated
+    // struct. First adapt with boost::function and then
+    // convert that to Phoenix!!
+    // I have not found out how to do it directly.
+    /////////////////////////////////////////////////////////
+boost::function1<int, int > what_int = impl::what<int>();
+typedef boost::function1<int,int> fun1_int_int;
+typedef boost::function0<int> fun0_int;
+boost::function0<int> what0_int = impl::what0<int>();
+BOOST_PHOENIX_ADAPT_FUNCTION(int,what,what_int,1)
+BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(int,what0,what0_int)
+// And this shows how to make them into argument callable functions.
+typedef boost::phoenix::function<fun1_int_int> What_arg;
+typedef boost::phoenix::function<fun0_int> What0_arg;
+What_arg what_arg(what_int);
+What0_arg what0_arg(what0_int);
+
+//BOOST_PHOENIX_ADAPT_CALLABLE(plus, impl::plus, 2)
+//BOOST_PHOENIX_ADAPT_CALLABLE(plus, impl::plus, 3)
+//BOOST_PHOENIX_ADAPT_CALLABLE(minus, impl::minus, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(multiplies, impl::multiplies, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(divides, impl::divides, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(modulus, impl::modulus, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(negate, impl::negate, 1)
+BOOST_PHOENIX_ADAPT_CALLABLE(equal, impl::equal, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(not_equal, impl::not_equal, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(greater, impl::greater, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(less, impl::less, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(greater_equal, impl::greater_equal, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(less_equal, impl::less_equal, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(logical_and, impl::logical_and, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(logical_or, impl::logical_or, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(logical_not, impl::logical_not, 1)
+BOOST_PHOENIX_ADAPT_CALLABLE(min, impl::min, 2)
+BOOST_PHOENIX_ADAPT_CALLABLE(max, impl::max, 2)
+//BOOST_PHOENIX_ADAPT_CALLABLE(inc, impl::inc, 1)
+//BOOST_PHOENIX_ADAPT_CALLABLE(dec, impl::dec, 1)
+//BOOST_PHOENIX_ADAPT_CALLABLE(sin, impl::sin, 1)
+
+// To use these as arguments they have to be defined like this.
+    typedef boost::phoenix::function<impl::Plus> Plus;
+    typedef boost::phoenix::function<impl::Minus> Minus;
+    typedef boost::phoenix::function<impl::Inc> Inc;
+    typedef boost::phoenix::function<impl::Dec> Dec;
+    typedef boost::phoenix::function<impl::Sin> Sin;
+    Plus plus;
+    Minus minus;
+    Inc inc;
+    Dec dec;
+    Sin sin;
+}
+
+}
+
+
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/function/lazy_prelude.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,798 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy prelude.hpp
+//
+// Build lazy operations for Phoenix equivalents for FC++
+//
+// These are equivalents of the Boost FC++ functoids in prelude.hpp
+//
+// Usage:  All of these are functors which need various numbers of arguments.
+//         Those can be supplied as real arguments or as Phoenix arguments.
+//         Execution will happen when all the arguments are supplied.
+// e.g.
+//         take(2,list)()  or  take(2,arg1)(list)
+//
+// Implemented so far:
+//
+// id (moved back to operators.hpp)
+//
+// A lot of what comes here uses the list type, so that will be needed first.
+//
+// Now that list<T> is available I can start to build things here.
+//
+//
+// until(pred,f,start)         - if pred(start) is true, return start
+//                               apply value = f(start)
+//                               apply value = f(value)
+//                               until pred(value) is true
+//                               return value
+//
+// The predicate argument pred must be a lazy function taking one argument
+// and returning bool.
+// This can be a lazy function with an argument already.
+// This has to be declared before the call to until.
+// The type can be declated using Predicate as in this example:
+//
+//    Predicate<int>::type f(greater(arg1,10));
+//    std::cout << until(f, inc, 1)() << std::endl;
+//
+// until2(pred,f,start,value2) - if pred(start,value2) is true, return start
+//                               apply value1 = f(start)
+//                               apply value1 = f(value1)
+//                               until pred(value1,value2) is true
+//                               return value1
+//
+// NOTE: until2 has been defined because this code does not support
+//       FC++ currying, so that a partial function cannot be passed
+//       as an argument. This provides a way of passing a second parameter.
+//       There is now the option to use Predicate<T> as shown above.
+//
+// odd(n)     true if n is odd
+// even(n)    true if n is even
+//
+// last(list)
+// all_but_last(list)
+// at(list,n)
+// length(list)
+// filter(pred,list)
+// iterate(function,value)
+// repeat(value)
+// take(n,list)
+// drop(n,list)
+// enum_from(x)
+// enum_from_to(x,y)
+//
+////////////////////////////////////////////////////////////////////////////
+// Interdependence:
+// The old Boost FC++ has a set of headers which interelate and call each
+// other in a complicated way. I am going to document the interdependence
+// of the files here. I will then make sure that they are called correctly
+// starting from this file. John Fletcher. February 2015.
+////////////////////////////////////////////////////////////////////////////
+// BoostFC++ header sequence:
+// 
+// prelude.hpp   -> list.hpp (optinally monad.hpp at end)
+// list.hpp      -> reuse.hpp
+// reuse.hpp     -> function.hpp
+// function.hpp  -> ref_count.hpp operator.hpp
+// ref_count.hpp -> config.hpp boost headers and RefCountType definition
+// operator.hpp  -> lambda.hpp
+// lambda.hpp    -> full.hpp (use of lambda internals is optional)
+// full.hpp      -> smart.hpp curry.hpp pre_lambda.hpp (optionally full4.hpp)
+// smart.hpp     -> signature.hpp
+// curry.hpp     -> signature.hpp
+// signature.hpp -> config.hpp
+//
+////////////////////////////////////////////////////////////////////////////
+// Proposed order in lazy_prelude.hpp
+// on the basis that files need what they call.
+//
+// lazy_config.hpp    (If needed)* probably not needed.
+// lazy_signature.hpp (If needed)*
+// lazy_smart.hpp     (If needed)*
+// lazy_curry.hpp     (If needed)*
+// lazy_full.hpp      (If needed)*
+// lazy_operator.hpp  (absorb definition of RefCountType)
+// lazy_function.hpp  (may not now be needed)
+// lazy_reuse.hpp     (implemented without use of FC++ functions)
+// lazy_list.hpp
+//
+// * file does not yet exist.
+////////////////////////////////////////////////////////////////////////////
+// This is implemented such that no other lazy_ file calls other lazy_ files.
+// They do call their own external files, which may well be duplicates.
+// That can be sorted out later.
+////////////////////////////////////////////////////////////////////////////
+// Notes: full and curry operations should be covered by Phoenix.
+// The lambda operations are quite different from Phoenix lambda
+// and will be omitted.
+// The implementation monad can be postponed.
+// Some of function and reuse are needed for the list type.
+// I will review later whether they are part of the external interface.
+//
+// John Fletcher  February 2015.
+////////////////////////////////////////////////////////////////////////////
+/*=============================================================================
+    Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2015 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_PRELUDE
+#define BOOST_PHOENIX_FUNCTION_LAZY_PRELUDE
+
+#include <exception>
+#include <vector>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/phoenix/scope.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/function/lazy_operator.hpp>
+#include <boost/phoenix/function/lazy_reuse.hpp>
+#include <boost/phoenix/function/lazy_list.hpp>
+
+////////////////////////////////////////////////////////////////////////////
+// To come here, the Haskell Prelude things which need list<T>.
+// Things which do not need list<T> are in lazy_operator.hpp.
+////////////////////////////////////////////////////////////////////////////
+
+namespace boost {
+
+  namespace phoenix {
+
+    // These are in fcpp namespace as they introduce an FC++ style.
+    namespace fcpp {
+
+    template <typename T>
+    struct Predicate {
+        typedef typename boost::function1<bool,T> fun1_bool_T;
+        typedef typename boost::phoenix::function<fun1_bool_T> bool_F_T;
+        typedef bool_F_T type;
+    };
+
+    template <typename R>
+    struct Function0 {
+        typedef typename boost::function0<R> fun0_R;
+        typedef typename boost::phoenix::function<fun0_R> R_F;
+        typedef R_F type;
+    };
+
+    template <typename R,typename A0>
+    struct Function1 {
+        typedef typename boost::function1<R,A0> fun1_R_A0;
+        typedef typename boost::phoenix::function<fun1_R_A0> R_F_A0;
+        typedef R_F_A0 type;
+    };
+
+    template <typename R, typename A0, typename A1>
+    struct Function2 {
+      typedef typename boost::function2<R,A0,A1> fun2_R_A0_A1;
+        typedef typename boost::phoenix::function<fun2_R_A0_A1> R_F_A0_A1;
+        typedef R_F_A0_A1 type;
+    };
+
+    }
+
+    namespace impl {
+      using fcpp::INV;
+      using fcpp::VAR;
+      using fcpp::reuser1;
+      using fcpp::reuser2;
+      using fcpp::reuser3;
+      using boost::phoenix::arg_names::arg1;
+
+         struct Pow {
+
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename N, typename A0>
+            struct result<This(N,A0)>
+               : boost::remove_reference<A0>
+            {};
+
+            template <typename N, typename A0>
+            A0 operator()(N n, const A0 & a0,
+            reuser2<INV,VAR,INV,Pow,N,A0> r = NIL ) const {
+              if ( n <= 0 )
+                 return A0(1);
+              else if ( n==1 )
+                 return a0;
+              else {
+                A0 a1 = r( Pow(), n-1, a0)();
+                return a0*a1;
+              }
+            }
+
+         };
+
+         struct Apply {
+
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename N, typename F,typename A0>
+            struct result<This(N,F,A0)>
+               : boost::remove_reference<A0>
+            {};
+
+            template <typename N, typename F, typename A0>
+            A0 operator()(N n, const F &f, const A0 & a0,
+            reuser3<INV,VAR,INV,INV,Apply,N,F,A0> r = NIL ) const {
+              if ( n <= 0 )
+                 return a0;
+              else if ( n==1 )
+                 return f(arg1)(a0);
+              else {
+                A0 a1 = r( Apply(), n-1, f, a0)();
+                return f(a1)();
+              }
+            }
+
+         };
+
+         struct Odd {
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename T>
+            struct result<This(T)>
+            {
+              typedef bool type;
+            };
+
+            template <class T>
+            typename result<Odd(T)>::type operator()( const T& x ) const {
+               return x%2==1;
+            }
+         };
+
+         struct Even {
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename T>
+            struct result<This(T)>
+            {
+              typedef bool type;
+            };
+
+            template <class T>
+            typename result<Even(T)>::type operator()( const T& x ) const {
+               return x%2==0;
+            }
+         };
+
+    }
+    typedef boost::phoenix::function<impl::Pow>   Pow;
+    typedef boost::phoenix::function<impl::Apply> Apply;
+    typedef boost::phoenix::function<impl::Odd>   Odd;
+    typedef boost::phoenix::function<impl::Even>  Even;
+    Pow   pow;
+    Apply apply;
+    Odd   odd;
+    Even  even;
+
+    namespace impl {
+      using fcpp::INV;
+      using fcpp::VAR;
+      using fcpp::reuser1;
+      using fcpp::reuser2;
+      using fcpp::reuser3;
+      using boost::phoenix::arg_names::arg1;
+
+      // I cannot yet do currying to pass e.g. greater(9,arg1)
+      // as a function. This can be done using Predicate<T>::type.
+         struct Until {
+
+             template <typename Sig> struct result;
+
+             template <typename This, typename Pred, typename Unary, typename T>
+             struct result<This(Pred,Unary,T)>
+                : boost::remove_reference<T> {};
+
+             template <class Pred, class Unary, class T>
+             T operator()( const Pred& p,const Unary& op,const T &start) const
+             {
+               T tmp = start;
+               while( !p(tmp)() ) {
+                 tmp = apply(1,op,tmp)();
+               }
+                return tmp;
+             }
+
+          };
+
+          struct Until2 {
+
+             template <typename Sig> struct result;
+
+             template <typename This, typename Binary, typename Unary,
+                       typename T, typename X>
+             struct result<This(Binary,Unary,T,X)>
+                : boost::remove_reference<T> {};
+
+             template <class Binary, class Unary, class T, class X>
+             typename result<Until2(Binary,Unary,T,X)>::type
+             operator()( const Binary& p, const Unary& op, const T & start,
+                        const X & check ) const
+             {
+               T tmp1 = start;
+               T tmp2;
+               while( !p(tmp1,check)() ) {
+                 tmp2 = apply(1,op,tmp1)();
+                 tmp1 = tmp2;
+                 
+               }
+               return tmp1;
+             }
+          };
+
+          struct Last {
+             template <typename Sig> struct result;
+
+             template <typename This, typename L>
+             struct result<This(L)>
+             {
+               typedef typename result_of::ListType<L>::value_type type;
+             };
+
+             template <class L>
+             typename result<Last(L)>::type
+             operator()( const L& ll ) const {
+               size_t x = 0;
+               typename result_of::ListType<L>::delay_result_type l = delay(ll);
+               while( !null( tail(l)() )() ) {
+                 l = tail(l)();
+                 ++x;
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+                 if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                   break;
+#endif
+               }
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+                 if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                     throw lazy_exception("Your list is too long!!");
+#endif
+                 return head(l)();
+             }
+          };
+
+          struct Init {
+
+             template <typename Sig> struct result;
+
+             template <typename This, typename L>
+             struct result<This(L)>
+             {
+               typedef typename result_of::ListType<L>::force_result_type type;
+             };
+
+             template <class L>
+             typename result<Init(L)>::type
+             operator()( const L& l,
+                         reuser1<INV,VAR,Init,
+                         typename result_of::ListType<L>::delay_result_type>
+                         r = NIL ) const {
+               if( null( tail( l )() )() )
+                   return NIL;
+               else
+                   return cons( head(l)(), r( Init(), tail(l)() )() )();
+               }
+          };
+
+          struct Length {
+            template <typename Sig> struct result;
+
+            template <typename This, typename L>
+            struct result<This(L)>
+            {
+               typedef size_t type;
+            };
+
+            template <class L>
+            size_t operator()( const L& ll ) const {
+              typename L::delay_result_type l = delay(ll);
+              size_t x = 0;
+              while( !null(l)() ) {
+                  l = tail(l);
+                  ++x;
+                  if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                     break;
+              }
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+              if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                   throw lazy_exception("Your list is too long!!");
+#endif
+              return x;
+            }
+          };
+
+          // at is Haskell's operator (!!)
+          // This is zero indexed.  at(l,0)() returns the first element.
+          struct At {
+            template <typename Sig> struct result;
+
+            template <typename This, typename L, typename N>
+            struct result<This(L,N)>
+            {
+               typedef typename result_of::ListType<L>::value_type type;
+            };
+
+              template <class L>
+              typename result<At(L,size_t)>::type
+              operator()( L l, size_t n ) const {
+                  while( n!=0 ) {
+                      l = tail(l);
+                      --n;
+                  }
+                  return head(l)();
+              }
+          };
+
+         template <class P,class L>
+         struct FilterH
+          {
+              P p;
+              L l;
+              FilterH( const P& pp, const L& ll) : p(pp), l(ll) {}
+              template <typename Sig> struct result;
+
+              template <typename This, class PP, class LL>
+              struct result<This(PP,LL)>
+              {
+                typedef typename boost::phoenix::result_of::
+                        ListType<LL>::delay_result_type type;
+              };
+                typename result<FilterH(P,L)>::type operator()() const {
+                typedef typename result_of::ListType<L>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> Fun2_R_P_L;
+                typedef boost::phoenix::function<Fun2_R_P_L> FilterH_R_P_L;
+                if (null(l)() )
+                   return NIL;
+                Fun2_R_P_L fun2_R_P_L = FilterH<P,L>(p,tail(l));
+                FilterH_R_P_L filterh_R_P_L(fun2_R_P_L);
+                if( p(head(l))() )
+                   return cons( head(l)(), filterh_R_P_L() );
+                else
+                   return filterh_R_P_L();
+              }
+          };
+
+          struct Filter {
+            template <typename Sig> struct result;
+
+                template <typename This, typename P, typename L>
+                struct result<This(P,L)>
+                {
+                  typedef typename result_of::ListType<L>::delay_result_type
+                          type;
+                };
+
+                template <class P, class L>
+                typename result<Filter(P,L)>::type
+                operator()( const P& p, const L& ll) const
+                {
+                     typename  result_of::ListType<L>::delay_result_type
+                     l = delay(ll);
+                     typedef typename result_of::ListType<L>::
+                           delay_result_type result_type;
+                     typedef boost::function0<result_type> Fun2_R_P_L;
+                     typedef boost::phoenix::function<Fun2_R_P_L> FilterH_R_P_L;
+                     Fun2_R_P_L fun2_R_P_L = FilterH<P,L>(p,l);
+                     FilterH_R_P_L filterh_R_P_L(fun2_R_P_L);
+                     return filterh_R_P_L();
+                }
+          };
+
+         template <class F,class T>
+         struct IterateH
+          {
+              F f;
+              T t;
+              IterateH( const F& ff, const T& tt) : f(ff), t(tt) {}
+              template <typename Sig> struct result;
+
+              template <typename This,class F2,class T2>
+              struct result<This(F2,T2)>
+              {
+                typedef typename boost::remove_reference<T2>::type TT;
+                typedef typename boost::remove_const<TT>::type TTT;
+                typedef typename UseList::template List<TTT>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type type;
+              };
+
+                typename result<IterateH(F,T)>::type operator()() const {
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> Fun2_R_F_T;
+                typedef boost::phoenix::function<Fun2_R_F_T> IterateH_R_F_T;
+                Fun2_R_F_T fun2_R_F_T = IterateH<F,T>(f,f(t)());
+                IterateH_R_F_T iterateh_R_F_T(fun2_R_F_T);
+                   return cons( t, iterateh_R_F_T() );
+              }
+          };
+
+
+          struct Iterate {
+   // Note: this does always return an odd_list; iterate() takes no ListLike
+   // parameter, and it requires that its result be lazy.
+              template <typename Sig> struct result;
+
+              template <typename This, typename F, typename T>
+              struct result<This(F,T)>
+              {
+                typedef typename boost::remove_reference<T>::type TT;
+                typedef typename boost::remove_const<TT>::type TTT;
+                typedef typename UseList::template List<TTT>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type type;
+              };
+
+              template <class F, class T>
+                typename result<Iterate(F,T)>::type operator()
+                (const F& f, const T& t) const {
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> Fun2_R_F_T;
+                typedef boost::phoenix::function<Fun2_R_F_T> IterateH_R_F_T;
+                Fun2_R_F_T fun2_R_F_T = IterateH<F,T>(f,f(t)());
+                IterateH_R_F_T iterateh_R_F_T(fun2_R_F_T);
+                   return iterateh_R_F_T();
+              }
+          };
+
+    }
+
+    typedef boost::phoenix::function<impl::Until> Until;
+    typedef boost::phoenix::function<impl::Until2> Until2;
+    typedef boost::phoenix::function<impl::Last>  Last;
+    typedef boost::phoenix::function<impl::Init>  Init;
+    typedef boost::phoenix::function<impl::Length> Length;
+    typedef boost::phoenix::function<impl::At>    At;
+    typedef boost::phoenix::function<impl::Filter> Filter;
+    typedef boost::phoenix::function<impl::Iterate> Iterate;
+    Until until;
+    Until2 until2;
+    Last  last;
+    Init  all_but_last;  // renamed from init which is not available.
+    Length length;
+    At at_;  //Renamed from at.
+    Filter filter;
+    Iterate iterate;
+
+    namespace impl {
+
+          struct Repeat {
+         // See note for iterate()
+              template <typename Sig> struct result;
+
+              template <typename This, typename T>
+              struct result<This(T)>
+              {
+                typedef typename boost::remove_reference<T>::type TT;
+                typedef typename boost::remove_const<TT>::type TTT;
+                typedef typename UseList::template List<TTT>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type type;
+              };
+
+              template <class T>
+              typename result<Repeat(T)>::type operator()( const T& x) const
+              {
+                return iterate(id,x);
+              }
+          };
+
+          struct Take {
+
+             template <typename Sig> struct result;
+
+             template <typename This, typename N, typename L>
+             struct result<This(N,L)>
+             {
+               typedef typename result_of::ListType<L>::force_result_type type;
+             };
+
+             template <class N,class L>
+             typename result<Take(N,L)>::type
+             operator()( N n, const L& l,
+               reuser2<INV,VAR,VAR,Take,N,
+               typename result_of::ListType<L>::force_result_type>
+               r = NIL
+             ) const {
+               if( n <= 0 || null(l)() )
+                 return NIL;
+               else {
+                 return cons( head(l)(), r( Take(), n-1, tail(l)() )() )();
+               }
+             }
+          };
+
+          struct Drop {
+             template <typename Sig> struct result;
+
+             template <typename This, typename Dummy, typename L>
+             struct result<This(Dummy,L)>
+             {
+               typedef typename result_of::ListType<L>::delay_result_type type;
+             };
+   
+             template <class L>
+             typename result<Drop(size_t,L)>::type
+             operator()( size_t n, const L& ll ) const {
+               typename L::delay_result_type l = delay(ll);
+               while( n!=0 && !null(l)() ) {
+                 --n;
+                 l = tail(l)();
+               }
+               return l;
+             }
+          };
+ 
+          template <class T>
+          struct EFH
+          {
+              mutable T x;
+              EFH( const T& xx) : x(xx) {}
+              template <typename Sig> struct result;
+
+              template <typename This, class TT>
+              struct result<This(TT)>
+              {
+                typedef typename boost::phoenix::UseList::template
+                        List<TT>::type LType;
+                typedef typename boost::phoenix::result_of::
+                        ListType<LType>::delay_result_type type;
+              };
+              typename result<EFH(T)>::type operator()() const {
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> fun1_R_TTT;
+                //std::cout << "EFH (" << x << ")" << std::endl;
+                ++x;
+                fun1_R_TTT efh_R_TTT = EFH<T>(x);
+                typedef boost::phoenix::function<fun1_R_TTT> EFH_R_T;
+                EFH_R_T efh_R_T(efh_R_TTT);
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+                if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                     throw lazy_exception("Running away in EFH!!");
+#endif
+                return cons( x-1, efh_R_T() );
+              }
+          };
+
+          struct Enum_from {
+             template <typename Sig> struct result;
+
+             template <typename This, typename T>
+             struct result<This(T)>
+             {
+               typedef typename boost::remove_reference<T>::type TT;
+               typedef typename boost::remove_const<TT>::type TTT;
+               typedef typename UseList::template List<TTT>::type LType;
+               typedef typename result_of::ListType<LType>::
+                       delay_result_type type;
+             };
+
+             template <class T>
+             typename result<Enum_from(T)>::type operator()
+                (const T & x) const
+              {
+                typedef typename boost::remove_reference<T>::type TT;
+                typedef typename boost::remove_const<TT>::type TTT;
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> fun1_R_TTT;
+                fun1_R_TTT efh_R_TTT = EFH<TTT>(x);
+                typedef boost::phoenix::function<fun1_R_TTT> EFH_R_T;
+                EFH_R_T efh_R_T(efh_R_TTT);
+                //std::cout << "enum_from (" << x << ")" << std::endl;
+                return efh_R_T();
+              }
+          };
+
+       template <class T>
+         struct EFTH
+          {
+              mutable T x;
+              T y;
+              EFTH( const T& xx, const T& yy) : x(xx), y(yy) {}
+              template <typename Sig> struct result;
+
+              template <typename This, class TT>
+              struct result<This(TT)>
+              {
+                typedef typename boost::phoenix::UseList::template
+                        List<TT>::type LType;
+                typedef typename boost::phoenix::result_of::
+                        ListType<LType>::delay_result_type type;
+              };
+              typename result<EFTH(T)>::type operator()() const {
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> fun1_R_TTT;
+                //std::cout << "EFTH (" << x << ")" << std::endl;
+                if (x > y ) return NIL;
+                ++x;
+                fun1_R_TTT efth_R_TTT = EFTH<T>(x,y);
+                typedef boost::phoenix::function<fun1_R_TTT> EFTH_R_T;
+                EFTH_R_T efth_R_T(efth_R_TTT);
+#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
+                if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
+                     throw lazy_exception("Running away in EFTH!!");
+#endif
+                return cons( x-1, efth_R_T() );
+              }
+          };
+
+          struct Enum_from_to {
+             template <typename Sig> struct result;
+
+             template <typename This, typename T>
+             struct result<This(T,T)>
+             {
+               typedef typename boost::remove_reference<T>::type TT;
+               typedef typename boost::remove_const<TT>::type TTT;
+               typedef typename UseList::template List<TTT>::type LType;
+               typedef typename result_of::ListType<LType>::
+                       delay_result_type type;
+             };
+
+             template <class T>
+             typename result<Enum_from(T,T)>::type operator()
+             (const T & x, const T & y) const
+              {
+                typedef typename boost::remove_reference<T>::type TT;
+                typedef typename boost::remove_const<TT>::type TTT;
+                typedef typename UseList::template List<T>::type LType;
+                typedef typename result_of::ListType<LType>::
+                        delay_result_type result_type;
+                typedef boost::function0<result_type> fun1_R_TTT;
+                fun1_R_TTT efth_R_TTT = EFTH<TTT>(x,y);
+                typedef boost::phoenix::function<fun1_R_TTT> EFTH_R_T;
+                EFTH_R_T efth_R_T(efth_R_TTT);
+                //std::cout << "enum_from (" << x << ")" << std::endl;
+                return efth_R_T();
+              }
+          };
+
+    }
+
+
+    //BOOST_PHOENIX_ADAPT_CALLABLE(apply, impl::apply, 3)
+    // Functors to be used in reuser will have to be defined
+    // using boost::phoenix::function directly
+    // in order to be able to be used as arguments.
+    typedef boost::phoenix::function<impl::Repeat> Repeat;
+    typedef boost::phoenix::function<impl::Take>  Take;
+    typedef boost::phoenix::function<impl::Drop>  Drop;
+    typedef boost::phoenix::function<impl::Enum_from>     Enum_from;
+    typedef boost::phoenix::function<impl::Enum_from_to>  Enum_from_to;
+    Repeat repeat;
+    Take  take;
+    Drop  drop;
+    Enum_from enum_from;
+    Enum_from_to enum_from_to;
+
+    namespace fcpp {
+
+
+    }
+
+  }
+
+}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/function/lazy_reuse.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,242 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy_reuse.hpp
+//
+// Build lazy operations for Phoenix equivalents for FC++
+//
+// These are equivalents of the Boost FC++ functoids in reuse.hpp
+//
+// Implemented so far:
+//
+// reuser1 (not yet tested)
+// reuser2 (not yet tested)
+// reuser3
+//
+// NOTE: It has been possible to simplify the operation of this code.
+//       It now makes no use of boost::function or old FC++ code.
+//
+//       The functor type F must be an operator defined with
+//       boost::phoenix::function.
+//       See the example Apply in lazy_prelude.hpp
+//
+////////////////////////////////////////////////////////////////////////////
+/*=============================================================================
+    Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2015 John Fletcher
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_REUSE
+#define BOOST_PHOENIX_FUNCTION_LAZY_REUSE
+
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/intrusive_ptr.hpp>
+
+
+namespace boost {
+
+  namespace phoenix {
+
+    namespace fcpp {
+
+//////////////////////////////////////////////////////////////////////
+// Original FC++ comment:
+// "Reuser"s are effectively special-purpose versions of curry() that
+// enable recursive list functoids to reuse the thunk of the curried
+// recursive call.  See
+//    http://www.cc.gatech.edu/~yannis/fc++/New/reusers.html
+// for a more detailed description.
+//////////////////////////////////////////////////////////////////////
+
+// For efficiency, we mark parameters as either "VAR"iant or "INV"ariant.
+struct INV {};
+struct VAR {};
+
+template <class V, class X> struct Maybe_Var_Inv;
+template <class X>
+struct Maybe_Var_Inv<VAR,X> {
+   static void remake( X& x, const X& val ) {
+      x.~X();
+      new (&x) X(val);
+   }
+   static X clone( const X& x ) { return X(x); }
+};
+template <class X>
+struct Maybe_Var_Inv<INV,X> {
+   static void remake( X&, const X& ) {}
+   static const X& clone( const X& x ) { return x; }
+};
+
+/////////////////////////////////////////////////////////////////////
+// ThunkImpl is an implementation of Fun0Impl for this use.
+/////////////////////////////////////////////////////////////////////
+
+template <class Result>
+class ThunkImpl
+{
+   mutable RefCountType refC;
+public:
+   ThunkImpl() : refC(0) {}
+   virtual Result operator()() const =0;
+   virtual ~ThunkImpl() {}
+   template <class X>
+   friend void intrusive_ptr_add_ref( const ThunkImpl<X>* p );
+   template <class X>
+   friend void intrusive_ptr_release( const ThunkImpl<X>* p );
+};
+
+template <class T>
+void intrusive_ptr_add_ref( const ThunkImpl<T>* p ) {
+   ++ (p->refC);
+}
+template <class T>
+void intrusive_ptr_release( const ThunkImpl<T>* p ) {
+   if( !--(p->refC) ) delete p;
+}
+
+//////////////////////////////////////////////////////////////////////
+// reuser1 is needed in list<T> operations
+//////////////////////////////////////////////////////////////////////
+
+template <class V1, class V2, class F, class X>
+struct reuser1;
+
+template <class V1, class V2, class F, class X, class R>
+struct Thunk1 : public ThunkImpl<R> {
+   mutable F f;
+   mutable X x;
+   Thunk1( const F& ff, const X& xx ) : f(ff), x(xx) {}
+   void init( const F& ff, const X& xx ) const {
+      Maybe_Var_Inv<V1,F>::remake( f, ff );
+      Maybe_Var_Inv<V2,X>::remake( x, xx );
+   }
+   R operator()() const {
+      return Maybe_Var_Inv<V1,F>::clone(f)(
+         Maybe_Var_Inv<V2,X>::clone(x),
+         reuser1<V1,V2,F,X>(this) );
+   }
+};
+
+template <class V1, class V2, class F, class X>
+struct reuser1 {
+   typedef typename F::template result<F(X)>::type R;
+   typedef typename boost::phoenix::function<R> fun0_type;
+   typedef Thunk1<V1,V2,F,X,R> M;
+   typedef M result_type;
+   boost::intrusive_ptr<const M> ref;
+   reuser1(a_unique_type_for_nil) {}
+   reuser1(const M* m) : ref(m) {}
+   M operator()( const F& f, const X& x ) {
+      if( !ref )   ref = boost::intrusive_ptr<const M>( new M(f,x) );
+      else         ref->init(f,x);
+      return *ref;
+   }
+   void iter( const F& f, const X& x ) {
+      if( ref )    ref->init(f,x);
+   }
+};
+
+//////////////////////////////////////////////////////////////////////
+// reuser2 is needed in list<T>
+//////////////////////////////////////////////////////////////////////
+
+template <class V1, class V2, class V3, class F, class X, class Y>
+struct reuser2;
+
+template <class V1, class V2, class V3, class F, class X, class Y, class R>
+struct Thunk2 : public ThunkImpl<R> {
+   mutable F f;
+   mutable X x;
+   mutable Y y;
+   Thunk2( const F& ff, const X& xx, const Y& yy ) : f(ff), x(xx), y(yy) {}
+   void init( const F& ff, const X& xx, const Y& yy ) const {
+      Maybe_Var_Inv<V1,F>::remake( f, ff );
+      Maybe_Var_Inv<V2,X>::remake( x, xx );
+      Maybe_Var_Inv<V3,Y>::remake( y, yy );
+   }
+   R operator()() const {
+      return Maybe_Var_Inv<V1,F>::clone(f)(
+         Maybe_Var_Inv<V2,X>::clone(x),
+         Maybe_Var_Inv<V3,Y>::clone(y),
+         reuser2<V1,V2,V3,F,X,Y>(this) );
+   }
+};
+
+template <class V1, class V2, class V3, class F, class X, class Y>
+struct reuser2 {
+   typedef typename F::template result<F(X,Y)>::type R;
+   typedef Thunk2<V1,V2,V3,F,X,Y,R> M;
+   typedef M result_type;
+   boost::intrusive_ptr<const M> ref;
+   reuser2(a_unique_type_for_nil) {}
+   reuser2(const M* m) : ref(m) {}
+   M operator()( const F& f, const X& x, const Y& y ) {
+      if( !ref )   ref = boost::intrusive_ptr<const M>( new M(f,x,y) );
+      else         ref->init(f,x,y);
+      return *ref;
+   }
+   void iter( const F& f, const X& x, const Y& y ) {
+      if( ref )    ref->init(f,x,y);
+   }
+};
+
+//////////////////////////////////////////////////////////////////////
+// reuser3
+//////////////////////////////////////////////////////////////////////
+
+template <class V1, class V2, class V3, class V4,
+          class F, class X, class Y, class Z>
+struct reuser3;
+
+template <class V1, class V2, class V3, class V4,
+          class F, class X, class Y, class Z, class R>
+struct Thunk3 : public ThunkImpl<R> {
+   mutable F f;
+   mutable X x;
+   mutable Y y;
+   mutable Z z;
+   Thunk3( const F& ff, const X& xx, const Y& yy, const Z& zz )
+      : f(ff), x(xx), y(yy), z(zz) {}
+   void init( const F& ff, const X& xx, const Y& yy, const Z& zz ) const {
+      Maybe_Var_Inv<V1,F>::remake( f, ff );
+      Maybe_Var_Inv<V2,X>::remake( x, xx );
+      Maybe_Var_Inv<V3,Y>::remake( y, yy );
+      Maybe_Var_Inv<V4,Z>::remake( z, zz );
+   }
+   R operator()() const {
+      return Maybe_Var_Inv<V1,F>::clone(f)(
+         Maybe_Var_Inv<V2,X>::clone(x),
+         Maybe_Var_Inv<V3,Y>::clone(y),
+         Maybe_Var_Inv<V4,Z>::clone(z),
+         reuser3<V1,V2,V3,V4,F,X,Y,Z>(this) );
+   }
+};
+
+template <class V1, class V2, class V3, class V4,
+          class F, class X, class Y, class Z>
+struct reuser3 {
+   typedef typename F::template result<F(X,Y,Z)>::type R;
+   typedef Thunk3<V1,V2,V3,V4,F,X,Y,Z,R> M;
+   typedef M result_type;
+   boost::intrusive_ptr<const M> ref;
+   reuser3(a_unique_type_for_nil) {}
+   reuser3(const M* m) : ref(m) {}
+   M operator()( const F& f, const X& x, const Y& y, const Z& z ) {
+      if( !ref )   ref = boost::intrusive_ptr<const M>( new M(f,x,y,z) );
+      else         ref->init(f,x,y,z);
+      return *ref;
+   }
+   void iter( const F& f, const X& x, const Y& y, const Z& z ) {
+      if( ref )    ref->init(f,x,y,z);
+   }
+};
+
+    }
+
+  }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/polymorphic_cast.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,100 @@
+//  boost polymorphic_cast.hpp header file  ----------------------------------------------//
+
+//  (C) Copyright Kevlin Henney and Dave Abrahams 1999.
+//  (C) Copyright Boris Rasin 2014.
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/conversion for Documentation.
+
+//  Revision History
+//  10 Nov 14  polymorphic_pointer_downcast moved to a separate header,
+//             minor improvements to stisfy latest Boost coding style
+//  08 Nov 14  Add polymorphic_pointer_downcast (Boris Rasin)
+//  09 Jun 14  "cast.hpp" was renamed to "polymorphic_cast.hpp" and
+//             inclusion of numeric_cast was removed (Antony Polukhin)
+//  23 Jun 05  numeric_cast removed and redirected to the new verion (Fernando Cacciola)
+//  02 Apr 01  Removed BOOST_NO_LIMITS workarounds and included
+//             <boost/limits.hpp> instead (the workaround did not
+//             actually compile when BOOST_NO_LIMITS was defined in
+//             any case, so we loose nothing). (John Maddock)
+//  21 Jan 01  Undid a bug I introduced yesterday. numeric_cast<> never
+//             worked with stock GCC; trying to get it to do that broke
+//             vc-stlport.
+//  20 Jan 01  Moved BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS to config.hpp.
+//             Removed unused BOOST_EXPLICIT_TARGET macro. Moved
+//             boost::detail::type to boost/type.hpp. Made it compile with
+//             stock gcc again (Dave Abrahams)
+//  29 Nov 00  Remove nested namespace cast, cleanup spacing before Formal
+//             Review (Beman Dawes)
+//  19 Oct 00  Fix numeric_cast for floating-point types (Dave Abrahams)
+//  15 Jul 00  Suppress numeric_cast warnings for GCC, Borland and MSVC
+//             (Dave Abrahams)
+//  30 Jun 00  More MSVC6 wordarounds.  See comments below.  (Dave Abrahams)
+//  28 Jun 00  Removed implicit_cast<>.  See comment below. (Beman Dawes)
+//  27 Jun 00  More MSVC6 workarounds
+//  15 Jun 00  Add workarounds for MSVC6
+//   2 Feb 00  Remove bad_numeric_cast ";" syntax error (Doncho Angelov)
+//  26 Jan 00  Add missing throw() to bad_numeric_cast::what(0 (Adam Levar)
+//  29 Dec 99  Change using declarations so usages in other namespaces work
+//             correctly (Dave Abrahams)
+//  23 Sep 99  Change polymorphic_downcast assert to also detect M.I. errors
+//             as suggested Darin Adler and improved by Valentin Bonnard.
+//   2 Sep 99  Remove controversial asserts, simplify, rename.
+//  30 Aug 99  Move to cast.hpp, replace value_cast with numeric_cast,
+//             place in nested namespace.
+//   3 Aug 99  Initial version
+
+#ifndef BOOST_POLYMORPHIC_CAST_HPP
+#define BOOST_POLYMORPHIC_CAST_HPP
+
+# include <boost/config.hpp>
+# include <boost/assert.hpp>
+# include <boost/throw_exception.hpp>
+# include <typeinfo>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+namespace boost
+{
+//  See the documentation for descriptions of how to choose between
+//  static_cast<>, dynamic_cast<>, polymorphic_cast<> and polymorphic_downcast<>
+
+//  polymorphic_cast  --------------------------------------------------------//
+
+    //  Runtime checked polymorphic downcasts and crosscasts.
+    //  Suggested in The C++ Programming Language, 3rd Ed, Bjarne Stroustrup,
+    //  section 15.8 exercise 1, page 425.
+
+    template <class Target, class Source>
+    inline Target polymorphic_cast(Source* x)
+    {
+        Target tmp = dynamic_cast<Target>(x);
+        if ( tmp == 0 ) boost::throw_exception( std::bad_cast() );
+        return tmp;
+    }
+
+//  polymorphic_downcast  ----------------------------------------------------//
+
+    //  BOOST_ASSERT() checked polymorphic downcast.  Crosscasts prohibited.
+
+    //  WARNING: Because this cast uses BOOST_ASSERT(), it violates
+    //  the One Definition Rule if used in multiple translation units
+    //  where BOOST_DISABLE_ASSERTS, BOOST_ENABLE_ASSERT_HANDLER
+    //  NDEBUG are defined inconsistently.
+
+    //  Contributed by Dave Abrahams
+
+    template <class Target, class Source>
+    inline Target polymorphic_downcast(Source* x)
+    {
+        BOOST_ASSERT( dynamic_cast<Target>(x) == x );  // detect logic error
+        return static_cast<Target>(x);
+    }
+
+} // namespace boost
+
+#endif  // BOOST_POLYMORPHIC_CAST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/polymorphic_pointer_cast.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,78 @@
+//  boost polymorphic_pointer_cast.hpp header file  ----------------------------------------------//
+//  (C) Copyright Boris Rasin and Antony Polukhin 2014-2015.
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/conversion for Documentation.
+
+#ifndef BOOST_CONVERSION_POLYMORPHIC_POINTER_CAST_HPP
+#define BOOST_CONVERSION_POLYMORPHIC_POINTER_CAST_HPP
+
+# include <boost/config.hpp>
+# include <boost/assert.hpp>
+# include <boost/pointer_cast.hpp>
+# include <boost/throw_exception.hpp>
+# include <boost/utility/declval.hpp>
+# ifdef BOOST_NO_CXX11_DECLTYPE
+#   include <boost/typeof/typeof.hpp>
+# endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#   pragma once
+#endif
+
+namespace boost
+{
+//  See the documentation for descriptions of how to choose between
+//  static_pointer_cast<>, dynamic_pointer_cast<>, polymorphic_pointer_cast<> and polymorphic_pointer_downcast<>
+
+//  polymorphic_pointer_downcast  --------------------------------------------//
+
+    //  BOOST_ASSERT() checked polymorphic downcast.  Crosscasts prohibited.
+    //  Supports any type with static_pointer_cast/dynamic_pointer_cast functions:
+    //  built-in pointers, std::shared_ptr, boost::shared_ptr, boost::intrusive_ptr, etc.
+
+    //  WARNING: Because this cast uses BOOST_ASSERT(), it violates
+    //  the One Definition Rule if used in multiple translation units
+    //  where BOOST_DISABLE_ASSERTS, BOOST_ENABLE_ASSERT_HANDLER
+    //  NDEBUG are defined inconsistently.
+
+    //  Contributed by Boris Rasin
+
+    namespace detail
+    {
+        template <typename Target, typename Source>
+        struct dynamic_pointer_cast_result
+        {
+#ifdef BOOST_NO_CXX11_DECLTYPE
+            BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, dynamic_pointer_cast<Target>(boost::declval<Source>()))
+            typedef typename nested::type type;
+#else
+            typedef decltype(dynamic_pointer_cast<Target>(boost::declval<Source>())) type;
+#endif
+        };
+    }
+
+    template <typename Target, typename Source>
+    inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
+    polymorphic_pointer_downcast (const Source& x)
+    {
+        BOOST_ASSERT(dynamic_pointer_cast<Target> (x) == x);
+        return static_pointer_cast<Target> (x);
+    }
+
+    template <typename Target, typename Source>
+    inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
+    polymorphic_pointer_cast (const Source& x)
+    {
+        typename detail::dynamic_pointer_cast_result<Target, Source>::type tmp
+            = dynamic_pointer_cast<Target> (x);
+        if ( !tmp ) boost::throw_exception( std::bad_cast() );
+
+        return tmp;
+    }
+
+} // namespace boost
+
+#endif  // BOOST_CONVERSION_POLYMORPHIC_POINTER_CAST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/detail/comp_detected.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,10 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_DETAIL_COMP_DETECTED
+#define BOOST_PREDEF_DETAIL_COMP_DETECTED 1
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/detail/platform_detected.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,10 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_DETAIL_PLAT_DETECTED
+#define BOOST_PREDEF_DETAIL_PLAT_DETECTED 1
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/os/haiku.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+/*
+Copyright Jessica Hamilton 2014
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_OS_HAIKU_H
+#define BOOST_PREDEF_OS_HAIKU_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+
+/*`
+[heading `BOOST_OS_HAIKU`]
+
+[@http://en.wikipedia.org/wiki/Haiku_(operating_system) Haiku] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__HAIKU__`] [__predef_detection__]]
+    ]
+ */
+
+#define BOOST_OS_HAIKU BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(BOOST_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__HAIKU__) \
+    )
+#   undef BOOST_OS_HAIKU
+#   define BOOST_OS_HAIKU BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if BOOST_OS_HAIKU
+#   define BOOST_OS_HAIKU_AVAILABLE
+#   include <boost/predef/detail/os_detected.h>
+#endif
+
+#define BOOST_OS_HAIKU_NAME "Haiku"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_OS_HAIKU,BOOST_OS_HAIKU_NAME)
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/os/ios.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+/*
+Copyright Franz Detro 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_OS_IOS_H
+#define BOOST_PREDEF_OS_IOS_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+
+/*`
+[heading `BOOST_OS_IOS`]
+
+[@http://en.wikipedia.org/wiki/iOS iOS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__APPLE__`] [__predef_detection__]]
+    [[`__MACH__`] [__predef_detection__]]
+    [[`__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__`] [__predef_detection__]]
+
+    [[`__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__`] [__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000]]
+    ]
+ */
+
+#define BOOST_OS_IOS BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(BOOST_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__APPLE__) && defined(__MACH__) && \
+    defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) \
+    )
+#   undef BOOST_OS_IOS
+#   define BOOST_OS_IOS (__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000)
+#endif
+
+#if BOOST_OS_IOS
+#   define BOOST_OS_IOS_AVAILABLE
+#   include <boost/predef/detail/os_detected.h>
+#endif
+
+#define BOOST_OS_IOS_NAME "iOS"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_OS_IOS,BOOST_OS_IOS_NAME)
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/platform/windows_desktop.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_PLAT_WINDOWS_DESKTOP_H
+#define BOOST_PREDEF_PLAT_WINDOWS_DESKTOP_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+#include <boost/predef/os/windows.h>
+
+/*`
+[heading `BOOST_PLAT_WINDOWS_DESKTOP`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`!WINAPI_FAMILY`] [__predef_detection__]]
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define BOOST_PLAT_WINDOWS_DESKTOP BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if BOOST_OS_WINDOWS && \
+    ( !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) )
+#   undef BOOST_PLAT_WINDOWS_DESKTOP
+#   define BOOST_PLAT_WINDOWS_DESKTOP BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if BOOST_PLAT_WINDOWS_DESKTOP
+#   define BOOST_PLAT_WINDOWS_DESKTOP_AVALIABLE
+#   include <boost/predef/detail/platform_detected.h>
+#endif
+
+#define BOOST_PLAT_WINDOWS_DESKTOP_NAME "Windows Desktop"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_DESKTOP,BOOST_PLAT_WINDOWS_DESKTOP_NAME)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/platform/windows_phone.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_PLAT_WINDOWS_PHONE_H
+#define BOOST_PREDEF_PLAT_WINDOWS_PHONE_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+#include <boost/predef/os/windows.h>
+
+/*`
+[heading `BOOST_PLAT_WINDOWS_PHONE`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define BOOST_PLAT_WINDOWS_PHONE BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
+#   undef BOOST_PLAT_WINDOWS_PHONE
+#   define BOOST_PLAT_WINDOWS_PHONE BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if BOOST_PLAT_WINDOWS_PHONE
+#   define BOOST_PLAT_WINDOWS_PHONE_AVALIABLE
+#   include <boost/predef/detail/platform_detected.h>
+#endif
+
+#define BOOST_PLAT_WINDOWS_PHONE_NAME "Windows Phone"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_PHONE,BOOST_PLAT_WINDOWS_PHONE_NAME)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/platform/windows_runtime.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_PLAT_WINDOWS_RUNTIME_H
+#define BOOST_PREDEF_PLAT_WINDOWS_RUNTIME_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+#include <boost/predef/os/windows.h>
+
+/*`
+[heading `BOOST_PLAT_WINDOWS_RUNTIME`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define BOOST_PLAT_WINDOWS_RUNTIME BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && \
+    ( WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP )
+#   undef BOOST_PLAT_WINDOWS_RUNTIME
+#   define BOOST_PLAT_WINDOWS_RUNTIME BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if BOOST_PLAT_WINDOWS_RUNTIME
+#   define BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE
+#   include <boost/predef/detail/platform_detected.h>
+#endif
+
+#define BOOST_PLAT_WINDOWS_RUNTIME_NAME "Windows Runtime"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_RUNTIME,BOOST_PLAT_WINDOWS_RUNTIME_NAME)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/platform/windows_store.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_PLAT_WINDOWS_STORE_H
+#define BOOST_PREDEF_PLAT_WINDOWS_STORE_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+#include <boost/predef/os/windows.h>
+
+/*`
+[heading `BOOST_PLAT_WINDOWS_STORE`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define BOOST_PLAT_WINDOWS_STORE BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
+#   undef BOOST_PLAT_WINDOWS_STORE
+#   define BOOST_PLAT_WINDOWS_STORE BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if BOOST_PLAT_WINDOWS_STORE
+#   define BOOST_PLAT_WINDOWS_STORE_AVALIABLE
+#   include <boost/predef/detail/platform_detected.h>
+#endif
+
+#define BOOST_PLAT_WINDOWS_STORE_NAME "Windows Store"
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_STORE,BOOST_PLAT_WINDOWS_STORE_NAME)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/predef/version.h	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_VERSION_H
+#define BOOST_PREDEF_VERSION_H
+
+#include <boost/predef/version_number.h>
+
+#define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,2,0)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/array/detail/get_data.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP
+# define BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/facilities/is_1.hpp>
+#
+# /* BOOST_PP_ARRAY_DETAIL_GET_DATA */
+#
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA_NONE(size, data)
+
+# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)
+# 	 if BOOST_PP_VARIADICS_MSVC
+# 		define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_DEFAULT(size, data) BOOST_PP_TUPLE_REM(size) data
+# 		define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_CAT(size, data) BOOST_PP_TUPLE_REM_CAT(size) data
+# 		define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) \
+			BOOST_PP_IIF \
+				( \
+				BOOST_PP_IS_1(size), \
+				BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_CAT, \
+				BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_DEFAULT \
+				) \
+			(size,data) \
+/**/
+#    else
+# 		define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) BOOST_PP_TUPLE_REM(size) data
+#    endif
+# else
+# 	 define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) BOOST_PP_TUPLE_REM(size) data
+# endif
+
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA(size, data) \
+	BOOST_PP_IF \
+		( \
+		size, \
+		BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY, \
+		BOOST_PP_ARRAY_DETAIL_GET_DATA_NONE \
+		) \
+	(size,data) \
+/**/
+#
+# endif /* BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/facilities/detail/is_empty.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP
+#define BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP
+
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+
+#if BOOST_PP_VARIADICS_MSVC
+
+# pragma warning(once:4002)
+
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, b) b
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, b) t
+
+#else
+
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, ...) t
+
+#endif
+
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(param) \
+	BOOST_PP_IS_BEGIN_PARENS \
+    	( \
+        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \
+        ) \
+/**/
+
+#else
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(...) \
+	BOOST_PP_IS_BEGIN_PARENS \
+        ( \
+        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
+        ) \
+/**/
+
+#endif
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF(bit) BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_PP_DETAIL_IS_EMPTY_IIF_,bit)
+#define BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()
+
+#endif /* BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/facilities/is_empty_variadic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,57 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+# include <boost/preprocessor/facilities/detail/is_empty.hpp>
+#
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+#
+#define BOOST_PP_IS_EMPTY(param) \
+    BOOST_PP_DETAIL_IS_EMPTY_IIF \
+      ( \
+      BOOST_PP_IS_BEGIN_PARENS \
+        ( \
+        param \
+        ) \
+      ) \
+      ( \
+      BOOST_PP_IS_EMPTY_ZERO, \
+      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \
+      ) \
+    (param) \
+/**/
+#define BOOST_PP_IS_EMPTY_ZERO(param) 0
+# else
+#define BOOST_PP_IS_EMPTY(...) \
+    BOOST_PP_DETAIL_IS_EMPTY_IIF \
+      ( \
+      BOOST_PP_IS_BEGIN_PARENS \
+        ( \
+        __VA_ARGS__ \
+        ) \
+      ) \
+      ( \
+      BOOST_PP_IS_EMPTY_ZERO, \
+      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \
+      ) \
+    (__VA_ARGS__) \
+/**/
+#define BOOST_PP_IS_EMPTY_ZERO(...) 0
+# endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */
+# endif /* BOOST_PP_VARIADICS */
+# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/punctuation/detail/is_begin_parens.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP
+#define BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP
+
+#if BOOST_PP_VARIADICS_MSVC
+
+#include <boost/preprocessor/facilities/empty.hpp>
+
+#define BOOST_PP_DETAIL_VD_IBP_CAT(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b)
+#define BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_II(a ## b)
+#define BOOST_PP_DETAIL_VD_IBP_CAT_II(res) res
+
+#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \
+    BOOST_PP_DETAIL_VD_IBP_CAT(BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__),BOOST_PP_EMPTY()) \
+/**/
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1 1
+
+#else
+
+#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \
+    BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__) \
+/**/
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1
+
+#endif /* BOOST_PP_VARIADICS_MSVC */
+
+#define BOOST_PP_DETAIL_IBP_SPLIT_0(a, ...) a
+#define BOOST_PP_DETAIL_IBP_SPLIT_1(a, ...) __VA_ARGS__
+
+#define BOOST_PP_DETAIL_IBP_CAT(a, ...) BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a,__VA_ARGS__)
+#define BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_1 1,
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_BOOST_PP_DETAIL_IBP_IS_VARIADIC_C 0,
+
+#endif /* BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/punctuation/is_begin_parens.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP
+# define BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP
+
+# include <boost/preprocessor/config/config.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/punctuation/detail/is_begin_parens.hpp>
+
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+
+#define BOOST_PP_IS_BEGIN_PARENS(param) \
+    BOOST_PP_DETAIL_IBP_SPLIT \
+      ( \
+      0, \
+      BOOST_PP_DETAIL_IBP_CAT \
+        ( \
+        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \
+        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C param \
+        ) \
+      ) \
+/**/
+
+#else
+
+#define BOOST_PP_IS_BEGIN_PARENS(...) \
+    BOOST_PP_DETAIL_IBP_SPLIT \
+      ( \
+      0, \
+      BOOST_PP_DETAIL_IBP_CAT \
+        ( \
+        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \
+        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C __VA_ARGS__ \
+        ) \
+      ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/punctuation/remove_parens.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,39 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_REMOVE_PARENS_HPP
+#define BOOST_PREPROCESSOR_REMOVE_PARENS_HPP
+
+#include <boost/preprocessor/config/config.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/enum.hpp>
+
+#define BOOST_PP_REMOVE_PARENS(param) \
+    BOOST_PP_IIF \
+      ( \
+      BOOST_PP_IS_BEGIN_PARENS(param), \
+      BOOST_PP_REMOVE_PARENS_DO, \
+      BOOST_PP_IDENTITY \
+      ) \
+    (param)() \
+/**/
+
+#define BOOST_PP_REMOVE_PARENS_DO(param) \
+  BOOST_PP_IDENTITY(BOOST_PP_TUPLE_ENUM(param)) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_PREPROCESSOR_REMOVE_PARENS_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/seq/variadic_seq_to_seq.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Paul Mensonides 2012.                                  *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_SEQ_VARIADIC_SEQ_TO_SEQ_HPP
+# define BOOST_PREPROCESSOR_SEQ_VARIADIC_SEQ_TO_SEQ_HPP
+#
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_VARIADIC_SEQ_TO_SEQ */
+#
+# if BOOST_PP_VARIADICS
+#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ(vseq) BOOST_PP_CAT(BOOST_PP_VARIADIC_SEQ_TO_SEQ_A vseq, 0)
+#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_A(...) ((__VA_ARGS__)) BOOST_PP_VARIADIC_SEQ_TO_SEQ_B
+#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_B(...) ((__VA_ARGS__)) BOOST_PP_VARIADIC_SEQ_TO_SEQ_A
+#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_A0
+#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_B0
+# endif
+#
+# endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/detail/is_single_return.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP
+# define BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_TUPLE_IS_SINGLE_RETURN */
+#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/facilities/is_1.hpp>
+# include <boost/preprocessor/tuple/size.hpp>
+# define BOOST_PP_TUPLE_IS_SINGLE_RETURN(sr,nsr,tuple)	\
+	BOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_TUPLE_SIZE(tuple)),sr,nsr) \
+	/**/
+# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */
+#
+# endif /* BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/insert.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,37 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_INSERT_HPP
+# define BOOST_PREPROCESSOR_TUPLE_INSERT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/insert.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+# /* BOOST_PP_TUPLE_INSERT */
+#
+# define BOOST_PP_TUPLE_INSERT(tuple, i, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_INSERT(BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \
+/**/
+#
+# /* BOOST_PP_TUPLE_INSERT_D */
+#
+# define BOOST_PP_TUPLE_INSERT_D(d, tuple, i, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_INSERT_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \
+/**/
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_INSERT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/pop_back.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP
+# define BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/pop_back.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/comparison/greater.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/tuple/size.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+# /* BOOST_PP_TUPLE_POP_BACK */
+#
+# define BOOST_PP_TUPLE_POP_BACK(tuple) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \
+		BOOST_PP_TUPLE_POP_BACK_EXEC, \
+		BOOST_PP_TUPLE_POP_BACK_RETURN \
+		) \
+	(tuple) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_BACK_EXEC(tuple) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_BACK(BOOST_PP_TUPLE_TO_ARRAY(tuple))) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_BACK_RETURN(tuple) tuple
+#
+# /* BOOST_PP_TUPLE_POP_BACK_Z */
+#
+# define BOOST_PP_TUPLE_POP_BACK_Z(z, tuple) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \
+		BOOST_PP_TUPLE_POP_BACK_Z_EXEC, \
+		BOOST_PP_TUPLE_POP_BACK_Z_RETURN \
+		) \
+	(z, tuple) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_BACK_Z_EXEC(z, tuple) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_BACK_Z(z, BOOST_PP_TUPLE_TO_ARRAY(tuple))) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_BACK_Z_RETURN(z, tuple) tuple
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/pop_front.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP
+# define BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/pop_front.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/comparison/greater.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/tuple/size.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+#
+# /* BOOST_PP_TUPLE_POP_FRONT */
+#
+# define BOOST_PP_TUPLE_POP_FRONT(tuple) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \
+		BOOST_PP_TUPLE_POP_FRONT_EXEC, \
+		BOOST_PP_TUPLE_POP_FRONT_RETURN \
+		) \
+	(tuple) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_FRONT_EXEC(tuple) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_FRONT(BOOST_PP_TUPLE_TO_ARRAY(tuple))) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_FRONT_RETURN(tuple) tuple
+#
+# /* BOOST_PP_TUPLE_POP_FRONT_Z */
+#
+# define BOOST_PP_TUPLE_POP_FRONT_Z(z, tuple) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \
+		BOOST_PP_TUPLE_POP_FRONT_Z_EXEC, \
+		BOOST_PP_TUPLE_POP_FRONT_Z_RETURN \
+		) \
+	(z, tuple) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_FRONT_Z_EXEC(z, tuple) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_FRONT_Z(z, BOOST_PP_TUPLE_TO_ARRAY(tuple))) \
+/**/
+#
+# define BOOST_PP_TUPLE_POP_FRONT_Z_RETURN(z, tuple) tuple
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/push_back.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP
+# define BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/push_back.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+# /* BOOST_PP_TUPLE_PUSH_BACK */
+#
+# define BOOST_PP_TUPLE_PUSH_BACK(tuple, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_PUSH_BACK(BOOST_PP_TUPLE_TO_ARRAY(tuple), elem)) \
+/**/
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/push_front.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP
+# define BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/push_front.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+#
+# /* BOOST_PP_TUPLE_PUSH_FRONT */
+#
+# define BOOST_PP_TUPLE_PUSH_FRONT(tuple, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_PUSH_FRONT(BOOST_PP_TUPLE_TO_ARRAY(tuple), elem)) \
+/**/
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/remove.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP
+# define BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/remove.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/comparison/greater.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/tuple/size.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+# /* BOOST_PP_TUPLE_REMOVE */
+#
+# define BOOST_PP_TUPLE_REMOVE(tuple, i) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \
+		BOOST_PP_TUPLE_REMOVE_EXEC, \
+		BOOST_PP_TUPLE_REMOVE_RETURN \
+		) \
+	(tuple, i) \
+/**/
+#
+# define BOOST_PP_TUPLE_REMOVE_EXEC(tuple, i) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REMOVE(BOOST_PP_TUPLE_TO_ARRAY(tuple), i)) \
+/**/
+#
+# define BOOST_PP_TUPLE_REMOVE_RETURN(tuple, i) tuple
+#
+# /* BOOST_PP_TUPLE_REMOVE_D */
+#
+# define BOOST_PP_TUPLE_REMOVE_D(d, tuple, i) \
+	BOOST_PP_IIF \
+		( \
+		BOOST_PP_GREATER_D(d, BOOST_PP_TUPLE_SIZE(tuple), 1), \
+		BOOST_PP_TUPLE_REMOVE_D_EXEC, \
+		BOOST_PP_TUPLE_REMOVE_D_RETURN \
+		) \
+	(d, tuple, i) \
+/**/
+#
+# define BOOST_PP_TUPLE_REMOVE_D_EXEC(d, tuple, i) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REMOVE_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i)) \
+/**/
+#
+# define BOOST_PP_TUPLE_REMOVE_D_RETURN(d, tuple, i) tuple
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/tuple/replace.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,37 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2013.
+#  *     Distributed under the Boost Software License, Version 1.0. (See
+#  *     accompanying file LICENSE_1_0.txt or copy at
+#  *     http://www.boost.org/LICENSE_1_0.txt)
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP
+# define BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# if BOOST_PP_VARIADICS
+#
+# include <boost/preprocessor/array/replace.hpp>
+# include <boost/preprocessor/array/to_tuple.hpp>
+# include <boost/preprocessor/tuple/to_array.hpp>
+#
+# /* BOOST_PP_TUPLE_REPLACE */
+#
+# define BOOST_PP_TUPLE_REPLACE(tuple, i, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REPLACE(BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \
+/**/
+#
+# /* BOOST_PP_TUPLE_REPLACE_D */
+#
+# define BOOST_PP_TUPLE_REPLACE_D(d, tuple, i, elem) \
+	BOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REPLACE_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \
+/**/
+#
+# endif // BOOST_PP_VARIADICS
+#
+# endif // BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/preprocessor/variadic/detail/is_single_return.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+#  *                                                                          *
+#  *     (C) Copyright Edward Diener 2014.                                    *
+#  *     Distributed under the Boost Software License, Version 1.0. (See      *
+#  *     accompanying file LICENSE_1_0.txt or copy at                         *
+#  *     http://www.boost.org/LICENSE_1_0.txt)                                *
+#  *                                                                          *
+#  ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP
+#
+# include <boost/preprocessor/config/config.hpp>
+#
+# /* BOOST_PP_VARIADIC_IS_SINGLE_RETURN */
+#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/facilities/is_1.hpp>
+# include <boost/preprocessor/variadic/size.hpp>
+# define BOOST_PP_VARIADIC_IS_SINGLE_RETURN(sr,nsr,...)	\
+	BOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)),sr,nsr) \
+	/**/
+# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */
+#
+# endif /* BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/basic_reduce.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,38 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_PARALLEL_BASIC_REDUCE_HPP
+#define BOOST_PARALLEL_BASIC_REDUCE_HPP
+
+namespace boost { namespace parallel {
+
+/** Reduction operation used to reconcile differences between local
+ * and remote values for a particular key in a property map.  The
+ * type @c T is typically the @c value_type of the property
+ * map. This basic reduction returns a default-constructed @c T as
+ * the default value and always resolves to the remote value.
+ */
+template<typename T>
+struct basic_reduce
+{
+  BOOST_STATIC_CONSTANT(bool, non_default_resolver = false);
+
+  /// Returns a default-constructed T object
+  template<typename Key>
+  T operator()(const Key&) const { return T(); }
+  
+  /// Returns the remote value
+  template<typename Key>
+  const T& operator()(const Key&, const T&, const T& remote) const 
+  { return remote; }
+};
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_PARALLEL_BASIC_REDUCE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/detail/untracked_pair.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,81 @@
+// Copyright (C) 2007 Matthias Troyer
+//
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//
+// This file contains helper data structures for use in transmitting
+// properties. The basic idea is to optimize away any storage for the
+// properties when no properties are specified.
+#ifndef BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
+#define BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
+
+#include <boost/mpi/datatype.hpp>
+#include <utility> // for std::pair
+#include <boost/serialization/utility.hpp>
+
+namespace boost { namespace parallel { namespace detail {
+
+/**
+ * This structure is like std::pair, with the only difference
+ * that tracking in the serialization library is turned off.
+ */
+ 
+template<typename T, typename U>
+struct untracked_pair : public std::pair<T,U>
+{
+  untracked_pair() {}
+
+  untracked_pair(const T& t, const U& u)
+  : std::pair<T,U>(t,u) {}
+
+  template<class T1, class U1>
+  untracked_pair(std::pair<T1,U1> const& p)
+  : std::pair<T,U>(p) {}  
+};
+
+template<typename T, typename U>
+inline untracked_pair<T, U>
+make_untracked_pair(const T& t, const U& u)
+{
+  return untracked_pair<T,U>(t,u);
+}
+
+} } } // end namespace boost::parallel::detail
+
+namespace boost { namespace mpi {
+
+template<typename T, typename U>
+struct is_mpi_datatype<boost::parallel::detail::untracked_pair<T, U> >
+  : is_mpi_datatype<std::pair<T,U> > {};
+
+} } // end namespace boost::mpi
+
+namespace boost { namespace serialization {
+
+// pair
+template<class Archive, class F, class S>
+inline void serialize(
+    Archive & ar,
+    boost::parallel::detail::untracked_pair<F, S> & p,
+    const unsigned int /* file_version */
+){
+    ar & boost::serialization::make_nvp("first", p.first);
+    ar & boost::serialization::make_nvp("second", p.second);
+}
+
+template<typename T, typename U>
+struct is_bitwise_serializable<
+        boost::parallel::detail::untracked_pair<T, U> >
+  : is_bitwise_serializable<std::pair<T, U> > {};
+
+template<typename T, typename U>
+struct implementation_level<boost::parallel::detail::untracked_pair<T, U> >
+ : mpl::int_<object_serializable> {} ;
+
+template<typename T, typename U>
+struct tracking_level<boost::parallel::detail::untracked_pair<T, U> >
+ : mpl::int_<track_never> {} ;
+
+} } // end namespace boost::serialization
+
+#endif // BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/parallel_property_maps.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,233 @@
+//  (C) Copyright Jeremy Siek 1999-2001.
+//  Copyright (C) 2006 Trustees of Indiana University
+//  Authors: Douglas Gregor and Jeremy Siek
+
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/property_map for documentation.
+
+#ifndef BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP
+#define BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP
+
+// Parallel property maps moved over from <boost/property_map/property_map.hpp>
+// as part of refactoring out all parallel code from sequential property map
+// library.
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <cstddef>
+#include <boost/detail/iterator.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/concept_archetype.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/property_map/property_map.hpp>
+
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+
+namespace boost {
+/** Distributed iterator property map.
+ *
+ * This specialization of @ref iterator_property_map builds a
+ * distributed iterator property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class iterator_property_map
+        <RandomAccessIterator, 
+         local_property_map<ProcessGroup, GlobalMap, StorageMap>,
+         ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap, 
+              iterator_property_map<RandomAccessIterator, StorageMap,
+                                    ValueType, Reference> >
+{
+  typedef iterator_property_map<RandomAccessIterator, StorageMap, 
+                                ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap>
+    index_map_type;
+  typedef iterator_property_map self_type;
+
+public:
+  iterator_property_map() { }
+
+  iterator_property_map(RandomAccessIterator cc, const index_map_type& id)
+    : inherited(id.process_group(), id.global(), 
+                local_iterator_map(cc, id.base())) { }
+};
+
+/** Distributed iterator property map.
+ *
+ * This specialization of @ref iterator_property_map builds a
+ * distributed iterator property map given a distributed index
+ * map. Only the local portion of the distributed index property map
+ * is utilized.
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class iterator_property_map<
+        RandomAccessIterator, 
+        parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>,
+        ValueType, Reference
+      >
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              iterator_property_map<RandomAccessIterator, StorageMap,
+                                    ValueType, Reference> >
+{
+  typedef iterator_property_map<RandomAccessIterator, StorageMap,
+                                ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  iterator_property_map() { }
+
+  iterator_property_map(RandomAccessIterator cc, const index_map_type& id)
+    : inherited(id.process_group(), id.global(),
+                local_iterator_map(cc, id.base())) { }
+};
+
+namespace parallel {
+// Generate an iterator property map with a specific kind of ghost
+// cells
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap>
+distributed_property_map<ProcessGroup, 
+                         GlobalMap,
+                         iterator_property_map<RandomAccessIterator, 
+                                               StorageMap> >
+make_iterator_property_map(RandomAccessIterator cc,
+                           local_property_map<ProcessGroup, GlobalMap, 
+                                              StorageMap> index_map)
+{
+  typedef distributed_property_map<
+            ProcessGroup, GlobalMap,
+            iterator_property_map<RandomAccessIterator, StorageMap> >
+    result_type;
+  return result_type(index_map.process_group(), index_map.global(),
+                     make_iterator_property_map(cc, index_map.base()));
+}
+
+} // end namespace parallel
+
+/** Distributed safe iterator property map.
+ *
+ * This specialization of @ref safe_iterator_property_map builds a
+ * distributed iterator property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, typename ValueType,
+         typename Reference>
+class safe_iterator_property_map
+        <RandomAccessIterator, 
+         local_property_map<ProcessGroup, GlobalMap, StorageMap>,
+         ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                         ValueType, Reference> >
+{
+  typedef safe_iterator_property_map<RandomAccessIterator, StorageMap, 
+                                     ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> index_map_type;
+
+public:
+  safe_iterator_property_map() { }
+
+  safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, 
+                             const index_map_type& id)
+    : inherited(id.process_group(), id.global(),
+                local_iterator_map(cc, n, id.base())) { }
+};
+
+/** Distributed safe iterator property map.
+ *
+ * This specialization of @ref safe_iterator_property_map builds a
+ * distributed iterator property map given a distributed index
+ * map. Only the local portion of the distributed index property map
+ * is utilized.
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class safe_iterator_property_map<
+        RandomAccessIterator, 
+        parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>,
+        ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                         ValueType, Reference> >
+{
+  typedef safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                     ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  safe_iterator_property_map() { }
+
+  safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, 
+                             const index_map_type& id)
+    : inherited(id.process_group(), id.global(), 
+                local_iterator_map(cc, n, id.base())) { }
+};                                            
+
+}
+
+#include <boost/property_map/vector_property_map.hpp>
+
+#endif /* BOOST_PROPERTY_MAP_PARALLEL_PROPERTY_MAPS_HPP */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/process_group.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,97 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_PROPERTY_MAP_PARALLEL_PROCESS_GROUP_HPP
+#define BOOST_PROPERTY_MAP_PARALLEL_PROCESS_GROUP_HPP
+
+#include <cstdlib>
+#include <utility>
+
+namespace boost { namespace parallel {
+
+/**
+ * A special type used as a flag to a process group constructor that
+ * indicates that the copy of a process group will represent a new
+ * distributed data structure.
+ */
+struct attach_distributed_object { };
+
+/**
+ * Describes the context in which a trigger is being invoked to
+ * receive a message.
+ */
+enum trigger_receive_context {
+  /// No trigger is active at this time.
+  trc_none,
+  /// The trigger is being invoked during synchronization, at the end
+  /// of a superstep.
+  trc_in_synchronization,
+  /// The trigger is being invoked as an "early" receive of a message
+  /// that was sent through the normal "send" operations to be
+  /// received by the end of the superstep, but the process group sent
+  /// the message earlier to clear its buffers.
+  trc_early_receive,
+  /// The trigger is being invoked for an out-of-band message, which
+  /// must be handled immediately.
+  trc_out_of_band,
+  /// The trigger is being invoked for an out-of-band message, which
+  /// must be handled immediately and has alredy been received by 
+  /// an MPI_IRecv call.
+  trc_irecv_out_of_band  
+};
+
+// Process group tags
+struct process_group_tag {};
+struct linear_process_group_tag : virtual process_group_tag {};
+struct messaging_process_group_tag : virtual process_group_tag {};
+struct immediate_process_group_tag : virtual messaging_process_group_tag {};
+struct bsp_process_group_tag : virtual messaging_process_group_tag {};
+struct batch_process_group_tag : virtual messaging_process_group_tag {};
+struct locking_process_group_tag : virtual process_group_tag {};
+struct spawning_process_group_tag : virtual process_group_tag {};
+
+struct process_group_archetype
+{
+  typedef int process_id_type;
+};
+
+void wait(process_group_archetype&);
+void synchronize(process_group_archetype&);
+int process_id(const process_group_archetype&);
+int num_processes(const process_group_archetype&);
+
+template<typename T> void send(process_group_archetype&, int, int, const T&);
+
+template<typename T>
+process_group_archetype::process_id_type
+receive(const process_group_archetype& pg,
+        process_group_archetype::process_id_type source, int tag, T& value);
+
+template<typename T>
+std::pair<process_group_archetype::process_id_type, std::size_t>
+receive(const process_group_archetype& pg, int tag, T values[], std::size_t n);
+
+template<typename T>
+std::pair<process_group_archetype::process_id_type, std::size_t>
+receive(const process_group_archetype& pg,
+        process_group_archetype::process_id_type source, int tag, T values[],
+        std::size_t n);
+
+} } // end namespace boost::parallel
+
+namespace boost { namespace graph { namespace distributed {
+  using boost::parallel::trigger_receive_context;
+  using boost::parallel::trc_early_receive;
+  using boost::parallel::trc_out_of_band;
+  using boost::parallel::trc_irecv_out_of_band;
+  using boost::parallel::trc_in_synchronization;
+  using boost::parallel::trc_none;
+  using boost::parallel::attach_distributed_object;
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_PROPERTY_MAP_PARALLEL_PROCESS_GROUP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/simple_trigger.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,106 @@
+// Copyright (C) 2007 Douglas Gregor 
+
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file contains a simplification of the "trigger" method for
+// process groups. The simple trigger handles the common case where
+// the handler associated with a trigger is a member function bound to
+// a particular pointer.
+
+#ifndef BOOST_PROPERTY_MAP_PARALLEL_SIMPLE_TRIGGER_HPP
+#define BOOST_PROPERTY_MAP_PARALLEL_SIMPLE_TRIGGER_HPP
+
+#include <boost/property_map/parallel/process_group.hpp>
+
+namespace boost { namespace parallel {
+
+namespace detail {
+
+/**
+ * INTERNAL ONLY
+ *
+ * The actual function object that bridges from the normal trigger
+ * interface to the simplified interface. This is the equivalent of
+ * bind(pmf, self, _1, _2, _3, _4), but without the compile-time
+ * overhead of bind.
+ */
+template<typename Class, typename T, typename Result>
+class simple_trigger_t 
+{
+public:
+  simple_trigger_t(Class* self, 
+                   Result (Class::*pmf)(int, int, const T&, 
+                                        trigger_receive_context))
+    : self(self), pmf(pmf) { }
+
+  Result 
+  operator()(int source, int tag, const T& data, 
+             trigger_receive_context context) const
+  {
+    return (self->*pmf)(source, tag, data, context);
+  }
+
+private:
+  Class* self;
+  Result (Class::*pmf)(int, int, const T&, trigger_receive_context);
+};
+
+} // end namespace detail
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger to a handler that is
+ * just a bound member function.
+ *
+ * INTERNAL ONLY
+ */
+template<typename ProcessGroup, typename Class, typename T>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               void (Class::*pmf)(int source, int tag, const T& data, 
+                                  trigger_receive_context context), int)
+{
+  pg.template trigger<T>(tag, 
+                         detail::simple_trigger_t<Class, T, void>(self, pmf));
+}
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger with a reply to a
+ * handler that is just a bound member function.
+ *
+ * INTERNAL ONLY
+ */
+template<typename ProcessGroup, typename Class, typename T, typename Result>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               Result (Class::*pmf)(int source, int tag, const T& data, 
+                                    trigger_receive_context context), long)
+{
+  pg.template trigger_with_reply<T>
+    (tag, detail::simple_trigger_t<Class, T, Result>(self, pmf));
+}
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger to a handler that is
+ * just a bound member function.
+ */
+template<typename ProcessGroup, typename Class, typename T, typename Result>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               Result (Class::*pmf)(int source, int tag, const T& data, 
+                                    trigger_receive_context context))
+{
+        // We pass 0 (an int) to help VC++ disambiguate calls to simple_trigger 
+        // with Result=void.
+        simple_trigger(pg, tag, self, pmf, 0); 
+}
+
+} } // end namespace boost::parallel
+
+namespace boost { namespace graph { namespace parallel { using boost::parallel::simple_trigger; } } }
+
+#endif // BOOST_PROPERTY_MAP_PARALLEL_SIMPLE_TRIGGER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/unsafe_serialize.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,81 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+// This file contains the "unsafe_serialize" routine, which transforms
+// types they may not be serializable (such as void*) into
+// serializable equivalents.
+#ifndef BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP
+#define BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP
+
+#include <boost/mpi/datatype.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits.hpp>
+#include <utility>
+
+BOOST_IS_BITWISE_SERIALIZABLE(void*)
+namespace boost { namespace mpi {
+    template<> struct is_mpi_datatype<void*> : mpl::true_ { };
+} } // end namespace boost::mpi
+
+namespace boost {
+  typedef mpl::if_c<(sizeof(int) == sizeof(void*)), 
+                    int, 
+                    mpl::if_c<(sizeof(long) == sizeof(void*)),
+                              long,
+                              mpl::if_c<(sizeof(void*) <= sizeof(boost::intmax_t)),
+                                        boost::intmax_t,
+                                        void>::type
+                              >::type
+                    >::type ptr_serialize_type;
+
+  BOOST_STATIC_ASSERT ((!boost::is_void<ptr_serialize_type>::value));
+    
+  template<typename T> inline T& unsafe_serialize(T& x) { return x; }
+
+  inline ptr_serialize_type& unsafe_serialize(void*& x)
+  { return reinterpret_cast<ptr_serialize_type&>(x); }
+
+  // Force Boost.MPI to serialize a void* like a ptr_serialize_type
+  namespace mpi {
+    template<> inline MPI_Datatype get_mpi_datatype<void*>(void* const& x)
+    {
+      return get_mpi_datatype<ptr_serialize_type>();
+    }
+  }
+
+  template<typename T, typename U>
+  struct unsafe_pair
+  {
+    unsafe_pair() { }
+    unsafe_pair(const T& t, const U& u) : first(t), second(u) { }
+    unsafe_pair(const std::pair<T, U>& p) : first(p.first), second(p.second) { }
+    T first;
+    U second;
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned /*version*/)
+    {
+      ar & unsafe_serialize(first) & unsafe_serialize(second);
+    }
+  };
+
+  template<typename T, typename U>
+  bool operator<(unsafe_pair<T,U> const& x, unsafe_pair<T,U> const& y)
+  {
+    return std::make_pair(x.first, x.second) < 
+      std::make_pair(y.first, y.second);  
+  }
+
+} // end namespace boost
+
+#endif // BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/property_map/parallel/vector_property_map.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,104 @@
+// Copyright (C) Vladimir Prus 2003.
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/graph/vector_property_map.html for
+// documentation.
+//
+
+#ifndef BOOST_PROPERTY_MAP_PARALLEL_VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
+#define BOOST_PROPERTY_MAP_PARALLEL_VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/shared_ptr.hpp>
+#include <vector>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+
+namespace boost {
+
+/** Distributed vector property map.
+ *
+ * This specialization of @ref vector_property_map builds a
+ * distributed vector property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename T, typename ProcessGroup, typename GlobalMap, 
+         typename StorageMap>
+class vector_property_map<T, 
+                          local_property_map<ProcessGroup, GlobalMap,
+                                             StorageMap> >
+  : public parallel::distributed_property_map<
+             ProcessGroup, GlobalMap, vector_property_map<T, StorageMap> >
+{
+  typedef vector_property_map<T, StorageMap> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> index_map_type;
+
+public:
+  vector_property_map(const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(index.base())) { }
+
+  vector_property_map(unsigned inital_size, 
+                      const index_map_type& index = index_map_type())
+    : inherited(index.process_group(),  index.global(),
+                local_iterator_map(inital_size, index.base())) { }
+};
+
+/** Distributed vector property map.
+ *
+ * This specialization of @ref vector_property_map builds a
+ * distributed vector property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename T, typename ProcessGroup, typename GlobalMap, 
+         typename StorageMap>
+class vector_property_map<
+        T, 
+        parallel::distributed_property_map<
+          ProcessGroup,
+          GlobalMap,
+          StorageMap
+        >
+      > 
+  : public parallel::distributed_property_map<
+             ProcessGroup, GlobalMap, vector_property_map<T, StorageMap> >
+{
+  typedef vector_property_map<T, StorageMap> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  vector_property_map(const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(index.base())) { }
+
+  vector_property_map(unsigned inital_size, 
+                      const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(inital_size, index.base())) { }
+};
+
+}
+
+#endif // BOOST_PROPERTY_MAP_PARALLEL_VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/random/beta_distribution.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,184 @@
+/* boost random/beta_distribution.hpp header file
+ *
+ * Copyright Steven Watanabe 2014
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_BETA_DISTRIBUTION_HPP
+#define BOOST_RANDOM_BETA_DISTRIBUTION_HPP
+
+#include <cassert>
+#include <istream>
+#include <iosfwd>
+#include <boost/random/detail/operators.hpp>
+#include <boost/random/gamma_distribution.hpp>
+
+namespace boost {
+namespace random {
+
+/**
+ * The beta distribution is a real-valued distribution which produces
+ * values in the range [0, 1].  It has two parameters, alpha and beta.
+ *
+ * It has \f$\displaystyle p(x) = \frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha, \beta)}\f$.
+ */
+template<class RealType = double>
+class beta_distribution {
+public:
+    typedef RealType result_type;
+    typedef RealType input_type;
+
+    class param_type {
+    public:
+        typedef beta_distribution distribution_type;
+
+        /**
+         * Constructs a @c param_type from the "alpha" and "beta" parameters
+         * of the distribution.
+         *
+         * Requires: alpha > 0, beta > 0
+         */
+        explicit param_type(RealType alpha_arg = RealType(1.0),
+                            RealType beta_arg = RealType(1.0))
+          : _alpha(alpha_arg), _beta(beta_arg)
+        {
+            assert(alpha_arg > 0);
+            assert(beta_arg > 0);
+        }
+
+        /** Returns the "alpha" parameter of the distribtuion. */
+        RealType alpha() const { return _alpha; }
+        /** Returns the "beta" parameter of the distribution. */
+        RealType beta() const { return _beta; }
+
+        /** Writes a @c param_type to a @c std::ostream. */
+        BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
+        { os << parm._alpha << ' ' << parm._beta; return os; }
+
+        /** Reads a @c param_type from a @c std::istream. */
+        BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
+        { is >> parm._alpha >> std::ws >> parm._beta; return is; }
+
+        /** Returns true if the two sets of parameters are the same. */
+        BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+        { return lhs._alpha == rhs._alpha && lhs._beta == rhs._beta; }
+        
+        /** Returns true if the two sets of parameters are the different. */
+        BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+
+    private:
+        RealType _alpha;
+        RealType _beta;
+    };
+
+    /**
+     * Constructs an @c beta_distribution from its "alpha" and "beta" parameters.
+     *
+     * Requires: alpha > 0, beta > 0
+     */
+    explicit beta_distribution(RealType alpha_arg = RealType(1.0),
+                               RealType beta_arg = RealType(1.0))
+      : _alpha(alpha_arg), _beta(beta_arg)
+    {
+        assert(alpha_arg > 0);
+        assert(beta_arg > 0);
+    }
+    /** Constructs an @c beta_distribution from its parameters. */
+    explicit beta_distribution(const param_type& parm)
+      : _alpha(parm.alpha()), _beta(parm.beta())
+    {}
+
+    /**
+     * Returns a random variate distributed according to the
+     * beta distribution.
+     */
+    template<class URNG>
+    RealType operator()(URNG& urng) const
+    {
+        RealType a = gamma_distribution<RealType>(_alpha, RealType(1.0))(urng);
+        RealType b = gamma_distribution<RealType>(_beta, RealType(1.0))(urng);
+        return a / (a + b);
+    }
+
+    /**
+     * Returns a random variate distributed accordint to the beta
+     * distribution with parameters specified by @c param.
+     */
+    template<class URNG>
+    RealType operator()(URNG& urng, const param_type& parm) const
+    {
+        return beta_distribution(parm)(urng);
+    }
+
+    /** Returns the "alpha" parameter of the distribution. */
+    RealType alpha() const { return _alpha; }
+    /** Returns the "beta" parameter of the distribution. */
+    RealType beta() const { return _beta; }
+
+    /** Returns the smallest value that the distribution can produce. */
+    RealType min BOOST_PREVENT_MACRO_SUBSTITUTION () const
+    { return RealType(0.0); }
+    /** Returns the largest value that the distribution can produce. */
+    RealType max BOOST_PREVENT_MACRO_SUBSTITUTION () const
+    { return RealType(1.0); }
+
+    /** Returns the parameters of the distribution. */
+    param_type param() const { return param_type(_alpha, _beta); }
+    /** Sets the parameters of the distribution. */
+    void param(const param_type& parm)
+    {
+        _alpha = parm.alpha();
+        _beta = parm.beta();
+    }
+
+    /**
+     * Effects: Subsequent uses of the distribution do not depend
+     * on values produced by any engine prior to invoking reset.
+     */
+    void reset() { }
+
+    /** Writes an @c beta_distribution to a @c std::ostream. */
+    BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, beta_distribution, wd)
+    {
+        os << wd.param();
+        return os;
+    }
+
+    /** Reads an @c beta_distribution from a @c std::istream. */
+    BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, beta_distribution, wd)
+    {
+        param_type parm;
+        if(is >> parm) {
+            wd.param(parm);
+        }
+        return is;
+    }
+
+    /**
+     * Returns true if the two instances of @c beta_distribution will
+     * return identical sequences of values given equal generators.
+     */
+    BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(beta_distribution, lhs, rhs)
+    { return lhs._alpha == rhs._alpha && lhs._beta == rhs._beta; }
+    
+    /**
+     * Returns true if the two instances of @c beta_distribution will
+     * return different sequences of values given equal generators.
+     */
+    BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(beta_distribution)
+
+private:
+    RealType _alpha;
+    RealType _beta;
+};
+
+} // namespace random
+} // namespace boost
+
+#endif // BOOST_RANDOM_BETA_DISTRIBUTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/random/detail/polynomial.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,384 @@
+/* boost random/detail/polynomial.hpp header file
+ *
+ * Copyright Steven Watanabe 2014
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_DETAIL_POLYNOMIAL_HPP
+#define BOOST_RANDOM_DETAIL_POLYNOMIAL_HPP
+
+#include <cstddef>
+#include <limits>
+#include <vector>
+#include <algorithm>
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost {
+namespace random {
+namespace detail {
+
+class polynomial_ops {
+public:
+    typedef unsigned long digit_t;
+
+    static void add(std::size_t size, const digit_t * lhs,
+                       const digit_t * rhs, digit_t * output)
+    {
+        for(std::size_t i = 0; i < size; ++i) {
+            output[i] = lhs[i] ^ rhs[i];
+        }
+    }
+
+    static void add_shifted_inplace(std::size_t size, const digit_t * lhs,
+                                    digit_t * output, std::size_t shift)
+    {
+        if(shift == 0) {
+            add(size, lhs, output, output);
+            return;
+        }
+        std::size_t bits = std::numeric_limits<digit_t>::digits;
+        digit_t prev = 0;
+        for(std::size_t i = 0; i < size; ++i) {
+            digit_t tmp = lhs[i];
+            output[i] ^= (tmp << shift) | (prev >> (bits-shift));
+            prev = tmp;
+        }
+        output[size] ^= (prev >> (bits-shift));
+    }
+
+    static void multiply_simple(std::size_t size, const digit_t * lhs,
+                                   const digit_t * rhs, digit_t * output)
+    {
+        std::size_t bits = std::numeric_limits<digit_t>::digits;
+        for(std::size_t i = 0; i < 2*size; ++i) {
+            output[i] = 0;
+        }
+        for(std::size_t i = 0; i < size; ++i) {
+            for(std::size_t j = 0; j < bits; ++j) {
+                if((lhs[i] & (digit_t(1) << j)) != 0) {
+                    add_shifted_inplace(size, rhs, output + i, j);
+                }
+            }
+        }
+    }
+
+    // memory requirements: (size - cutoff) * 4 + next_smaller
+    static void multiply_karatsuba(std::size_t size,
+                               const digit_t * lhs, const digit_t * rhs,
+                               digit_t * output)
+    {
+        if(size < 64) {
+            multiply_simple(size, lhs, rhs, output);
+            return;
+        }
+        // split in half
+        std::size_t cutoff = size/2;
+        multiply_karatsuba(cutoff, lhs, rhs, output);
+        multiply_karatsuba(size - cutoff, lhs + cutoff, rhs + cutoff,
+                              output + cutoff*2);
+        std::vector<digit_t> local1(size - cutoff);
+        std::vector<digit_t> local2(size - cutoff);
+        // combine the digits for the inner multiply
+        add(cutoff, lhs, lhs + cutoff, &local1[0]);
+        if(size & 1) local1[cutoff] = lhs[size - 1];
+        add(cutoff, rhs + cutoff, rhs, &local2[0]);
+        if(size & 1) local2[cutoff] = rhs[size - 1];
+        std::vector<digit_t> local3((size - cutoff) * 2);
+        multiply_karatsuba(size - cutoff, &local1[0], &local2[0], &local3[0]);
+        add(cutoff * 2, output, &local3[0], &local3[0]);
+        add((size - cutoff) * 2, output + cutoff*2, &local3[0], &local3[0]);
+        // Finally, add the inner result
+        add((size - cutoff) * 2, output + cutoff, &local3[0], output + cutoff);
+    }
+    
+    static void multiply_add_karatsuba(std::size_t size,
+                                       const digit_t * lhs, const digit_t * rhs,
+                                       digit_t * output)
+    {
+        std::vector<digit_t> buf(size * 2);
+        multiply_karatsuba(size, lhs, rhs, &buf[0]);
+        add(size * 2, &buf[0], output, output);
+    }
+
+    static void multiply(const digit_t * lhs, std::size_t lhs_size,
+                         const digit_t * rhs, std::size_t rhs_size,
+                         digit_t * output)
+    {
+        std::fill_n(output, lhs_size + rhs_size, digit_t(0));
+        multiply_add(lhs, lhs_size, rhs, rhs_size, output);
+    }
+
+    static void multiply_add(const digit_t * lhs, std::size_t lhs_size,
+                             const digit_t * rhs, std::size_t rhs_size,
+                             digit_t * output)
+    {
+        // split into pieces that can be passed to
+        // karatsuba multiply.
+        while(lhs_size != 0) {
+            if(lhs_size < rhs_size) {
+                std::swap(lhs, rhs);
+                std::swap(lhs_size, rhs_size);
+            }
+            
+            multiply_add_karatsuba(rhs_size, lhs, rhs, output);
+            
+            lhs += rhs_size;
+            lhs_size -= rhs_size;
+            output += rhs_size;
+        }
+    }
+
+    static void copy_bits(const digit_t * x, std::size_t low, std::size_t high,
+                   digit_t * out)
+    {
+        const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        std::size_t offset = low/bits;
+        x += offset;
+        low -= offset*bits;
+        high -= offset*bits;
+        std::size_t n = (high-low)/bits;
+        if(low == 0) {
+            for(std::size_t i = 0; i < n; ++i) {
+                out[i] = x[i];
+            }
+        } else {
+            for(std::size_t i = 0; i < n; ++i) {
+                out[i] = (x[i] >> low) | (x[i+1] << (bits-low));
+            }
+        }
+        if((high-low)%bits) {
+            digit_t low_mask = (digit_t(1) << ((high-low)%bits)) - 1;
+            digit_t result = (x[n] >> low);
+            if(low != 0 && (n+1)*bits < high) {
+                result |= (x[n+1] << (bits-low));
+            }
+            out[n] = (result & low_mask);
+        }
+    }
+
+    static void shift_left(digit_t * val, std::size_t size, std::size_t shift)
+    {
+        const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        BOOST_ASSERT(shift > 0);
+        BOOST_ASSERT(shift < bits);
+        digit_t prev = 0;
+        for(std::size_t i = 0; i < size; ++i) {
+            digit_t tmp = val[i];
+            val[i] = (prev >> (bits - shift)) | (val[i] << shift);
+            prev = tmp;
+        }
+    }
+
+    static digit_t sqr(digit_t val) {
+        const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        digit_t mask = (digit_t(1) << bits/2) - 1;
+        for(std::size_t i = bits; i > 1; i /= 2) {
+            val = ((val & ~mask) << i/2) | (val & mask);
+            mask = mask & (mask >> i/4);
+            mask = mask | (mask << i/2);
+        }
+        return val;
+    }
+
+    static void sqr(digit_t * val, std::size_t size)
+    {
+        const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        digit_t mask = (digit_t(1) << bits/2) - 1;
+        for(std::size_t i = 0; i < size; ++i) {
+            digit_t x = val[size - i - 1];
+            val[(size - i - 1) * 2] = sqr(x & mask);
+            val[(size - i - 1) * 2 + 1] = sqr(x >> bits/2);
+        }
+    }
+
+    // optimized for the case when the modulus has few bits set.
+    struct sparse_mod {
+        sparse_mod(const digit_t * divisor, std::size_t divisor_bits)
+        {
+            const std::size_t bits = std::numeric_limits<digit_t>::digits;
+            _remainder_bits = divisor_bits - 1;
+            for(std::size_t i = 0; i < divisor_bits; ++i) {
+                if(divisor[i/bits] & (digit_t(1) << i%bits)) {
+                    _bit_indices.push_back(i);
+                }
+            }
+            BOOST_ASSERT(_bit_indices.back() == divisor_bits - 1);
+            _bit_indices.pop_back();
+            if(_bit_indices.empty()) {
+                _block_bits = divisor_bits;
+                _lower_bits = 0;
+            } else {
+                _block_bits = divisor_bits - _bit_indices.back() - 1;
+                _lower_bits = _bit_indices.back() + 1;
+            }
+            
+            _partial_quotient.resize((_block_bits + bits - 1)/bits);
+        }
+        void operator()(digit_t * dividend, std::size_t dividend_bits)
+        {
+            const std::size_t bits = std::numeric_limits<digit_t>::digits;
+            while(dividend_bits > _remainder_bits) {
+                std::size_t block_start = (std::max)(dividend_bits - _block_bits, _remainder_bits);
+                std::size_t block_size = (dividend_bits - block_start + bits - 1) / bits;
+                copy_bits(dividend, block_start, dividend_bits, &_partial_quotient[0]);
+                for(std::size_t i = 0; i < _bit_indices.size(); ++i) {
+                    std::size_t pos = _bit_indices[i] + block_start - _remainder_bits;
+                    add_shifted_inplace(block_size, &_partial_quotient[0], dividend + pos/bits, pos%bits);
+                }
+                add_shifted_inplace(block_size, &_partial_quotient[0], dividend + block_start/bits, block_start%bits);
+                dividend_bits = block_start;
+            }
+        }
+        std::vector<digit_t> _partial_quotient;
+        std::size_t _remainder_bits;
+        std::size_t _block_bits;
+        std::size_t _lower_bits;
+        std::vector<std::size_t> _bit_indices;
+    };
+
+    // base should have the same number of bits as mod
+    // base, and mod should both be able to hold a power
+    // of 2 >= mod_bits.  out needs to be twice as large.
+    static void mod_pow_x(boost::uintmax_t exponent, const digit_t * mod, std::size_t mod_bits, digit_t * out)
+    {
+        const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        const std::size_t n = (mod_bits + bits - 1) / bits;
+        const std::size_t highbit = mod_bits - 1;
+        if(exponent == 0) {
+            out[0] = 1;
+            std::fill_n(out + 1, n - 1, digit_t(0));
+            return;
+        }
+        boost::uintmax_t i = std::numeric_limits<boost::uintmax_t>::digits - 1;
+        while(((boost::uintmax_t(1) << i) & exponent) == 0) {
+            --i;
+        }
+        out[0] = 2;
+        std::fill_n(out + 1, n - 1, digit_t(0));
+        sparse_mod m(mod, mod_bits);
+        while(i--) {
+            sqr(out, n);
+            m(out, 2 * mod_bits - 1);
+            if((boost::uintmax_t(1) << i) & exponent) {
+                shift_left(out, n, 1);
+                if(out[highbit / bits] & (digit_t(1) << highbit%bits))
+                    add(n, out, mod, out);
+            }
+        }
+    }
+};
+
+class polynomial
+{
+    typedef polynomial_ops::digit_t digit_t;
+public:
+    polynomial() : _size(0) {}
+    class reference {
+    public:
+        reference(digit_t &value, int idx)
+            : _value(value), _idx(idx) {}
+        operator bool() const { return (_value & (digit_t(1) << _idx)) != 0; }
+        reference& operator=(bool b)
+        {
+            if(b) {
+                _value |= (digit_t(1) << _idx);
+            } else {
+                _value &= ~(digit_t(1) << _idx);
+            }
+            return *this;
+        }
+        reference &operator^=(bool b)
+        {
+            _value ^= (digit_t(b) << _idx);
+            return *this;
+        }
+
+        reference &operator=(const reference &other)
+        {
+            return *this = static_cast<bool>(other);
+        }
+    private:
+        digit_t &_value;
+        int _idx;
+    };
+    reference operator[](std::size_t i)
+    {
+        static const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        ensure_bit(i);
+        return reference(_storage[i/bits], i%bits);
+    }
+    bool operator[](std::size_t i) const
+    {
+        static const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        if(i < size())
+            return (_storage[i/bits] & (digit_t(1) << (i%bits))) != 0;
+        else
+            return false;
+    }
+    std::size_t size() const
+    {
+        return _size;
+    }
+    void resize(std::size_t n)
+    {
+        static const std::size_t bits = std::numeric_limits<digit_t>::digits;
+        _storage.resize((n + bits - 1)/bits);
+        // clear the high order bits in case we're shrinking.
+        if(n%bits) {
+            _storage.back() &= ((digit_t(1) << (n%bits)) - 1);
+        }
+        _size = n;
+    }
+    friend polynomial operator*(const polynomial &lhs, const polynomial &rhs);
+    friend polynomial mod_pow_x(boost::uintmax_t exponent, polynomial mod);
+private:
+    std::vector<polynomial_ops::digit_t> _storage;
+    std::size_t _size;
+    void ensure_bit(std::size_t i)
+    {
+        if(i >= size()) {
+            resize(i + 1);
+        }
+    }
+    void normalize()
+    {
+        while(size() && (*this)[size() - 1] == 0)
+            resize(size() - 1);
+    }
+};
+
+inline polynomial operator*(const polynomial &lhs, const polynomial &rhs)
+{
+    polynomial result;
+    result._storage.resize(lhs._storage.size() + rhs._storage.size());
+    polynomial_ops::multiply(&lhs._storage[0], lhs._storage.size(),
+                             &rhs._storage[0], rhs._storage.size(),
+                             &result._storage[0]);
+    result._size = lhs._size + rhs._size;
+    return result;
+}
+
+inline polynomial mod_pow_x(boost::uintmax_t exponent, polynomial mod)
+{
+    polynomial result;
+    mod.normalize();
+    std::size_t mod_size = mod.size();
+    result._storage.resize(mod._storage.size() * 2);
+    result._size = mod.size() * 2;
+    polynomial_ops::mod_pow_x(exponent, &mod._storage[0], mod_size, &result._storage[0]);
+    result.resize(mod.size() - 1);
+    return result;
+}
+
+}
+}
+}
+
+#endif // BOOST_RANDOM_DETAIL_POLYNOMIAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/random/laplace_distribution.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,175 @@
+/* boost random/laplace_distribution.hpp header file
+ *
+ * Copyright Steven Watanabe 2014
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_LAPLACE_DISTRIBUTION_HPP
+#define BOOST_RANDOM_LAPLACE_DISTRIBUTION_HPP
+
+#include <cassert>
+#include <istream>
+#include <iosfwd>
+#include <boost/random/detail/operators.hpp>
+#include <boost/random/exponential_distribution.hpp>
+
+namespace boost {
+namespace random {
+
+/**
+ * The laplace distribution is a real-valued distribution with
+ * two parameters, mean and beta.
+ *
+ * It has \f$\displaystyle p(x) = \frac{e^-{\frac{|x-\mu|}{\beta}}}{2\beta}\f$.
+ */
+template<class RealType = double>
+class laplace_distribution {
+public:
+    typedef RealType result_type;
+    typedef RealType input_type;
+
+    class param_type {
+    public:
+        typedef laplace_distribution distribution_type;
+
+        /**
+         * Constructs a @c param_type from the "mean" and "beta" parameters
+         * of the distribution.
+         */
+        explicit param_type(RealType mean_arg = RealType(0.0),
+                            RealType beta_arg = RealType(1.0))
+          : _mean(mean_arg), _beta(beta_arg)
+        {}
+
+        /** Returns the "mean" parameter of the distribtuion. */
+        RealType mean() const { return _mean; }
+        /** Returns the "beta" parameter of the distribution. */
+        RealType beta() const { return _beta; }
+
+        /** Writes a @c param_type to a @c std::ostream. */
+        BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
+        { os << parm._mean << ' ' << parm._beta; return os; }
+
+        /** Reads a @c param_type from a @c std::istream. */
+        BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
+        { is >> parm._mean >> std::ws >> parm._beta; return is; }
+
+        /** Returns true if the two sets of parameters are the same. */
+        BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+        { return lhs._mean == rhs._mean && lhs._beta == rhs._beta; }
+        
+        /** Returns true if the two sets of parameters are the different. */
+        BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+
+    private:
+        RealType _mean;
+        RealType _beta;
+    };
+
+    /**
+     * Constructs an @c laplace_distribution from its "mean" and "beta" parameters.
+     */
+    explicit laplace_distribution(RealType mean_arg = RealType(0.0),
+                               RealType beta_arg = RealType(1.0))
+      : _mean(mean_arg), _beta(beta_arg)
+    {}
+    /** Constructs an @c laplace_distribution from its parameters. */
+    explicit laplace_distribution(const param_type& parm)
+      : _mean(parm.mean()), _beta(parm.beta())
+    {}
+
+    /**
+     * Returns a random variate distributed according to the
+     * laplace distribution.
+     */
+    template<class URNG>
+    RealType operator()(URNG& urng) const
+    {
+        RealType exponential = exponential_distribution<RealType>()(urng);
+        if(uniform_01<RealType>()(urng) < 0.5)
+            exponential = -exponential;
+        return _mean + _beta * exponential;
+    }
+
+    /**
+     * Returns a random variate distributed accordint to the laplace
+     * distribution with parameters specified by @c param.
+     */
+    template<class URNG>
+    RealType operator()(URNG& urng, const param_type& parm) const
+    {
+        return laplace_distribution(parm)(urng);
+    }
+
+    /** Returns the "mean" parameter of the distribution. */
+    RealType mean() const { return _mean; }
+    /** Returns the "beta" parameter of the distribution. */
+    RealType beta() const { return _beta; }
+
+    /** Returns the smallest value that the distribution can produce. */
+    RealType min BOOST_PREVENT_MACRO_SUBSTITUTION () const
+    { return RealType(-std::numeric_limits<RealType>::infinity()); }
+    /** Returns the largest value that the distribution can produce. */
+    RealType max BOOST_PREVENT_MACRO_SUBSTITUTION () const
+    { return RealType(std::numeric_limits<RealType>::infinity()); }
+
+    /** Returns the parameters of the distribution. */
+    param_type param() const { return param_type(_mean, _beta); }
+    /** Sets the parameters of the distribution. */
+    void param(const param_type& parm)
+    {
+        _mean = parm.mean();
+        _beta = parm.beta();
+    }
+
+    /**
+     * Effects: Subsequent uses of the distribution do not depend
+     * on values produced by any engine prior to invoking reset.
+     */
+    void reset() { }
+
+    /** Writes an @c laplace_distribution to a @c std::ostream. */
+    BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, laplace_distribution, wd)
+    {
+        os << wd.param();
+        return os;
+    }
+
+    /** Reads an @c laplace_distribution from a @c std::istream. */
+    BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, laplace_distribution, wd)
+    {
+        param_type parm;
+        if(is >> parm) {
+            wd.param(parm);
+        }
+        return is;
+    }
+
+    /**
+     * Returns true if the two instances of @c laplace_distribution will
+     * return identical sequences of values given equal generators.
+     */
+    BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(laplace_distribution, lhs, rhs)
+    { return lhs._mean == rhs._mean && lhs._beta == rhs._beta; }
+    
+    /**
+     * Returns true if the two instances of @c laplace_distribution will
+     * return different sequences of values given equal generators.
+     */
+    BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(laplace_distribution)
+
+private:
+    RealType _mean;
+    RealType _beta;
+};
+
+} // namespace random
+} // namespace boost
+
+#endif // BOOST_RANDOM_LAPLACE_DISTRIBUTION_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/random/non_central_chi_squared_distribution.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,221 @@
+/* boost random/non_central_chi_squared_distribution.hpp header file
+ *
+ * Copyright Thijs van den Berg 2014
+ * 
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_NON_CENTRAL_CHI_SQUARED_DISTRIBUTION_HPP
+#define BOOST_RANDOM_NON_CENTRAL_CHI_SQUARED_DISTRIBUTION_HPP
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <iosfwd>
+#include <istream>
+#include <boost/limits.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/detail/operators.hpp>
+#include <boost/random/uniform_real_distribution.hpp>
+#include <boost/random/normal_distribution.hpp>
+#include <boost/random/chi_squared_distribution.hpp>
+#include <boost/random/poisson_distribution.hpp>
+
+namespace boost {
+namespace random {
+
+/**
+ * The noncentral chi-squared distribution is a real valued distribution with
+ * two parameter, @c k and @c lambda.  The distribution produces values > 0.
+ *
+ * This is the distribution of the sum of squares of k Normal distributed
+ * variates each with variance one and \f$\lambda\f$ the sum of squares of the
+ * normal means.
+ *
+ * The distribution function is
+ * \f$\displaystyle P(x) = \frac{1}{2} e^{-(x+\lambda)/2} \left( \frac{x}{\lambda} \right)^{k/4-1/2} I_{k/2-1}( \sqrt{\lambda x} )\f$.
+ *  where  \f$\displaystyle I_\nu(z)\f$ is a modified Bessel function of the
+ * first kind.
+ *
+ * The algorithm is taken from
+ *
+ *  @blockquote
+ *  "Monte Carlo Methods in Financial Engineering", Paul Glasserman,
+ *  2003, XIII, 596 p, Stochastic Modelling and Applied Probability, Vol. 53,
+ *  ISBN 978-0-387-21617-1, p 124, Fig. 3.5.
+ *  @endblockquote
+ */
+template <typename RealType = double>
+class non_central_chi_squared_distribution {
+public:
+    typedef RealType result_type;
+    typedef RealType input_type;
+    
+    class param_type {
+    public:
+        typedef non_central_chi_squared_distribution distribution_type;
+        
+        /**
+         * Constructs the parameters of a non_central_chi_squared_distribution.
+         * @c k and @c lambda are the parameter of the distribution.
+         *
+         * Requires: k > 0 && lambda > 0
+         */
+        explicit
+        param_type(RealType k_arg = RealType(1), RealType lambda_arg = RealType(1))
+        : _k(k_arg), _lambda(lambda_arg)
+        {
+            BOOST_ASSERT(k_arg > RealType(0));
+            BOOST_ASSERT(lambda_arg > RealType(0));
+        }
+        
+        /** Returns the @c k parameter of the distribution */
+        RealType k() const { return _k; }
+        
+        /** Returns the @c lambda parameter of the distribution */
+        RealType lambda() const { return _lambda; }
+
+        /** Writes the parameters of the distribution to a @c std::ostream. */
+        BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
+        {
+            os << parm._k << ' ' << parm._lambda;
+            return os;
+        }
+        
+        /** Reads the parameters of the distribution from a @c std::istream. */
+        BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
+        {
+            is >> parm._k >> std::ws >> parm._lambda;
+            return is;
+        }
+
+        /** Returns true if the parameters have the same values. */
+        BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+        { return lhs._k == rhs._k && lhs._lambda == rhs._lambda; }
+        
+        /** Returns true if the parameters have different values. */
+        BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+        
+    private:
+        RealType _k;
+        RealType _lambda;
+    };
+
+    /**
+     * Construct a @c non_central_chi_squared_distribution object. @c k and
+     * @c lambda are the parameter of the distribution.
+     *
+     * Requires: k > 0 && lambda > 0
+     */
+    explicit
+    non_central_chi_squared_distribution(RealType k_arg = RealType(1), RealType lambda_arg = RealType(1))
+      : _param(k_arg, lambda_arg)
+    {
+        BOOST_ASSERT(k_arg > RealType(0));
+        BOOST_ASSERT(lambda_arg > RealType(0));
+    }
+
+    /**
+     * Construct a @c non_central_chi_squared_distribution object from the parameter.
+     */
+    explicit
+    non_central_chi_squared_distribution(const param_type& parm)
+      : _param( parm )
+    { }
+    
+    /**
+     * Returns a random variate distributed according to the
+     * non central chi squared distribution specified by @c param.
+     */
+    template<typename URNG>
+    RealType operator()(URNG& eng, const param_type& parm) const
+    { return non_central_chi_squared_distribution(parm)(eng); }
+    
+    /**
+     * Returns a random variate distributed according to the
+     * non central chi squared distribution.
+     */
+    template<typename URNG> 
+    RealType operator()(URNG& eng) 
+    {
+        using std::sqrt;
+        if (_param.k() > 1) {
+            boost::random::normal_distribution<RealType> n_dist;
+            boost::random::chi_squared_distribution<RealType> c_dist(_param.k() - RealType(1));
+            RealType _z = n_dist(eng);
+            RealType _x = c_dist(eng);
+            RealType term1 = _z + sqrt(_param.lambda());
+            return term1*term1 + _x;
+        }
+        else {
+            boost::random::poisson_distribution<> p_dist(_param.lambda()/RealType(2));
+            boost::random::poisson_distribution<>::result_type _p = p_dist(eng);
+            boost::random::chi_squared_distribution<RealType> c_dist(_param.k() + RealType(2)*_p);
+            return c_dist(eng);
+        }
+    }
+
+    /** Returns the @c k parameter of the distribution. */
+    RealType k() const { return _param.k(); }
+    
+    /** Returns the @c lambda parameter of the distribution. */
+    RealType lambda() const { return _param.lambda(); }
+    
+    /** Returns the parameters of the distribution. */
+    param_type param() const { return _param; }
+    
+    /** Sets parameters of the distribution. */
+    void param(const param_type& parm) { _param = parm; }
+    
+    /** Resets the distribution, so that subsequent uses does not depend on values already produced by it.*/
+    void reset() {}
+    
+    /** Returns the smallest value that the distribution can produce. */
+    RealType min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+    { return RealType(0); }
+    
+    /** Returns the largest value that the distribution can produce. */
+    RealType max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+    { return (std::numeric_limits<RealType>::infinity)(); }
+
+    /** Writes the parameters of the distribution to a @c std::ostream. */
+    BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, non_central_chi_squared_distribution, dist)
+    {
+        os << dist.param();
+        return os;
+    }
+    
+    /** reads the parameters of the distribution from a @c std::istream. */
+    BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, non_central_chi_squared_distribution, dist)
+    {
+        param_type parm;
+        if(is >> parm) {
+            dist.param(parm);
+        }
+        return is;
+    }
+
+    /** Returns true if two distributions have the same parameters and produce 
+        the same sequence of random numbers given equal generators.*/
+    BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(non_central_chi_squared_distribution, lhs, rhs)
+    { return lhs.param() == rhs.param(); }
+    
+    /** Returns true if two distributions have different parameters and/or can produce 
+       different sequences of random numbers given equal generators.*/
+    BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(non_central_chi_squared_distribution)
+    
+private:
+
+    /// @cond show_private
+    param_type  _param;
+    /// @endcond
+};
+
+} // namespace random
+} // namespace boost
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/adaptor/formatted.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,229 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014.
+//  Use, modification and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_ADAPTOR_FORMATTED_HPP_INCLUDED
+#define BOOST_RANGE_ADAPTOR_FORMATTED_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/range/concepts.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/iterator.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/remove_extent.hpp>
+#include <ostream>
+
+namespace boost
+{
+    namespace range_detail
+    {
+
+template<typename Sep, typename Prefix, typename Postfix>
+struct formatted_holder
+{
+    typedef typename boost::mpl::if_<
+        boost::is_array<Sep>,
+        const typename boost::remove_extent<Sep>::type*,
+        Sep
+    >::type separator_t;
+
+    typedef typename boost::mpl::if_<
+        boost::is_array<Prefix>,
+        const typename boost::remove_extent<Prefix>::type*,
+        Prefix
+    >::type prefix_t;
+
+    typedef typename boost::mpl::if_<
+        boost::is_array<Postfix>,
+        const typename boost::remove_extent<Postfix>::type*,
+        Postfix
+    >::type postfix_t;
+
+    formatted_holder(
+        const separator_t& sep,
+        const prefix_t& prefix,
+        const postfix_t& postfix)
+        : m_sep(sep)
+        , m_prefix(prefix)
+        , m_postfix(postfix)
+    {
+    }
+
+    separator_t m_sep;
+    prefix_t m_prefix;
+    postfix_t m_postfix;
+};
+
+template<typename Iter, typename Sep, typename Prefix, typename Postfix>
+class formatted_range
+        : public boost::iterator_range<Iter>
+{
+    typedef formatted_holder<Sep,Prefix,Postfix> holder_t;
+public:
+    formatted_range(Iter first, Iter last, const holder_t& holder)
+        : boost::iterator_range<Iter>(first, last)
+        , m_holder(holder)
+    {
+    }
+
+    template<typename OStream>
+    void write(OStream& out) const
+    {
+        Iter it(this->begin());
+        out << m_holder.m_prefix;
+        if (it != this->end())
+        {
+            out << *it;
+            for (++it; it != this->end(); ++it)
+            {
+                out << m_holder.m_sep << *it;
+            }
+        }
+        out << m_holder.m_postfix;
+    }
+
+private:
+    holder_t m_holder;
+};
+
+template<
+    typename SinglePassRange,
+    typename Sep,
+    typename Prefix,
+    typename Postfix
+>
+inline range_detail::formatted_range<
+    typename range_iterator<const SinglePassRange>::type, Sep, Prefix, Postfix
+>
+operator|(
+    const SinglePassRange& rng,
+    const range_detail::formatted_holder<Sep,Prefix,Postfix>& holder
+)
+{
+    typedef typename range_iterator<const SinglePassRange>::type iterator;
+    return range_detail::formatted_range<iterator, Sep, Prefix, Postfix>(
+        boost::begin(rng), boost::end(rng), holder);
+}
+
+template<typename Char, typename Traits, typename Iter, typename Sep,
+    typename Prefix, typename Postfix>
+std::basic_ostream<Char, Traits>&
+operator<<(
+        std::basic_ostream<Char, Traits>& out,
+        const formatted_range<Iter, Sep, Prefix, Postfix>& writer)
+{
+    writer.write(out);
+    return out;
+}
+
+    } // namespace range_detail
+
+    namespace adaptors
+    {
+
+template<typename Sep, typename Prefix, typename Postfix>
+range_detail::formatted_holder<Sep, Prefix, Postfix>
+formatted(const Sep& sep, const Prefix& prefix, const Postfix& postfix)
+{
+    return range_detail::formatted_holder<Sep,Prefix,Postfix>(
+                sep, prefix, postfix);
+}
+
+template<typename Sep, typename Prefix>
+range_detail::formatted_holder<Sep, Prefix, char>
+formatted(const Sep& sep, const Prefix& prefix)
+{
+    return range_detail::formatted_holder<Sep, Prefix, char>(sep, prefix, '}');
+}
+
+template<typename Sep>
+range_detail::formatted_holder<Sep, char, char>
+formatted(const Sep& sep)
+{
+    return range_detail::formatted_holder<Sep, char, char>(sep, '{', '}');
+}
+
+inline range_detail::formatted_holder<char, char, char>
+formatted()
+{
+    return range_detail::formatted_holder<char, char, char>(',', '{', '}');
+}
+
+using range_detail::formatted_range;
+
+template<typename SinglePassRange, typename Sep, typename Prefix,
+         typename Postfix>
+inline boost::range_detail::formatted_range<
+    typename boost::range_iterator<const SinglePassRange>::type,
+    Sep, Prefix, Postfix
+>
+format(
+    const SinglePassRange& rng,
+    const Sep& sep,
+    const Prefix& prefix,
+    const Postfix& postfix
+)
+{
+    typedef typename boost::range_iterator<const SinglePassRange>::type
+                iterator_t;
+
+    typedef boost::range_detail::formatted_range<
+                iterator_t, Sep, Prefix, Postfix>       result_t;
+
+    typedef boost::range_detail::formatted_holder<Sep, Prefix, Postfix>
+                holder_t;
+
+    return result_t(boost::begin(rng), boost::end(rng),
+                    holder_t(sep, prefix, postfix));
+}
+
+template<typename SinglePassRange, typename Sep, typename Prefix>
+inline boost::range_detail::formatted_range<
+    typename boost::range_iterator<const SinglePassRange>::type,
+    Sep, Prefix, char
+>
+format(
+    const SinglePassRange& rng,
+    const Sep& sep,
+    const Prefix& prefix)
+{
+    return adaptors::format<SinglePassRange, Sep, Prefix, char>(rng, sep, prefix, '}');
+}
+
+template<typename SinglePassRange, typename Sep>
+inline boost::range_detail::formatted_range<
+    typename boost::range_iterator<const SinglePassRange>::type,
+    Sep, char, char
+>
+format(const SinglePassRange& rng, const Sep& sep)
+{
+    return adaptors::format<SinglePassRange, Sep, char, char>(rng, sep, '{', '}');
+}
+
+template<typename SinglePassRange>
+inline boost::range_detail::formatted_range<
+    typename boost::range_iterator<const SinglePassRange>::type,
+    char, char, char
+>
+format(const SinglePassRange& rng)
+{
+    return adaptors::format<SinglePassRange, char, char, char>(rng, ',', '{', '}');
+}
+
+    } // namespace adaptors
+
+    namespace range
+    {
+        using boost::range_detail::formatted_range;
+    } // namespace range
+} // namespace boost
+
+#endif // include guard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/combine_cxx03.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,131 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_DETAIL_COMBINE_CXX03_HPP
+#define BOOST_RANGE_DETAIL_COMBINE_CXX03_HPP
+
+#ifndef BOOST_RANGE_MIN_COMBINE_ARGS
+#define BOOST_RANGE_MIN_COMBINE_ARGS 2
+#endif
+
+#ifndef BOOST_RANGE_MAX_COMBINE_ARGS
+#define BOOST_RANGE_MAX_COMBINE_ARGS 5
+#endif
+
+#include <boost/config.hpp>
+#include <boost/iterator/zip_iterator.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/div.hpp>
+#include <boost/preprocessor/arithmetic/mul.hpp>
+#include <boost/preprocessor/control.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/punctuation/comma.hpp>
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/utility/result_of.hpp>
+
+#include <vector>
+#include <list>
+
+namespace boost
+{
+    namespace range_detail
+    {
+
+template<typename F, typename T, int SIZE>
+struct combined_result_impl;
+
+template<typename F, typename T>
+struct combined_result
+    : combined_result_impl<F, T, tuples::length<T>::value>
+{
+};
+
+#define BOOST_RANGE_combined_element(z, n, data) \
+    typename tuples::element<n, T>::type
+
+#define BOOST_RANGE_combined_result(z, n, data) \
+    template<typename F, typename T> \
+    struct combined_result_impl <F,T,n> \
+        : result_of<F(BOOST_PP_ENUM(n, BOOST_RANGE_combined_element, ~))> \
+    { \
+    };
+
+#define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combined_result(~,n,~)
+
+#define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \
+                               BOOST_RANGE_MAX_COMBINE_ARGS)
+#include BOOST_PP_LOCAL_ITERATE()
+
+#define BOOST_RANGE_combined_get(z, n, data) get<n>(tuple)
+
+#define BOOST_RANGE_combined_unpack(z, n, data) \
+    template<typename F, typename T> inline \
+    typename combined_result<F,T>::type \
+    unpack_(mpl::int_<n>, F f, const T& tuple) \
+    { \
+        return f(BOOST_PP_ENUM(n, BOOST_RANGE_combined_get, ~)); \
+    }
+
+#define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combined_unpack(~,n,~)
+#define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \
+                               BOOST_RANGE_MAX_COMBINE_ARGS)
+#include BOOST_PP_LOCAL_ITERATE()
+
+} // namespace range_detail
+
+namespace range
+{
+
+#define BOOST_RANGE_combined_seq(z, n, data) boost::data(BOOST_PP_CAT(r,n))
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+#include <boost/range/detail/combine_no_rvalue.hpp>
+
+#else // by using rvalue references we avoid requiring 2^n overloads.
+
+#include <boost/range/detail/combine_rvalue.hpp>
+
+#endif
+
+#define BOOST_PP_LOCAL_MACRO(n) BOOST_RANGE_combine(~,n,~)
+#define BOOST_PP_LOCAL_LIMITS (BOOST_RANGE_MIN_COMBINE_ARGS, \
+                               BOOST_RANGE_MAX_COMBINE_ARGS)
+#include BOOST_PP_LOCAL_ITERATE()
+
+    } // namespace range
+
+    using boost::range::combine;
+
+} // namespace boost
+
+#endif // include guard
+
+#undef BOOST_RANGE_combined_element
+#undef BOOST_RANGE_combined_result
+#undef BOOST_RANGE_combined_get
+#undef BOOST_RANGE_combined_unpack
+#undef BOOST_RANGE_combined_seq
+#undef BOOST_RANGE_combined_exp_pred
+#undef BOOST_RANGE_combined_exp_op
+#undef BOOST_RANGE_combined_exp
+#undef BOOST_RANGE_combined_bitset_pred
+#undef BOOST_RANGE_combined_bitset_op
+#undef BOOST_RANGE_combined_bitset
+#undef BOOST_RANGE_combined_range_iterator
+#undef BOOST_RANGE_combined_args
+#undef BOOST_RANGE_combine_impl
+#undef BOOST_RANGE_combine
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/combine_cxx11.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_DETAIL_COMBINE_CXX11_HPP
+#define BOOST_RANGE_DETAIL_COMBINE_CXX11_HPP
+
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/range/iterator.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/iterator/zip_iterator.hpp>
+
+#include <fstream>
+
+namespace boost
+{
+    namespace range
+    {
+
+template<typename... Ranges>
+auto combine(Ranges&&... rngs) ->
+    combined_range<decltype(boost::make_tuple(boost::begin(rngs)...))>
+{
+    return combined_range<decltype(boost::make_tuple(boost::begin(rngs)...))>(
+                boost::make_tuple(boost::begin(rngs)...),
+                boost::make_tuple(boost::end(rngs)...));
+}
+
+    } // namespace range
+
+using range::combine;
+
+} // namespace boost
+
+#endif // include guard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/combine_no_rvalue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,73 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#define BOOST_RANGE_combined_exp_pred(d, data) BOOST_PP_TUPLE_ELEM(3, 0, data)
+
+#define BOOST_RANGE_combined_exp_op(d, data) \
+ ( \
+    BOOST_PP_DEC( \
+       BOOST_PP_TUPLE_ELEM(3, 0, data) \
+    ), \
+    BOOST_PP_TUPLE_ELEM(3, 1, data), \
+    BOOST_PP_MUL_D( \
+       d, \
+       BOOST_PP_TUPLE_ELEM(3, 2, data), \
+       BOOST_PP_TUPLE_ELEM(3, 1, data) \
+    ) \
+ )
+
+#define BOOST_RANGE_combined_exp(x, n) \
+  BOOST_PP_TUPLE_ELEM(3, 2, \
+  BOOST_PP_WHILE(BOOST_RANGE_combined_exp_pred, \
+                 BOOST_RANGE_combined_exp_op, (n, x, 1)))
+
+#define BOOST_RANGE_combined_bitset_pred(n, state) \
+    BOOST_PP_TUPLE_ELEM(2,1,state)
+
+#define BOOST_RANGE_combined_bitset_op(d, state) \
+    (BOOST_PP_DIV_D(d, BOOST_PP_TUPLE_ELEM(2,0,state), 2), \
+     BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2,1,state)))
+
+#define BOOST_RANGE_combined_bitset(i, n) \
+BOOST_PP_MOD(BOOST_PP_TUPLE_ELEM(2, 0, \
+      BOOST_PP_WHILE(BOOST_RANGE_combined_bitset_pred, \
+                     BOOST_RANGE_combined_bitset_op, (i,n))), 2)
+
+#define BOOST_RANGE_combined_range_iterator(z, n, i) \
+  typename range_iterator< \
+      BOOST_PP_CAT(R,n)          \
+      BOOST_PP_IF( \
+          BOOST_RANGE_combined_bitset(i,n), \
+          BOOST_PP_IDENTITY(const), \
+          BOOST_PP_EMPTY)() \
+  >::type
+
+#define BOOST_RANGE_combined_args(z, n, i) \
+  BOOST_PP_CAT(R, n) \
+  BOOST_PP_IF(BOOST_RANGE_combined_bitset(i,n), const&, &)  \
+  BOOST_PP_CAT(r, n)
+
+#define BOOST_RANGE_combine_impl(z, i, n)\
+    template<BOOST_PP_ENUM_PARAMS(n, typename R)> \
+    inline range::combined_range< \
+        boost::tuple<BOOST_PP_ENUM(n, BOOST_RANGE_combined_range_iterator, i)> \
+    > \
+    combine(BOOST_PP_ENUM(n, BOOST_RANGE_combined_args, i)) \
+    { \
+        typedef tuple< \
+            BOOST_PP_ENUM(n, BOOST_RANGE_combined_range_iterator, i) \
+        > rng_tuple_t;   \
+        return range::combined_range<rng_tuple_t>( \
+            rng_tuple_t(BOOST_PP_ENUM(n, BOOST_RANGE_combined_seq, begin)), \
+            rng_tuple_t(BOOST_PP_ENUM(n, BOOST_RANGE_combined_seq, end))); \
+    }
+
+
+#define BOOST_RANGE_combine(z, n, data) \
+  BOOST_PP_REPEAT(BOOST_RANGE_combined_exp(2,n), BOOST_RANGE_combine_impl, n)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/combine_rvalue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,32 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#define BOOST_RANGE_combined_args(z, n, i) \
+    BOOST_PP_CAT(R, n)&& BOOST_PP_CAT(r, n)
+
+#define BOOST_RANGE_combined_range_iterator(z, n, i) \
+    typename range_iterator< \
+        typename remove_reference<BOOST_PP_CAT(R,n)>::type \
+  >::type
+
+
+#define BOOST_RANGE_combine(z, n, data) \
+    template <BOOST_PP_ENUM_PARAMS(n, typename R)> \
+    inline range::combined_range< \
+        tuple<BOOST_PP_ENUM(n, BOOST_RANGE_combined_range_iterator, ~)> \
+    > \
+    combine(BOOST_PP_ENUM(n, BOOST_RANGE_combined_args, ~)) \
+    { \
+        typedef tuple< \
+            BOOST_PP_ENUM(n, BOOST_RANGE_combined_range_iterator, ~) \
+        > rng_tuple_t; \
+        return range::combined_range<rng_tuple_t>( \
+            rng_tuple_t(BOOST_PP_ENUM(n, BOOST_RANGE_combined_seq, begin)), \
+            rng_tuple_t(BOOST_PP_ENUM(n, BOOST_RANGE_combined_seq, end))); \
+    }
--- a/DEPENDENCIES/generic/include/boost/range/detail/const_iterator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-// Boost.Range library
-//
-//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
-//  distribution is subject to the Boost Software License, Version
-//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see http://www.boost.org/libs/range/
-//
-
-#ifndef BOOST_RANGE_DETAIL_CONST_ITERATOR_HPP
-#define BOOST_RANGE_DETAIL_CONST_ITERATOR_HPP
-
-#include <boost/range/detail/common.hpp>
-#include <boost/range/detail/remove_extent.hpp>
-
-//////////////////////////////////////////////////////////////////////////////
-// missing partial specialization  workaround.
-//////////////////////////////////////////////////////////////////////////////
-
-namespace boost 
-{
-    namespace range_detail 
-    {      
-        template< typename T >
-        struct range_const_iterator_;
-
-        template<>
-        struct range_const_iterator_<std_container_>
-        {
-            template< typename C >
-            struct pts
-            {
-                typedef BOOST_RANGE_DEDUCED_TYPENAME C::const_iterator type;
-            };
-        };
-
-        template<>
-        struct range_const_iterator_<std_pair_>
-        {
-            template< typename P >
-            struct pts
-            {
-                typedef BOOST_RANGE_DEDUCED_TYPENAME P::first_type type;
-            };
-        };
-
-
-        template<>
-        struct range_const_iterator_<array_>
-        { 
-            template< typename T >
-            struct pts
-            {
-                typedef const BOOST_RANGE_DEDUCED_TYPENAME 
-                    remove_extent<T>::type* type;
-            };
-        };
-    } 
-    
-    template< typename C >
-    class range_const_iterator
-    {
-        typedef BOOST_DEDUCED_TYPENAME range_detail::range<C>::type c_type;
-    public:
-        typedef BOOST_DEDUCED_TYPENAME range_detail::range_const_iterator_<c_type>::BOOST_NESTED_TEMPLATE pts<C>::type type; 
-    };
-
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/default_constructible_unary_fn.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,64 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_DETAIL_DEFAULT_CONSTRUCTIBLE_UNARY_FN_HPP_INCLUDED
+#define BOOST_RANGE_DETAIL_DEFAULT_CONSTRUCTIBLE_UNARY_FN_HPP_INCLUDED
+
+#include <boost/optional/optional.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/has_trivial_constructor.hpp>
+
+namespace boost
+{
+    namespace range_detail
+    {
+
+template<typename F, typename R>
+class default_constructible_unary_fn_wrapper
+{
+public:
+    typedef R result_type;
+
+    default_constructible_unary_fn_wrapper()
+    {
+    }
+    default_constructible_unary_fn_wrapper(const F& source)
+        : m_impl(source)
+    {
+    }
+    template<typename Arg>
+    R operator()(const Arg& arg) const
+    {
+        BOOST_ASSERT(m_impl);
+        return (*m_impl)(arg);
+    }
+    template<typename Arg>
+    R operator()(Arg& arg) const
+    {
+        BOOST_ASSERT(m_impl);
+        return (*m_impl)(arg);
+    }
+private:
+    boost::optional<F> m_impl;
+};
+
+template<typename F, typename R>
+struct default_constructible_unary_fn_gen
+{
+    typedef typename boost::mpl::if_<
+        boost::has_trivial_default_constructor<F>,
+        F,
+        default_constructible_unary_fn_wrapper<F,R>
+    >::type type;
+};
+
+    } // namespace range_detail
+} // namespace boost
+
+#endif // include guard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/has_member_size.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+// Boost.Range library
+//
+// Copyright Neil Groves 2014.
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP
+#define BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP
+
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost
+{
+    namespace range_detail
+    {
+
+template<class T>
+class has_member_size_impl
+{
+private:
+    template<class U, U>
+    class check
+    {
+    };
+
+    template<class C>
+    static boost::uint8_t f(check<std::size_t(C::*)(void) const, &C::size>*);
+
+    template<class C>
+    static boost::uint16_t f(...);
+
+public:
+    static const bool value =
+        (sizeof(f<T>(0)) == sizeof(boost::uint8_t));
+
+    typedef typename mpl::if_c<
+        (sizeof(f<T>(0)) == sizeof(boost::uint8_t)),
+        mpl::true_,
+        mpl::false_
+    >::type type;
+};
+
+template<class T>
+struct has_member_size
+{
+    typedef typename mpl::and_<
+        typename is_class<T>::type,
+        typename has_member_size_impl<const T>::type
+    >::type type;
+
+    static const bool value =
+        is_class<T>::value && has_member_size_impl<const T>::value;
+};
+
+    } // namespace range_detail
+}// namespace boost
+ 
+#endif // include guard
--- a/DEPENDENCIES/generic/include/boost/range/detail/iterator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-// Boost.Range library
-//
-//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
-//  distribution is subject to the Boost Software License, Version
-//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see http://www.boost.org/libs/range/
-//
-
-#ifndef BOOST_RANGE_DETAIL_ITERATOR_HPP
-#define BOOST_RANGE_DETAIL_ITERATOR_HPP
-
-#include <boost/range/detail/common.hpp>
-#include <boost/range/detail/remove_extent.hpp>
-
-#include <boost/static_assert.hpp>
-
-//////////////////////////////////////////////////////////////////////////////
-// missing partial specialization  workaround.
-//////////////////////////////////////////////////////////////////////////////
-
-namespace boost 
-{
-    namespace range_detail 
-    {        
-        template< typename T >
-        struct range_iterator_ {
-            template< typename C >
-            struct pts
-            {
-                typedef int type;
-            };
-        };
-
-        template<>
-        struct range_iterator_<std_container_>
-        {
-            template< typename C >
-            struct pts
-            {
-                typedef BOOST_RANGE_DEDUCED_TYPENAME C::iterator type;
-            };
-        };
-
-        template<>
-        struct range_iterator_<std_pair_>
-        {
-            template< typename P >
-            struct pts
-            {
-                typedef BOOST_RANGE_DEDUCED_TYPENAME P::first_type type;
-            };
-        };
-
-        template<>
-        struct range_iterator_<array_>
-        { 
-            template< typename T >
-            struct pts
-            {
-                typedef BOOST_RANGE_DEDUCED_TYPENAME 
-                    remove_extent<T>::type* type;
-            };
-        };
-        
-    } 
-
-    template< typename C >
-    class range_mutable_iterator
-    {
-        typedef BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type c_type;
-    public:
-        typedef typename range_detail::range_iterator_<c_type>::BOOST_NESTED_TEMPLATE pts<C>::type type; 
-    };
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/detail/msvc_has_iterator_workaround.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,132 @@
+// Boost.Range library
+//
+//  Copyright Eric Niebler 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+
+#ifndef BOOST_RANGE_DETAIL_MSVC_HAS_ITERATOR_WORKAROUND_HPP
+#define BOOST_RANGE_DETAIL_MSVC_HAS_ITERATOR_WORKAROUND_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#ifndef BOOST_RANGE_MUTABLE_ITERATOR_HPP
+# error This file should only be included from <boost/range/mutable_iterator.hpp>
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
+namespace boost
+{
+namespace cb_details
+{
+    template <class Buff, class Traits>
+    struct iterator;
+}
+
+namespace python
+{
+    template <class Container
+              , class NextPolicies /*= objects::default_iterator_call_policies*/>
+    struct iterator;
+}
+
+namespace type_erasure
+{
+    template<
+        class Traversal,
+        class T                 /*= _self*/,
+        class Reference         /*= ::boost::use_default*/,
+        class DifferenceType    /*= ::std::ptrdiff_t*/,
+        class ValueType         /*= typename deduced<iterator_value_type<T> >::type*/
+    >
+    struct iterator;
+}
+
+namespace unordered { namespace iterator_detail
+{
+    template <typename Node>
+    struct iterator;
+}}
+
+namespace container { namespace container_detail
+{
+    template<class IIterator, bool IsConst>
+    class iterator;
+}}
+
+namespace spirit { namespace lex { namespace lexertl
+{
+    template <typename Functor>
+    class iterator;
+}}}
+
+namespace range_detail
+{
+    template <class Buff, class Traits>
+    struct has_iterator< ::boost::cb_details::iterator<Buff, Traits> >
+      : mpl::false_
+    {};
+
+    template <class Buff, class Traits>
+    struct has_iterator< ::boost::cb_details::iterator<Buff, Traits> const>
+      : mpl::false_
+    {};
+
+    template <class Container, class NextPolicies>
+    struct has_iterator< ::boost::python::iterator<Container, NextPolicies> >
+      : mpl::false_
+    {};
+
+    template <class Container, class NextPolicies>
+    struct has_iterator< ::boost::python::iterator<Container, NextPolicies> const>
+      : mpl::false_
+    {};
+
+    template<class Traversal, class T, class Reference, class DifferenceType, class ValueType>
+    struct has_iterator< ::boost::type_erasure::iterator<Traversal, T, Reference, DifferenceType, ValueType> >
+      : mpl::false_
+    {};
+
+    template<class Traversal, class T, class Reference, class DifferenceType, class ValueType>
+    struct has_iterator< ::boost::type_erasure::iterator<Traversal, T, Reference, DifferenceType, ValueType> const>
+      : mpl::false_
+    {};
+
+    template <typename Node>
+    struct has_iterator< ::boost::unordered::iterator_detail::iterator<Node> >
+      : mpl::false_
+    {};
+
+    template <typename Node>
+    struct has_iterator< ::boost::unordered::iterator_detail::iterator<Node> const>
+      : mpl::false_
+    {};
+
+    template<class IIterator, bool IsConst>
+    struct has_iterator< ::boost::container::container_detail::iterator<IIterator, IsConst> >
+      : mpl::false_
+    {};
+
+    template<class IIterator, bool IsConst>
+    struct has_iterator< ::boost::container::container_detail::iterator<IIterator, IsConst> const>
+      : mpl::false_
+    {};
+
+    template <typename Functor>
+    struct has_iterator< ::boost::spirit::lex::lexertl::iterator<Functor> >
+      : mpl::false_
+    {};
+
+    template <typename Functor>
+    struct has_iterator< ::boost::spirit::lex::lexertl::iterator<Functor> const>
+      : mpl::false_
+    {};
+}
+}
+#endif
+#endif
--- a/DEPENDENCIES/generic/include/boost/range/detail/size.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-// Boost.Range library
-//
-//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
-//  distribution is subject to the Boost Software License, Version
-//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see http://www.boost.org/libs/range/
-//
-
-
-#ifndef BOOST_RANGE_DETAIL_SIZE_HPP
-#define BOOST_RANGE_DETAIL_SIZE_HPP
-
-#include <boost/config.hpp> // BOOST_MSVC
-#include <boost/detail/workaround.hpp>
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-# include <boost/range/detail/vc6/size.hpp>
-#else
-# include <boost/range/detail/implementation_help.hpp>
-# include <boost/range/detail/size_type.hpp>
-# include <boost/range/detail/common.hpp>
-# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
-#  include <boost/range/detail/remove_extent.hpp>
-# endif
-# include <iterator>
-
-namespace boost 
-{
-    namespace range_detail
-    {
-        template< typename T >
-        struct range_size_;
-
-        //////////////////////////////////////////////////////////////////////
-        // default
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_size_<std_container_>
-        {
-            template< typename C >
-            static BOOST_RANGE_DEDUCED_TYPENAME C::size_type fun( const C& c )
-            {
-                return c.size();
-            };
-        };
-                    
-        //////////////////////////////////////////////////////////////////////
-        // pair
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_size_<std_pair_>
-        {
-            template< typename P >
-            static BOOST_RANGE_DEDUCED_TYPENAME range_size<P>::type 
-            fun( const P& p )
-            {
-                return std::distance( p.first, p.second );
-            }
-        };
- 
-        //////////////////////////////////////////////////////////////////////
-        // array
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_size_<array_>
-        {
-        #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
-            template< typename T, std::size_t sz >
-            static std::size_t fun( T BOOST_RANGE_ARRAY_REF()[sz] )
-            {
-                return sz;
-            }
-        #else
-            template<typename T>
-            static std::size_t fun(T& t)
-            {
-                return remove_extent<T>::size;
-            }
-        #endif
-        };
-        
-        template<>
-        struct range_size_<char_array_>
-        {
-            template< typename T, std::size_t sz >
-            static std::size_t fun( T BOOST_RANGE_ARRAY_REF()[sz] )
-            {
-                return boost::range_detail::array_size( boost_range_array );
-            }
-        };
-        
-        template<>
-        struct range_size_<wchar_t_array_>
-        {
-            template< typename T, std::size_t sz >
-            static std::size_t fun( T BOOST_RANGE_ARRAY_REF()[sz] )
-            {
-                return boost::range_detail::array_size( boost_range_array );
-            }
-        };
-
-        //////////////////////////////////////////////////////////////////////
-        // string
-        //////////////////////////////////////////////////////////////////////
-
-        template<>
-        struct range_size_<char_ptr_>
-        {
-            static std::size_t fun( const char* s )
-            {
-                return boost::range_detail::str_size( s );
-            }
-        };
-
-        template<>
-        struct range_size_<const_char_ptr_>
-        {
-            static std::size_t fun( const char* s )
-            {
-                return boost::range_detail::str_size( s );
-            }
-        };
-        
-        template<>
-        struct range_size_<wchar_t_ptr_>
-        {
-            static std::size_t fun( const wchar_t* s )
-            {
-                return boost::range_detail::str_size( s );
-            }
-        };
-
-        template<>
-        struct range_size_<const_wchar_t_ptr_>
-        {
-            static std::size_t fun( const wchar_t* s )
-            {
-                return boost::range_detail::str_size( s );
-            }
-        };
-  
-    } // namespace 'range_detail'
-    
-
-    template< typename C >
-    BOOST_RANGE_DEDUCED_TYPENAME range_size<C>::type 
-    size( const C& c )
-    {
-        return range_detail::range_size_<  BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type >::fun( c );
-    }
-    
-} // namespace 'boost'
-
-# endif
-#endif
--- a/DEPENDENCIES/generic/include/boost/range/detail/vc6/end.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-// Boost.Range library
-//
-//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
-//  distribution is subject to the Boost Software License, Version
-//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see http://www.boost.org/libs/range/
-//
-
-#ifndef BOOST_RANGE_DETAIL_VC6_END_HPP
-#define BOOST_RANGE_DETAIL_VC6_END_HPP
-
-#include <boost/range/detail/implementation_help.hpp>
-#include <boost/range/detail/implementation_help.hpp>
-#include <boost/range/result_iterator.hpp>
-#include <boost/range/detail/common.hpp>
-#include <boost/range/detail/remove_extent.hpp>
-
-namespace boost 
-{
-    namespace range_detail
-    {
-        template< typename T >
-        struct range_end;
-
-        //////////////////////////////////////////////////////////////////////
-        // default
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_end<std_container_>
-        {
-            template< typename C >
-            struct inner {
-                static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type 
-                fun( C& c )
-                {
-                    return c.end();
-                };
-            };
-        };
-                    
-        //////////////////////////////////////////////////////////////////////
-        // pair
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_end<std_pair_>
-        {
-            template< typename P >
-            struct inner {
-                static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<P>::type 
-                fun( const P& p )
-                {
-                    return p.second;
-                }
-            };
-        };
- 
-        //////////////////////////////////////////////////////////////////////
-        // array
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_end<array_>  
-        {
-            template< typename T >
-            struct inner {
-                static BOOST_DEDUCED_TYPENAME remove_extent<T>::type*
-                fun(T& t)
-                {
-                    return t + remove_extent<T>::size;
-                }
-            };
-        };
-
-                
-        template<>
-        struct range_end<char_array_>
-        {
-            template< typename T >
-            struct inner {
-                static BOOST_DEDUCED_TYPENAME remove_extent<T>::type*
-                fun(T& t)
-                {
-                    return t + remove_extent<T>::size;
-                }
-            };
-        };
-        
-        template<>
-        struct range_end<wchar_t_array_>
-        {
-            template< typename T >
-            struct inner {
-                static BOOST_DEDUCED_TYPENAME remove_extent<T>::type*
-                fun(T& t)
-                {
-                    return t + remove_extent<T>::size;
-                }
-            };
-        };
-
-        //////////////////////////////////////////////////////////////////////
-        // string
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_end<char_ptr_>
-        {
-            template< typename T >
-            struct inner {
-                static char* fun( char* s )
-                {
-                    return boost::range_detail::str_end( s );
-                }
-            };
-        };
-
-        template<>
-        struct range_end<const_char_ptr_>
-        {
-            template< typename T >
-            struct inner {
-                static const char* fun( const char* s )
-                {
-                    return boost::range_detail::str_end( s );
-                }
-            };
-        };
-
-        template<>
-        struct range_end<wchar_t_ptr_>
-        {
-            template< typename T >
-            struct inner {
-                static wchar_t* fun( wchar_t* s )
-                {
-                    return boost::range_detail::str_end( s );
-                }
-            };
-        };
-
-
-        template<>
-        struct range_end<const_wchar_t_ptr_>
-        {
-            template< typename T >
-            struct inner {
-                static const wchar_t* fun( const wchar_t* s )
-                {
-                    return boost::range_detail::str_end( s );
-                }
-            };
-        };
-        
-    } // namespace 'range_detail'
-    
-    template< typename C >
-    inline BOOST_DEDUCED_TYPENAME range_result_iterator<C>::type 
-    end( C& c )
-    {
-        return range_detail::range_end<range_detail::range<C>::type>::inner<C>::fun( c );
-    }
-    
-} // namespace 'boost'
-
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/range/detail/vc6/size.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-// Boost.Range library
-//
-//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
-//  distribution is subject to the Boost Software License, Version
-//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-// For more information, see http://www.boost.org/libs/range/
-//
-
-
-#ifndef BOOST_RANGE_DETAIL_VC6_SIZE_HPP
-#define BOOST_RANGE_DETAIL_VC6_SIZE_HPP
-
-#include <boost/range/detail/implementation_help.hpp>
-#include <boost/range/detail/size_type.hpp>
-#include <boost/range/detail/common.hpp>
-#include <boost/range/detail/remove_extent.hpp>
-#include <iterator>
-
-namespace boost 
-{
-    namespace range_detail
-    {
-        template< typename T >
-        struct range_size_;
-
-        //////////////////////////////////////////////////////////////////////
-        // default
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_size_<std_container_>
-        {
-            template< typename C >
-            struct inner {
-                static BOOST_RANGE_DEDUCED_TYPENAME C::size_type fun( const C& c )
-                {
-                    return c.size();
-                };
-            };
-        };
-                    
-        //////////////////////////////////////////////////////////////////////
-        // pair
-        //////////////////////////////////////////////////////////////////////
-        
-        template<>
-        struct range_size_<std_pair_>
-        {
-            template< typename P >
-            struct inner {
-                static BOOST_RANGE_DEDUCED_TYPENAME range_size<P>::type 
-                fun( const P& p )
-                {
-                    return std::distance( p.first, p.second );
-                }
-            };
-        };
- 
-        //////////////////////////////////////////////////////////////////////
-        // array
-        //////////////////////////////////////////////////////////////////////
-
-        template<>
-        struct range_size_<array_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun(T& t)
-                {
-                    return remove_extent<T>::size;
-                }
-            };
-        };
-        
-        template<>
-        struct range_size_<char_array_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun(T& t)
-                {
-                    return sizeof(T) / sizeof(T[0]);
-                }
-            };
-        };
-        
-        template<>
-        struct range_size_<wchar_t_array_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun(T& t)
-                {
-                    return sizeof(T) / sizeof(T[0]);
-                }
-            };
-        };
-
-        //////////////////////////////////////////////////////////////////////
-        // string
-        //////////////////////////////////////////////////////////////////////
-
-        template<>
-        struct range_size_<char_ptr_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun( const char* s )
-                {
-                    return boost::range_detail::str_size( s );
-                }
-            };
-        };
-
-        template<>
-        struct range_size_<const_char_ptr_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun( const char* s )
-                {
-                    return boost::range_detail::str_size( s );
-                }
-            };
-        };
-        
-        template<>
-        struct range_size_<wchar_t_ptr_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun( const wchar_t* s )
-                {
-                    return boost::range_detail::str_size( s );
-                }
-            };
-        };
-
-        template<>
-        struct range_size_<const_wchar_t_ptr_>
-        {
-            template<typename T>
-            struct inner {
-                static std::size_t fun( const wchar_t* s )
-                {
-                    return boost::range_detail::str_size( s );
-                }
-            };
-        };
-  
-    } // namespace 'range_detail'
-    
-
-    template< typename C >
-    BOOST_RANGE_DEDUCED_TYPENAME range_size<C>::type 
-    size( const C& c )
-    {
-        return range_detail::range_size_<range_detail::range<C>::type>::inner<C>::fun( c );
-    }
-    
-} // namespace 'boost'
-
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/iterator_range_hash.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,22 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014
+//  Use, modification and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/functional/hash.hpp>
+
+namespace boost
+{
+
+template<class T>
+std::size_t hash_value(const iterator_range<T>& rng)
+{
+    return boost::hash_range(rng.begin(), rng.end());
+}
+
+} // namespace boost
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/mfc_map.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,114 @@
+// Boost.Range library
+//
+//  Copyright Adam D. Walling 2012. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+
+#ifndef BOOST_RANGE_ADAPTOR_MFC_MAP_HPP
+#define BOOST_RANGE_ADAPTOR_MFC_MAP_HPP
+
+#if !defined(BOOST_RANGE_MFC_NO_CPAIR)
+
+#include <boost/range/mfc.hpp>
+#include <boost/range/adaptor/map.hpp>
+
+namespace boost
+{
+    namespace range_detail
+    {
+        // CMap and CMapStringToString range iterators return CPair,
+        // which has a key and value member. Other MFC range iterators
+        // already return adapted std::pair objects. This allows usage
+        // of the map_keys and map_values range adaptors with CMap 
+        // and CMapStringToString
+        
+        // CPair has a VALUE value member, and a KEY key member; we will
+        // use VALUE& as the result_type consistent with CMap::operator[]
+        
+        // specialization for CMap 
+        template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
+        struct select_first< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
+        {
+            typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
+            typedef BOOST_DEDUCED_TYPENAME range_reference<const map_type>::type argument_type;
+            typedef BOOST_DEDUCED_TYPENAME const KEY& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.key;
+            }
+        };
+
+        template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
+        struct select_second_mutable< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
+        {
+            typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
+            typedef BOOST_DEDUCED_TYPENAME range_reference<map_type>::type argument_type;
+            typedef BOOST_DEDUCED_TYPENAME VALUE& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.value;
+            }
+        };
+
+        template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
+        struct select_second_const< CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> >
+        {
+            typedef BOOST_DEDUCED_TYPENAME CMap<KEY, ARG_KEY, VALUE, ARG_VALUE> map_type;
+            typedef BOOST_DEDUCED_TYPENAME range_reference<const map_type>::type argument_type;
+            typedef BOOST_DEDUCED_TYPENAME const VALUE& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.value;
+            }
+        };
+
+
+        // specialization for CMapStringToString
+        template<>
+        struct select_first< CMapStringToString >
+        {
+            typedef range_reference<const CMapStringToString>::type argument_type;
+            typedef const CString& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.key;
+            }
+        };
+
+        template<>
+        struct select_second_mutable< CMapStringToString >
+        {
+            typedef range_reference<CMapStringToString>::type argument_type;
+            typedef CString& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.value;
+            }
+        };
+
+        template<>
+        struct select_second_const< CMapStringToString >
+        {
+            typedef range_reference<const CMapStringToString>::type argument_type;
+            typedef const CString& result_type;
+
+            result_type operator()( argument_type r ) const
+            {
+                return r.value;
+            }
+        };
+    } // 'range_detail'
+} // 'boost'
+
+#endif // !defined(BOOST_RANGE_MFC_NO_CPAIR)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/range_fwd.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2003-2004.
+//  Use, modification and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+#ifndef BOOST_RANGE_RANGE_FWD_HPP_INCLUDED
+#define BOOST_RANGE_RANGE_FWD_HPP_INCLUDED
+
+namespace boost
+{
+
+// Extension points
+    template<typename C, typename Enabler>
+    struct range_iterator;
+
+    template<typename C, typename Enabler>
+    struct range_mutable_iterator;
+
+    template<typename C, typename Enabler>
+    struct range_const_iterator;
+
+// Core classes
+    template<typename IteratorT>
+    class iterator_range;
+
+    template<typename ForwardRange>
+    class sub_range;
+
+// Meta-functions
+    template<typename T>
+    struct range_category;
+
+    template<typename T>
+    struct range_difference;
+
+    template<typename T>
+    struct range_pointer;
+
+    template<typename T>
+    struct range_reference;
+
+    template<typename T>
+    struct range_reverse_iterator;
+
+    template<typename T>
+    struct range_size;
+
+    template<typename T>
+    struct range_value;
+
+    template<typename T>
+    struct has_range_iterator;
+
+    template<typename T>
+    struct has_range_const_iterator;
+
+} // namespace boost
+
+#endif // include guard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/range/traversal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+// Boost.Range library
+//
+//  Copyright Neil Groves 2014. Use, modification and
+//  distribution is subject to the Boost Software License, Version
+//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see http://www.boost.org/libs/range/
+//
+
+#ifndef BOOST_RANGE_TRAVERSAL_HPP
+#define BOOST_RANGE_TRAVERSAL_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/range/config.hpp>
+#include <boost/range/iterator.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost
+{
+    template<typename SinglePassRange>
+    struct range_traversal
+        : iterator_traversal<typename range_iterator<SinglePassRange>::type>
+    {
+    };
+}
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/ratio/ratio_static_string.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,631 +0,0 @@
-//  ratio_io
-//
-//  (C) Copyright 2010 Vicente J. Botet Escriba
-//  Use, modification and distribution are subject to the Boost Software License,
-//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt).
-//
-// This code was adapted by Vicente from Howard Hinnant's experimental work
-// on chrono i/o under lvm/libc++ to Boost
-
-#ifndef BOOST_RATIO_RATIO_STATIC_STRING_HPP
-#define BOOST_RATIO_RATIO_STATIC_STRING_HPP
-
-/*
-
-    ratio_static_string synopsis
-
-#include <ratio>
-#include <string>
-
-namespace boost
-{
-
-template <class Ratio, class CharT>
-struct ratio_static_string
-{
-    typedef basic_str<CharT, ...> short_name;
-    typedef basic_str<CharT, ...> long_name;
-};
-
-}  // boost
-
-*/
-
-#include <boost/config.hpp>
-#include <boost/ratio/ratio.hpp>
-#include <boost/static_string/basic_str.hpp>
-//#include <sstream>
-
-
-#if defined(BOOST_NO_CXX11_UNICODE_LITERALS) || defined(BOOST_NO_CXX11_CHAR16_T) || defined(BOOST_NO_CXX11_CHAR32_T)
-//~ #define BOOST_RATIO_HAS_UNICODE_SUPPORT
-#else
-#define BOOST_RATIO_HAS_UNICODE_SUPPORT 1
-#endif
-
-namespace boost {
-
-template <class Ratio, class CharT>
-struct ratio_static_string;
-
-
-// atto
-
-template <>
-struct ratio_static_string<atto, char>
-{
-    typedef static_string::str_1<'a'>::type short_name;
-    typedef static_string::str_4<'a','t','t','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<atto, char16_t>
-{
-    typedef static_string::u16str_1<u'a'>::type short_name;
-    typedef static_string::u16str_4<u'a',u't',u't',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<atto, char32_t>
-{
-    typedef static_string::u32str_1<U'a'>::type short_name;
-    typedef static_string::u32str_4<U'a',U't',U't',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<atto, wchar_t>
-{
-    typedef static_string::wstr_1<L'a'>::type short_name;
-    typedef static_string::wstr_4<L'a',L't',L't',L'o'>::type long_name;
-};
-#endif
-
-// femto
-
-template <>
-struct ratio_static_string<femto, char>
-{
-    typedef static_string::str_1<'f'>::type short_name;
-    typedef static_string::str_5<'f','e','m','t','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<femto, char16_t>
-{
-    typedef static_string::u16str_1<u'f'>::type short_name;
-    typedef static_string::u16str_5<u'f',u'e',u'm',u't',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<femto, char32_t>
-{
-    typedef static_string::u32str_1<U'f'>::type short_name;
-    typedef static_string::u32str_5<U'f',U'e',U'm',U't',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<femto, wchar_t>
-{
-    typedef static_string::wstr_1<L'f'>::type short_name;
-    typedef static_string::wstr_5<L'f',L'e',L'm',L't',L'o'>::type long_name;
-};
-#endif
-
-// pico
-
-template <>
-struct ratio_static_string<pico, char>
-{
-    typedef static_string::str_1<'p'>::type short_name;
-    typedef static_string::str_4<'p','i','c','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<pico, char16_t>
-{
-    typedef static_string::u16str_1<u'p'>::type short_name;
-    typedef static_string::u16str_4<u'p',u'i',u'c',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<pico, char32_t>
-{
-    typedef static_string::u32str_1<U'p'>::type short_name;
-    typedef static_string::u32str_4<U'p',U'i',U'c',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<pico, wchar_t>
-{
-    typedef static_string::wstr_1<L'p'>::type short_name;
-    typedef static_string::wstr_4<L'p',L'i',L'c',L'o'>::type long_name;
-};
-#endif
-
-// nano
-
-template <>
-struct ratio_static_string<nano, char>
-{
-    typedef static_string::str_1<'n'>::type short_name;
-    typedef static_string::str_4<'n','a','n','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<nano, char16_t>
-{
-    typedef static_string::u16str_1<u'n'>::type short_name;
-    typedef static_string::u16str_4<u'n',u'a',u'n',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<nano, char32_t>
-{
-    typedef static_string::u32str_1<U'n'>::type short_name;
-    typedef static_string::u32str_4<U'n',U'a',U'n',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<nano, wchar_t>
-{
-    typedef static_string::wstr_1<L'n'>::type short_name;
-    typedef static_string::wstr_4<L'n',L'a',L'n',L'o'>::type long_name;
-};
-#endif
-
-// micro
-
-template <>
-struct ratio_static_string<micro, char>
-{
-    typedef static_string::str_2<'\xC2','\xB5'>::type short_name;
-    typedef static_string::str_5<'m','i','c','r','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<micro, char16_t>
-{
-    typedef static_string::u16str_1<u'\xB5'>::type short_name;
-    typedef static_string::u16str_5<u'm',u'i',u'c',u'r',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<micro, char32_t>
-{
-    typedef static_string::u32str_1<U'\xB5'>::type short_name;
-    typedef static_string::u32str_5<U'm',U'i',U'c',U'r',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<micro, wchar_t>
-{
-    typedef static_string::wstr_1<L'\xB5'>::type short_name;
-    typedef static_string::wstr_5<L'm',L'i',L'c',L'r',L'o'>::type long_name;
-};
-#endif
-
-// milli
-
-template <>
-struct ratio_static_string<milli, char>
-{
-    typedef static_string::str_1<'m'>::type short_name;
-    typedef static_string::str_5<'m','i','l','l','i'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<milli, char16_t>
-{
-    typedef static_string::u16str_1<u'm'>::type short_name;
-    typedef static_string::u16str_5<u'm',u'i',u'l',u'l',u'i'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<milli, char32_t>
-{
-    typedef static_string::u32str_1<U'm'>::type short_name;
-    typedef static_string::u32str_5<U'm',U'i',U'l',U'l',U'i'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<milli, wchar_t>
-{
-    typedef static_string::wstr_1<L'm'>::type short_name;
-    typedef static_string::wstr_5<L'm',L'i',L'l',L'l',L'i'>::type long_name;
-};
-#endif
-
-// centi
-
-template <>
-struct ratio_static_string<centi, char>
-{
-    typedef static_string::str_1<'c'>::type short_name;
-    typedef static_string::str_5<'c','e','n','t','i'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<centi, char16_t>
-{
-    typedef static_string::u16str_1<u'c'>::type short_name;
-    typedef static_string::u16str_5<u'c',u'e',u'n',u't',u'i'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<centi, char32_t>
-{
-    typedef static_string::u32str_1<U'c'>::type short_name;
-    typedef static_string::u32str_5<U'c',U'e',U'n',U't',U'i'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<centi, wchar_t>
-{
-    typedef static_string::wstr_1<L'c'>::type short_name;
-    typedef static_string::wstr_5<L'c',L'e',L'n',L't',L'i'>::type long_name;
-};
-#endif
-
-// deci
-
-template <>
-struct ratio_static_string<deci, char>
-{
-    typedef static_string::str_1<'d'>::type short_name;
-    typedef static_string::str_4<'d','e','c','i'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<deci, char16_t>
-{
-    typedef static_string::u16str_1<u'd'>::type short_name;
-    typedef static_string::u16str_4<u'd',u'e',u'c',u'i'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<deci, char32_t>
-{
-    typedef static_string::u32str_1<U'd'>::type short_name;
-    typedef static_string::u32str_4<U'd',U'e',U'c',U'i'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<deci, wchar_t>
-{
-    typedef static_string::wstr_1<L'd'>::type short_name;
-    typedef static_string::wstr_4<L'd',L'e',L'c',L'i'>::type long_name;
-};
-#endif
-
-// deca
-
-template <>
-struct ratio_static_string<deca, char>
-{
-    typedef static_string::str_2<'d','a'>::type short_name;
-    typedef static_string::str_4<'d','e','c','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<deca, char16_t>
-{
-    typedef static_string::u16str_2<u'd',u'a'>::type short_name;
-    typedef static_string::u16str_4<u'd',u'e',u'c',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<deca, char32_t>
-{
-    typedef static_string::u32str_2<U'd',U'a'>::type short_name;
-    typedef static_string::u32str_4<U'd',U'e',U'c',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<deca, wchar_t>
-{
-    typedef static_string::wstr_2<L'd',L'a'>::type short_name;
-    typedef static_string::wstr_4<L'd',L'e',L'c',L'a'>::type long_name;
-};
-#endif
-
-// hecto
-
-template <>
-struct ratio_static_string<hecto, char>
-{
-    typedef static_string::str_1<'h'>::type short_name;
-    typedef static_string::str_5<'h','e','c','t','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<hecto, char16_t>
-{
-    typedef static_string::u16str_1<u'h'>::type short_name;
-    typedef static_string::u16str_5<u'h',u'e',u'c',u't',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<hecto, char32_t>
-{
-    typedef static_string::u32str_1<U'h'>::type short_name;
-    typedef static_string::u32str_5<U'h',U'e',U'c',U't',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<hecto, wchar_t>
-{
-    typedef static_string::wstr_1<L'h'>::type short_name;
-    typedef static_string::wstr_5<L'h',L'e',L'c',L't',L'o'>::type long_name;
-};
-#endif
-
-// kilo
-
-template <>
-struct ratio_static_string<kilo, char>
-{
-    typedef static_string::str_1<'k'>::type short_name;
-    typedef static_string::str_4<'k','i','l','o'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<kilo, char16_t>
-{
-    typedef static_string::u16str_1<u'k'>::type short_name;
-    typedef static_string::u16str_4<u'k',u'i',u'l',u'o'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<kilo, char32_t>
-{
-    typedef static_string::u32str_1<U'k'>::type short_name;
-    typedef static_string::u32str_4<U'k',U'i',U'l',U'o'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<kilo, wchar_t>
-{
-    typedef static_string::wstr_1<L'k'>::type short_name;
-    typedef static_string::wstr_4<L'k',L'i',L'l',L'o'>::type long_name;
-};
-#endif
-
-// mega
-
-template <>
-struct ratio_static_string<mega, char>
-{
-    typedef static_string::str_1<'M'>::type short_name;
-    typedef static_string::str_4<'m','e','g','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<mega, char16_t>
-{
-    typedef static_string::u16str_1<u'M'>::type short_name;
-    typedef static_string::u16str_4<u'm',u'e',u'g',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<mega, char32_t>
-{
-    typedef static_string::u32str_1<U'M'>::type short_name;
-    typedef static_string::u32str_4<U'm',U'e',U'g',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<mega, wchar_t>
-{
-    typedef static_string::wstr_1<L'M'>::type short_name;
-    typedef static_string::wstr_4<L'm',L'e',L'g',L'a'>::type long_name;
-};
-#endif
-
-// giga
-
-template <>
-struct ratio_static_string<giga, char>
-{
-    typedef static_string::str_1<'G'>::type short_name;
-    typedef static_string::str_4<'g','i','g','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<giga, char16_t>
-{
-    typedef static_string::u16str_1<u'G'>::type short_name;
-    typedef static_string::u16str_4<u'g',u'i',u'g',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<giga, char32_t>
-{
-    typedef static_string::u32str_1<U'G'>::type short_name;
-    typedef static_string::u32str_4<U'g',U'i',U'g',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<giga, wchar_t>
-{
-    typedef static_string::wstr_1<L'G'>::type short_name;
-    typedef static_string::wstr_4<L'g',L'i',L'g',L'a'>::type long_name;
-};
-#endif
-
-// tera
-
-template <>
-struct ratio_static_string<tera, char>
-{
-    typedef static_string::str_1<'T'>::type short_name;
-    typedef static_string::str_4<'t','e','r','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<tera, char16_t>
-{
-    typedef static_string::u16str_1<u'T'>::type short_name;
-    typedef static_string::u16str_4<u't',u'e',u'r',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<tera, char32_t>
-{
-    typedef static_string::u32str_1<U'T'>::type short_name;
-    typedef static_string::u32str_4<U't',U'e',U'r',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<tera, wchar_t>
-{
-    typedef static_string::wstr_1<L'T'>::type short_name;
-    typedef static_string::wstr_4<L'r',L'e',L'r',L'a'>::type long_name;
-};
-#endif
-
-// peta
-
-template <>
-struct ratio_static_string<peta, char>
-{
-    typedef static_string::str_1<'P'>::type short_name;
-    typedef static_string::str_4<'p','e','t','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<peta, char16_t>
-{
-    typedef static_string::u16str_1<u'P'>::type short_name;
-    typedef static_string::u16str_4<u'p',u'e',u't',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<peta, char32_t>
-{
-    typedef static_string::u32str_1<U'P'>::type short_name;
-    typedef static_string::u32str_4<U'p',U'e',U't',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<peta, wchar_t>
-{
-    typedef static_string::wstr_1<L'P'>::type short_name;
-    typedef static_string::wstr_4<L'p',L'e',L't',L'a'>::type long_name;
-};
-#endif
-
-// exa
-
-template <>
-struct ratio_static_string<exa, char>
-{
-    typedef static_string::str_1<'E'>::type short_name;
-    typedef static_string::str_3<'e','x','a'>::type long_name;
-};
-
-#ifdef BOOST_RATIO_HAS_UNICODE_SUPPORT
-
-template <>
-struct ratio_static_string<exa, char16_t>
-{
-    typedef static_string::u16str_1<u'E'>::type short_name;
-    typedef static_string::u16str_3<u'e',u'x',u'a'>::type long_name;
-};
-
-template <>
-struct ratio_static_string<exa, char32_t>
-{
-    typedef static_string::u32str_1<U'E'>::type short_name;
-    typedef static_string::u32str_3<U'e',U'x',U'a'>::type long_name;
-};
-
-#endif
-
-#ifndef BOOST_NO_STD_WSTRING
-template <>
-struct ratio_static_string<exa, wchar_t>
-{
-    typedef static_string::wstr_1<L'E'>::type short_name;
-    typedef static_string::wstr_3<L'e',L'x',L'a'>::type long_name;
-};
-#endif
-
-}
-
-#endif  // BOOST_RATIO_RATIO_STATIC_STRING_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/detail/is_default_constructible.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+#ifndef  BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP
+#define BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// is_default_constructible.hpp: serialization for loading stl collections
+//
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS
+    #include <type_traits>
+    namespace boost{
+    namespace serialization {
+    namespace detail {
+
+    template<typename T>
+    struct is_default_constructible : std::is_default_constructible<T> {};
+
+    } // detail
+    } // serializaition
+    } // boost
+#else
+    #include <boost/type_traits/has_trivial_constructor.hpp>
+    namespace boost{
+    namespace serialization {
+    namespace detail {
+
+    template<typename T>
+    struct is_default_constructible : boost::has_trivial_constructor<T> {};
+
+    } // detail
+    } // serializaition
+    } // boost
+#endif
+
+#endif //  BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/forward_list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,115 @@
+#ifndef BOOST_SERIALIZATION_FORWARD_LIST_HPP
+#define BOOST_SERIALIZATION_FORWARD_LIST_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// forward_list.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t
+#include <forward_list>
+#include <iterator>  // distance
+
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/archive/detail/basic_iarchive.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/item_version_type.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/detail/stack_constructor.hpp>
+#include <boost/serialization/detail/is_default_constructible.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::forward_list<U, Allocator> &t,
+    const unsigned int file_version
+){
+    const collection_size_type count(std::distance(t.cbegin(), t.cend()));
+    boost::serialization::stl::save_collection<
+        Archive,
+        std::forward_list<U, Allocator>
+    >(ar, t, count);
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::forward_list<U, Allocator> &t,
+    const unsigned int file_version
+){
+    const boost::archive::library_version_type library_version(
+        ar.get_library_version()
+    );
+    // retrieve number of elements
+    item_version_type item_version(0);
+    collection_size_type count;
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    if(boost::archive::library_version_type(3) < library_version){
+        ar >> BOOST_SERIALIZATION_NVP(item_version);
+    }
+    if(detail::is_default_constructible<U>()){
+        t.resize(count);
+        typename std::forward_list<U, Allocator>::iterator hint;
+        hint = t.begin();
+        while(count-- > 0){
+            ar >> boost::serialization::make_nvp("item", *hint++);
+        }
+    }
+    else{
+        t.clear();
+        boost::serialization::detail::stack_construct<Archive, U> u(ar, item_version);
+        ar >> boost::serialization::make_nvp("item", u.reference());
+        t.push_front(u.reference());
+        typename std::forward_list<U, Allocator>::iterator last;
+        last = t.begin();
+        ar.reset_object_address(&(*t.begin()) , & u.reference());
+        while(--count > 0){
+            detail::stack_construct<Archive, U> u(ar, item_version);
+            ar >> boost::serialization::make_nvp("item", u.reference());
+            last = t.insert_after(last, u.reference());
+            ar.reset_object_address(&(*last) , & u.reference());
+        }
+    }
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::forward_list<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::forward_list)
+
+#endif  // BOOST_SERIALIZATION_FORWARD_LIST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/priority_queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+#ifndef  BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP
+#define BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// priority_queue.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <queue>
+#include <boost/config.hpp>
+
+// function specializations must be defined in the appropriate
+// namespace - boost::serialization
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define STD _STLP_STD
+#else
+#define STD std
+#endif
+
+namespace boost { 
+namespace serialization {
+namespace detail{
+
+template <typename U, typename Container, typename Compare>
+struct priority_queue_save : public STD::priority_queue<U, Container, Compare> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) const {
+        save(ar, STD::priority_queue<U, Container, Compare>::c, file_version);
+    }
+};
+template <typename U, typename Container, typename Compare>
+struct priority_queue_load : public STD::priority_queue<U, Container, Compare> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) {
+        load(ar, STD::priority_queue<U, Container, Compare>::c, file_version);
+    }
+};
+
+} // detail
+
+template<class Archive, class T, class Container, class Compare>
+inline void serialize(
+    Archive & ar,
+    std::priority_queue< T, Container, Compare> & t,
+    const unsigned int file_version 
+){
+    typedef typename mpl::eval_if<
+        typename Archive::is_saving,
+        mpl::identity<detail::priority_queue_save<T, Container, Compare> >,
+        mpl::identity<detail::priority_queue_load<T, Container, Compare> >
+    >::type typex;
+    static_cast<typex &>(t)(ar, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(STD::priority_queue)
+
+#undef STD
+
+#endif // BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+#ifndef  BOOST_SERIALIZATION_QUEUE_HPP
+#define BOOST_SERIALIZATION_QUEUE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// queue.hpp
+
+// (C) Copyright 2014 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <queue>
+#include <boost/config.hpp>
+
+// function specializations must be defined in the appropriate
+// namespace - boost::serialization
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define STD _STLP_STD
+#else
+#define STD std
+#endif
+
+namespace boost { 
+namespace serialization {
+namespace detail {
+
+template <typename U, typename C>
+struct queue_save : public STD::queue<U, C> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) const {
+        save(ar, STD::queue<U, C>::c, file_version);
+    }
+};
+template <typename U, typename C>
+struct queue_load : public STD::queue<U, C> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) {
+        load(ar, STD::queue<U, C>::c, file_version);
+    }
+};
+
+} // detail
+
+template<class Archive, class T, class C>
+inline void serialize(
+    Archive & ar,
+    std::queue< T, C> & t,
+    const unsigned int file_version 
+){
+    typedef typename mpl::eval_if<
+        typename Archive::is_saving,
+        mpl::identity<detail::queue_save<T, C> >,
+        mpl::identity<detail::queue_load<T, C> >
+    >::type typex;
+    static_cast<typex &>(t)(ar, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(STD::queue)
+
+#undef STD
+
+#endif // BOOST_SERIALIZATION_QUEUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/shared_ptr_helper.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,212 @@
+#ifndef BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
+#define BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr_helper.hpp: serialization for boost shared pointern
+
+// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+#include <list>
+#include <utility>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/decl.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last headern
+
+namespace boost_132 {
+    template<class T> class shared_ptr;
+}
+namespace boost {
+namespace serialization {
+
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+template<class Archive, template<class U> class SPT >
+void load(
+    Archive & ar,
+    SPT< class U > &t,
+    const unsigned int file_version
+);
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// a common class for holding various types of shared pointers
+
+template<template<class T> class SPT>
+class shared_ptr_helper {
+    typedef std::map<
+        const void *, // address of object
+        SPT<void> // address shared ptr to single instance
+    > object_shared_pointer_map;
+
+    // list of shared_pointers create accessable by raw pointer. This
+    // is used to "match up" shared pointers loaded at different
+    // points in the archive. Note, we delay construction until
+    // it is actually used since this is by default included as
+    // a "mix-in" even if shared_ptr isn't used.
+    object_shared_pointer_map * m_o_sp;
+
+    struct null_deleter {
+        void operator()(void const *) const {}
+    };
+
+#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) || defined(BOOST_MSVC)
+public:
+#else
+    template<class Archive, class U>
+    friend void boost::serialization::load(
+        Archive & ar,
+        SPT< U > &t,
+        const unsigned int file_version
+    );
+#endif
+
+    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    // list of loaded pointers.  This is used to be sure that the pointers
+    // stay around long enough to be "matched" with other pointers loaded
+    // by the same archive.  These are created with a "null_deleter" so that
+    // when this list is destroyed - the underlaying raw pointers are not
+    // destroyed.  This has to be done because the pointers are also held by
+    // new system which is disjoint from this set.  This is implemented
+    // by a change in load_construct_data below.  It makes this file suitable
+    // only for loading pointers into a 1.33 or later boost system.
+    std::list<boost_132::shared_ptr<const void> > * m_pointers_132;
+    BOOST_ARCHIVE_DECL(void)
+    append(const boost_132::shared_ptr<const void> & t){
+        if(NULL == m_pointers_132)
+            m_pointers_132 = new std::list<boost_132::shared_ptr<const void> >;
+        m_pointers_132->push_back(t);
+    }
+    #endif
+
+    struct non_polymorphic {
+        template<class U>
+        static const boost::serialization::extended_type_info * 
+        get_object_type(U & ){
+            return & boost::serialization::singleton<
+                typename 
+                boost::serialization::type_info_implementation< U >::type
+            >::get_const_instance();
+        }
+    };
+    struct polymorphic {
+        template<class U>
+        static const boost::serialization::extended_type_info * 
+        get_object_type(U & u){
+            return boost::serialization::singleton<
+                typename 
+                boost::serialization::type_info_implementation< U >::type
+            >::get_const_instance().get_derived_extended_type_info(u);
+        }
+    };
+
+public:
+    template<class T>
+    void reset(SPT< T > & s, T * t){
+        if(NULL == t){
+            s.reset();
+            return;
+        }
+        const boost::serialization::extended_type_info * this_type
+            = & boost::serialization::type_info_implementation< T >::type
+                    ::get_const_instance();
+
+        // get pointer to the most derived object's eti.  This is effectively
+        // the object type identifer
+        typedef typename mpl::if_<
+            is_polymorphic< T >,
+            polymorphic,
+            non_polymorphic
+        >::type type;
+
+        const boost::serialization::extended_type_info * true_type
+            = type::get_object_type(*t);
+
+        // note:if this exception is thrown, be sure that derived pointern
+        // is either registered or exported.
+        if(NULL == true_type)
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::unregistered_class,
+                    this_type->get_debug_info()
+                )
+            );
+        // get void pointer to the most derived type
+        // this uniquely identifies the object referred to
+        // oid = "object identifier"
+        const void * oid = void_downcast(
+            *true_type,
+            *this_type,
+            t
+        );
+        if(NULL == oid)
+            boost::serialization::throw_exception(
+                boost::archive::archive_exception(
+                    boost::archive::archive_exception::unregistered_cast,
+                    true_type->get_debug_info(),
+                    this_type->get_debug_info()
+                )
+            );
+
+        // make tracking array if necessary
+        if(NULL == m_o_sp)
+            m_o_sp = new object_shared_pointer_map;
+
+        typename object_shared_pointer_map::iterator i = m_o_sp->find(oid);
+
+        // if it's a new object
+        if(i == m_o_sp->end()){
+            s.reset(t);
+            std::pair<typename object_shared_pointer_map::iterator, bool> result;
+            result = m_o_sp->insert(std::make_pair(oid, s));
+            BOOST_ASSERT(result.second);
+        }
+        // if the object has already been seen
+        else{
+            s = SPT<T>(i->second, t);
+        }
+    }
+
+    shared_ptr_helper() :
+        m_o_sp(NULL)
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+            , m_pointers_132(NULL)
+        #endif
+    {}
+    virtual ~shared_ptr_helper(){
+        if(NULL != m_o_sp)
+            delete m_o_sp;
+        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+        if(NULL != m_pointers_132)
+            delete m_pointers_132;
+        #endif
+    }
+};
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/stack.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+#ifndef  BOOST_SERIALIZATION_STACK_HPP
+#define BOOST_SERIALIZATION_STACK_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// stack.hpp
+
+// (C) Copyright 2014 Robert Ramey - http://www.rrsd.com .
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <stack>
+#include <boost/config.hpp>
+
+// function specializations must be defined in the appropriate
+// namespace - boost::serialization
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define STD _STLP_STD
+#else
+#define STD std
+#endif
+
+namespace boost { 
+namespace serialization {
+namespace detail{
+
+template <typename U, typename C>
+struct stack_save : public STD::stack<U, C> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) const {
+        save(ar, STD::stack<U, C>::c, file_version);
+    }
+};
+template <typename U, typename C>
+struct stack_load : public STD::stack<U, C> {
+    template<class Archive>
+    void operator()(Archive & ar, const unsigned int file_version) {
+        load(ar, STD::stack<U, C>::c, file_version);
+    }
+};
+
+} // detail
+
+template<class Archive, class T, class C>
+inline void serialize(
+    Archive & ar,
+    std::stack< T, C> & t,
+    const unsigned int file_version 
+){
+    typedef typename mpl::eval_if<
+        typename Archive::is_saving,
+        mpl::identity<detail::stack_save<T, C> >,
+        mpl::identity<detail::stack_load<T, C> >
+    >::type typex;
+    static_cast<typex &>(t)(ar, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(STD::stack)
+
+#undef STD
+
+#endif // BOOST_SERIALIZATION_DEQUE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/unique_ptr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,68 @@
+#ifndef  BOOST_SERIALIZATION_UNIQUE_PTR_HPP
+#define BOOST_SERIALIZATION_UNIQUE_PTR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// unique_ptr.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <memory>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/nvp.hpp>
+
+namespace boost {
+namespace serialization {
+
+/////////////////////////////////////////////////////////////
+// implement serialization for unique_ptr< T >
+// note: this must be added to the boost namespace in order to
+// be called by the library
+template<class Archive, class T>
+inline void save(
+    Archive & ar,
+    const std::unique_ptr< T > &t,
+    const unsigned int file_version
+){
+    // only the raw pointer has to be saved
+    // the ref count is rebuilt automatically on load
+    const T * const tx = t.get();
+    ar << BOOST_SERIALIZATION_NVP(tx);
+}
+
+template<class Archive, class T>
+inline void load(
+    Archive & ar,
+    std::unique_ptr< T > &t,
+    const unsigned int file_version
+){
+    T *tx;
+    ar >> BOOST_SERIALIZATION_NVP(tx);
+    // note that the reset automagically maintains the reference count
+    t.reset(tx);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar,
+    std::unique_ptr< T > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+
+#endif // BOOST_SERIALIZATION_UNIQUE_PTR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/unordered_collections_load_imp.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+#ifndef BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP
+#define BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+# pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// unordered_collections_load_imp.hpp: serialization for loading stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of collections
+
+#include <boost/assert.hpp>
+#include <cstddef> // size_t
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/detail/basic_iarchive.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/detail/stack_constructor.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/item_version_type.hpp>
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+template<class Archive, class Container, class InputFunction>
+inline void load_unordered_collection(Archive & ar, Container &s)
+{
+    collection_size_type count;
+    collection_size_type bucket_count;
+    boost::serialization::item_version_type item_version(0);
+    boost::archive::library_version_type library_version(
+        ar.get_library_version()
+    );
+    // retrieve number of elements
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    ar >> BOOST_SERIALIZATION_NVP(bucket_count);
+    if(boost::archive::library_version_type(3) < library_version){
+        ar >> BOOST_SERIALIZATION_NVP(item_version);
+    }
+    s.clear();
+    s.rehash(bucket_count);
+    InputFunction ifunc;
+    while(count-- > 0){
+        ifunc(ar, s, item_version);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/unordered_collections_save_imp.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,86 @@
+#ifndef BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP
+#define BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// hash_collections_save_imp.hpp: serialization for stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of collections
+
+#include <boost/config.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/item_version_type.hpp>
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+
+template<class Archive, class Container>
+inline void save_unordered_collection(Archive & ar, const Container &s)
+{
+    collection_size_type count(s.size());
+    const collection_size_type bucket_count(s.bucket_count());
+    const item_version_type item_version(
+        version<typename Container::value_type>::value
+    );
+
+    #if 0
+    /* should only be necessary to create archives of previous versions
+     * which is not currently supported.  So for now comment this out
+     */
+    boost::archive::library_version_type library_version(
+        ar.get_library_version()
+    );
+    // retrieve number of elements
+	ar << BOOST_SERIALIZATION_NVP(count);
+	ar << BOOST_SERIALIZATION_NVP(bucket_count);
+    if(boost::archive::library_version_type(3) < library_version){
+        // record number of elements
+        // make sure the target type is registered so we can retrieve
+        // the version when we load
+        ar << BOOST_SERIALIZATION_NVP(item_version);
+    }
+    #else
+        ar << BOOST_SERIALIZATION_NVP(count);
+        ar << BOOST_SERIALIZATION_NVP(bucket_count);
+        ar << BOOST_SERIALIZATION_NVP(item_version);
+    #endif
+
+    typename Container::const_iterator it = s.begin();
+    while(count-- > 0){
+        // note borland emits a no-op without the explicit namespace
+        boost::serialization::save_construct_data_adl(
+            ar, 
+            &(*it), 
+            boost::serialization::version<
+                typename Container::value_type
+            >::value
+        );
+        ar << boost::serialization::make_nvp("item", *it++);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/unordered_map.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,231 @@
+#ifndef  BOOST_SERIALIZATION_UNORDERED_MAP_HPP
+#define BOOST_SERIALIZATION_UNORDERED_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/unordered_map.hpp:
+// serialization for stl unordered_map templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <unordered_map>
+
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/unordered_collections_save_imp.hpp>
+#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+namespace stl {
+
+// map input
+template<class Archive, class Container>
+struct archive_input_unordered_map
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef typename Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        std::pair<typename Container::const_iterator, bool> result = 
+            s.insert(t.reference());
+        // note: the following presumes that the map::value_type was NOT tracked
+        // in the archive.  This is the usual case, but here there is no way
+        // to determine that.  
+        if(result.second){
+            ar.reset_object_address(
+                & (result.first->second),
+                & t.reference().second
+            );
+        }
+    }
+};
+
+// multimap input
+template<class Archive, class Container>
+struct archive_input_unordered_multimap
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef typename Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        typename Container::const_iterator result 
+            = s.insert(t.reference());
+        // note: the following presumes that the map::value_type was NOT tracked
+        // in the archive.  This is the usual case, but here there is no way
+        // to determine that.  
+        ar.reset_object_address(
+            & result->second,
+            & t.reference()
+        );
+    }
+};
+
+} // stl
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const std::unordered_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::save_unordered_collection<
+        Archive, 
+        std::unordered_map<
+            Key, HashFcn, EqualKey, Allocator
+        >
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    std::unordered_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::load_unordered_collection<
+        Archive,
+        std::unordered_map<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_unordered_map<
+            Archive, 
+            std::unordered_map<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    std::unordered_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// unordered_multimap
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const std::unordered_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::save_unordered_collection<
+        Archive, 
+        std::unordered_multimap<
+            Key, HashFcn, EqualKey, Allocator
+        >
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    std::unordered_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::load_unordered_collection<
+        Archive,
+        std::unordered_multimap<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_unordered_multimap<
+            Archive, 
+            std::unordered_multimap<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    std::unordered_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_UNORDERED_MAP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/serialization/unordered_set.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,216 @@
+#ifndef  BOOST_SERIALIZATION_UNORDERED_SET_HPP
+#define BOOST_SERIALIZATION_UNORDERED_SET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// unordered_set.hpp: serialization for stl unordered_set templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <unordered_set>
+
+#include <boost/serialization/unordered_collections_save_imp.hpp>
+#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+namespace stl {
+
+// unordered_set input
+template<class Archive, class Container>
+struct archive_input_unordered_set
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef typename Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        std::pair<typename Container::const_iterator, bool> result = 
+            s.insert(t.reference());
+        if(result.second)
+            ar.reset_object_address(& (* result.first), & t.reference());
+    }
+};
+
+// unordered_multiset input
+template<class Archive, class Container>
+struct archive_input_unordered_multiset
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef typename Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        typename Container::const_iterator result 
+            = s.insert(t.reference());
+        ar.reset_object_address(& (* result), & t.reference());
+    }
+};
+
+} // stl
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const std::unordered_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::save_unordered_collection<
+        Archive, 
+        std::unordered_set<
+            Key, HashFcn, EqualKey, Allocator
+        > 
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    std::unordered_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::load_unordered_collection<
+        Archive,
+        std::unordered_set<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_unordered_set<
+            Archive, 
+            std::unordered_set<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    std::unordered_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// unordered_multiset
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const std::unordered_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::save_unordered_collection<
+        Archive, 
+        std::unordered_multiset<
+            Key, HashFcn, EqualKey, Allocator
+        > 
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    std::unordered_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::load_unordered_collection<
+        Archive,
+        std::unordered_multiset<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_unordered_multiset<
+            Archive,
+            std::unordered_multiset<
+                Key, HashFcn, EqualKey, Allocator
+            > 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    std::unordered_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_UNORDERED_SET_HPP
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/allocate_array_helper.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2012 Glen Joseph Fernandes 
- * glenfe at live dot com
- *
- * Distributed under the Boost Software License, 
- * Version 1.0. (See accompanying file LICENSE_1_0.txt 
- * or copy at http://boost.org/LICENSE_1_0.txt)
- */
-#ifndef BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
-#define BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
-
-#include <boost/type_traits/alignment_of.hpp>
-
-namespace boost {
-    namespace detail {
-        template<typename A, typename T, typename Y = char>
-        class allocate_array_helper;
-        template<typename A, typename T, typename Y>
-        class allocate_array_helper<A, T[], Y> {
-            template<typename A9, typename T9, typename Y9>
-            friend class allocate_array_helper;
-            typedef typename A::template rebind<Y>   ::other A2;
-            typedef typename A::template rebind<char>::other A3;
-        public:
-            typedef typename A2::value_type      value_type;
-            typedef typename A2::pointer         pointer;
-            typedef typename A2::const_pointer   const_pointer;
-            typedef typename A2::reference       reference;
-            typedef typename A2::const_reference const_reference;
-            typedef typename A2::size_type       size_type;
-            typedef typename A2::difference_type difference_type;
-            template<typename U>
-            struct rebind {
-                typedef allocate_array_helper<A, T[], U> other;
-            };
-            allocate_array_helper(const A& allocator_, std::size_t size_, T** data_)
-                : allocator(allocator_),
-                  size(sizeof(T) * size_),
-                  data(data_) {
-            }
-            template<class U>
-            allocate_array_helper(const allocate_array_helper<A, T[], U>& other) 
-                : allocator(other.allocator),
-                  size(other.size),
-                  data(other.data) {
-            }
-            pointer address(reference value) const {
-                return allocator.address(value);
-            }
-            const_pointer address(const_reference value) const {
-                return allocator.address(value);
-            }
-            size_type max_size() const {
-                return allocator.max_size();
-            }
-            pointer allocate(size_type count, const void* value = 0) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                char*  p1 = A3(allocator).allocate(n1 + size, value);
-                char*  p2 = p1 + n1;
-                while (std::size_t(p2) % a1 != 0) {
-                    p2--;
-                }
-                *data = reinterpret_cast<T*>(p2);
-                return  reinterpret_cast<Y*>(p1);
-            }
-            void deallocate(pointer memory, size_type count) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                char*  p1 = reinterpret_cast<char*>(memory);
-                A3(allocator).deallocate(p1, n1 + size);
-            }
-            void construct(pointer memory, const Y& value) {
-                allocator.construct(memory, value);
-            }
-            void destroy(pointer memory) {
-                allocator.destroy(memory);
-            }
-            template<typename U>
-            bool operator==(const allocate_array_helper<A, T[], U>& other) const {
-                return allocator == other.allocator;
-            }
-            template<typename U>
-            bool operator!=(const allocate_array_helper<A, T[], U>& other) const {
-                return !(*this == other); 
-            }
-        private:
-            A2 allocator;
-            std::size_t size;
-            T** data;
-        };
-        template<typename A, typename T, std::size_t N, typename Y>
-        class allocate_array_helper<A, T[N], Y> {
-            template<typename A9, typename T9, typename Y9>
-            friend class allocate_array_helper;
-            typedef typename A::template rebind<Y>   ::other A2;
-            typedef typename A::template rebind<char>::other A3;
-        public:
-            typedef typename A2::value_type      value_type;
-            typedef typename A2::pointer         pointer;
-            typedef typename A2::const_pointer   const_pointer;
-            typedef typename A2::reference       reference;
-            typedef typename A2::const_reference const_reference;
-            typedef typename A2::size_type       size_type;
-            typedef typename A2::difference_type difference_type;
-            template<typename U>
-            struct rebind {
-                typedef allocate_array_helper<A, T[N], U> other;
-            };
-            allocate_array_helper(const A& allocator_, T** data_)
-                : allocator(allocator_),
-                  data(data_) {
-            }
-            template<class U>
-            allocate_array_helper(const allocate_array_helper<A, T[N], U>& other) 
-                : allocator(other.allocator),
-                  data(other.data) {
-            }
-            pointer address(reference value) const {
-                return allocator.address(value);
-            }
-            const_pointer address(const_reference value) const {
-                return allocator.address(value);
-            }
-            size_type max_size() const {
-                return allocator.max_size();
-            }
-            pointer allocate(size_type count, const void* value = 0) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                char*  p1 = A3(allocator).allocate(n1 + N1, value);
-                char*  p2 = p1 + n1;
-                while (std::size_t(p2) % a1 != 0) {
-                    p2--;
-                }
-                *data = reinterpret_cast<T*>(p2);
-                return  reinterpret_cast<Y*>(p1);
-            }
-            void deallocate(pointer memory, size_type count) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                char*  p1 = reinterpret_cast<char*>(memory);
-                A3(allocator).deallocate(p1, n1 + N1);
-            }
-            void construct(pointer memory, const Y& value) {
-                allocator.construct(memory, value);
-            }
-            void destroy(pointer memory) {
-                allocator.destroy(memory);
-            }
-            template<typename U>
-            bool operator==(const allocate_array_helper<A, T[N], U>& other) const {
-                return allocator == other.allocator;
-            }
-            template<typename U>
-            bool operator!=(const allocate_array_helper<A, T[N], U>& other) const {
-                return !(*this == other); 
-            }
-        private:
-            enum {
-                N1 = N * sizeof(T)
-            };
-            A2 allocator;
-            T** data;
-        };
-    }
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 2012-2014 Glen Joseph Fernandes 
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License, 
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt 
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_ALLOCATOR_HPP
+#define BOOST_SMART_PTR_DETAIL_ARRAY_ALLOCATOR_HPP
+
+#include <boost/align/align.hpp>
+#include <boost/smart_ptr/detail/array_traits.hpp>
+#include <boost/smart_ptr/detail/array_utility.hpp>
+#include <boost/type_traits/alignment_of.hpp>
+
+namespace boost {
+    namespace detail {
+        struct ms_init_tag   { };
+        struct ms_noinit_tag { };
+
+        template<class T>
+        struct ms_allocator_state;
+
+        template<class T>
+        struct ms_allocator_state<T[]> {
+            typedef typename array_base<T>::type type;
+
+            ms_allocator_state(std::size_t size_,
+                type** result_)
+                : size(size_ * array_total<T>::size),
+                  result(result_) {
+            }
+
+            std::size_t size;
+
+            union {
+                type** result;
+                type* object;
+            };
+        };
+
+        template<class T, std::size_t N>
+        struct ms_allocator_state<T[N]> {
+            typedef typename array_base<T>::type type;
+
+            ms_allocator_state(type** result_)
+                : result(result_) {
+            }
+
+            enum {
+                size = array_total<T[N]>::size
+            };
+
+            union {
+                type** result;
+                type* object;
+            };
+        };
+
+        template<class A, class T, class R>
+        class as_allocator
+            : public A {
+            template<class A_, class T_, class R_>
+            friend class as_allocator;
+
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+            typedef std::allocator_traits<A> AT;
+            typedef typename AT::template rebind_alloc<char> CA;
+            typedef typename AT::template rebind_traits<char> CT;
+#else
+            typedef typename A::template rebind<char>::other CA;
+#endif
+
+        public:
+            typedef A allocator_type;
+
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+            typedef typename AT::value_type value_type;
+            typedef typename AT::pointer pointer;
+            typedef typename AT::const_pointer const_pointer;
+            typedef typename AT::void_pointer void_pointer;
+            typedef typename AT::const_void_pointer const_void_pointer;
+            typedef typename AT::size_type size_type;
+            typedef typename AT::difference_type difference_type;
+#else
+            typedef typename A::value_type value_type;
+            typedef typename A::pointer pointer;
+            typedef typename A::const_pointer const_pointer;
+            typedef typename A::size_type size_type;
+            typedef typename A::difference_type difference_type;
+            typedef typename A::reference reference;
+            typedef typename A::const_reference const_reference;
+            typedef void* void_pointer;
+            typedef const void* const_void_pointer;
+#endif
+
+            template<class U>
+            struct rebind {
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                typedef as_allocator<typename AT::
+                    template rebind_alloc<U>, T, R> other;
+#else
+                typedef as_allocator<typename A::
+                    template rebind<U>::other, T, R> other;
+#endif
+            };
+
+            typedef typename array_base<T>::type type;
+
+            as_allocator(const A& allocator_, type** result)
+                : A(allocator_),
+                  data(result) {
+            }
+
+            as_allocator(const A& allocator_, std::size_t size,
+                type** result)
+                : A(allocator_),
+                  data(size, result) {
+            }
+
+            template<class U>
+            as_allocator(const as_allocator<U, T, R>& other)
+                : A(other.allocator()),
+                  data(other.data) {
+            }
+
+            pointer allocate(size_type count, const_void_pointer = 0) {
+                enum {
+                    M = boost::alignment_of<type>::value
+                };
+                std::size_t n1 = count * sizeof(value_type);
+                std::size_t n2 = data.size * sizeof(type);
+                std::size_t n3 = n2 + M;
+                CA ca(allocator());
+                void* p1 = ca.allocate(n1 + n3);
+                void* p2 = static_cast<char*>(p1) + n1;
+                (void)boost::alignment::align(M, n2, p2, n3);
+                *data.result = static_cast<type*>(p2);
+                return static_cast<value_type*>(p1);
+            }
+
+            void deallocate(pointer memory, size_type count) {
+                enum {
+                    M = boost::alignment_of<type>::value
+                };
+                std::size_t n1 = count * sizeof(value_type);
+                std::size_t n2 = data.size * sizeof(type) + M;
+                char* p1 = reinterpret_cast<char*>(memory);
+                CA ca(allocator());
+                ca.deallocate(p1, n1 + n2);
+            }
+
+            const A& allocator() const {
+                return static_cast<const A&>(*this);
+            }
+
+            A& allocator() {
+                return static_cast<A&>(*this);
+            }
+
+            void set(type* memory) {
+                data.object = memory;
+            }
+
+            void operator()() {
+                if (data.object) {
+                    R tag;
+                    release(tag);
+                }
+            }
+
+        private:
+            void release(ms_init_tag) {
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                as_destroy(allocator(), data.object, data.size);
+#else
+                ms_destroy(data.object, data.size);
+#endif
+            }
+
+            void release(ms_noinit_tag) {
+                ms_destroy(data.object, data.size);
+            }
+
+            ms_allocator_state<T> data;
+        };
+
+        template<class A1, class A2, class T, class R>
+        bool operator==(const as_allocator<A1, T, R>& a1,
+            const as_allocator<A2, T, R>& a2) {
+            return a1.allocator() == a2.allocator();
+        }
+
+        template<class A1, class A2, class T, class R>
+        bool operator!=(const as_allocator<A1, T, R>& a1,
+            const as_allocator<A2, T, R>& a2) {
+            return a1.allocator() != a2.allocator();
+        }
+
+        template<class T, class Y = char>
+        class ms_allocator;
+
+        template<class T, class Y>
+        class ms_allocator {
+            template<class T_, class Y_>
+            friend class ms_allocator;
+
+        public:
+            typedef typename array_base<T>::type type;
+
+            typedef Y value_type;
+            typedef Y* pointer;
+            typedef const Y* const_pointer;
+            typedef std::size_t size_type;
+            typedef std::ptrdiff_t difference_type;
+            typedef Y& reference;
+            typedef const Y& const_reference;
+
+            template<class U>
+            struct rebind {
+                typedef ms_allocator<T, U> other;
+            };
+
+            ms_allocator(type** result)
+                : data(result) {
+            }
+
+            ms_allocator(std::size_t size, type** result)
+                : data(size, result) {
+            }
+
+            template<class U>
+            ms_allocator(const ms_allocator<T, U>& other)
+                : data(other.data) {
+            }
+
+            pointer allocate(size_type count, const void* = 0) {
+                enum {
+                    M = boost::alignment_of<type>::value
+                };
+                std::size_t n1 = count * sizeof(Y);
+                std::size_t n2 = data.size * sizeof(type);
+                std::size_t n3 = n2 + M;
+                void* p1 = ::operator new(n1 + n3);
+                void* p2 = static_cast<char*>(p1) + n1;
+                (void)boost::alignment::align(M, n2, p2, n3);
+                *data.result = static_cast<type*>(p2);
+                return static_cast<Y*>(p1);
+            }
+
+            void deallocate(pointer memory, size_type) {
+                void* p1 = memory;
+                ::operator delete(p1);
+            }
+
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+            pointer address(reference value) const {
+                return &value;
+            }
+
+            const_pointer address(const_reference value) const {
+                return &value;
+            }
+
+            size_type max_size() const {
+                enum {
+                    N = static_cast<std::size_t>(-1) / sizeof(Y)
+                };
+                return N;
+            }
+
+            void construct(pointer memory, const_reference value) {
+                void* p1 = memory;
+                ::new(p1) Y(value);
+            }
+
+            void destroy(pointer memory) {
+                (void)memory;
+                memory->~Y();
+            }
+#endif
+
+            void set(type* memory) {
+                data.object = memory;
+            }
+
+            void operator()() {
+                if (data.object) {
+                    ms_destroy(data.object, data.size);
+                }
+            }
+
+        private:
+            ms_allocator_state<T> data;
+        };
+
+        template<class T, class Y1, class Y2>
+        bool operator==(const ms_allocator<T, Y1>&,
+            const ms_allocator<T, Y2>&) {
+            return true;
+        }
+
+        template<class T, class Y1, class Y2>
+        bool operator!=(const ms_allocator<T, Y1>&,
+            const ms_allocator<T, Y2>&) {
+            return false;
+        }
+
+        class ms_in_allocator_tag {
+        public:
+            void operator()(const void*) {
+            }
+        };
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_count_impl.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes 
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License, 
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt 
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP
+#define BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP
+
+#include <boost/smart_ptr/detail/array_allocator.hpp>
+#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
+
+namespace boost {
+    namespace detail {
+        template<class P, class A>
+        class sp_counted_impl_pda<P, ms_in_allocator_tag, A>
+            : public sp_counted_base {
+            typedef ms_in_allocator_tag D;
+            typedef sp_counted_impl_pda<P, D, A> Y;
+        public:
+            sp_counted_impl_pda(P, D, const A& allocator_)
+                : allocator(allocator_) {
+            }
+
+            virtual void dispose() {
+                allocator();
+            }
+
+            virtual void destroy() {
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                typedef typename std::allocator_traits<A>::
+                    template rebind_alloc<Y> YA;
+                typedef typename std::allocator_traits<A>::
+                    template rebind_traits<Y> YT;
+#else
+                typedef typename A::template rebind<Y>::other YA;
+#endif
+                YA a1(allocator);
+#if !defined(BOOST_NO_CXX11_ALLOCATOR)
+                YT::destroy(a1, this);
+                YT::deallocate(a1, this, 1);
+#else
+                this->~Y();
+                a1.deallocate(this, 1);
+#endif                
+            }
+
+            virtual void* get_deleter(const sp_typeinfo&) {
+                return &reinterpret_cast<char&>(allocator);
+            }
+
+            virtual void* get_untyped_deleter() {
+                return &reinterpret_cast<char&>(allocator);
+            }
+
+        private:
+            sp_counted_impl_pda(const sp_counted_impl_pda&);
+            sp_counted_impl_pda& operator=(const sp_counted_impl_pda&);
+
+            A allocator;
+        };
+    }
+}
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/array_deleter.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2012 Glen Joseph Fernandes
- * glenfe at live dot com
- *
- * Distributed under the Boost Software License,
- * Version 1.0. (See accompanying file LICENSE_1_0.txt
- * or copy at http://boost.org/LICENSE_1_0.txt)
- */
-#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
-#define BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
-
-#include <boost/smart_ptr/detail/array_utility.hpp>
-#include <boost/smart_ptr/detail/sp_forward.hpp>
-
-namespace boost {
-    namespace detail {
-        template<typename T>
-        class array_deleter;
-        template<typename T>
-        class array_deleter<T[]> {
-        public:
-            array_deleter(std::size_t size_)
-                : size(size_),
-                  object(0) {
-            }
-            ~array_deleter() {
-                if (object) {
-                    array_destroy(object, size);
-                }
-            }
-            void init(T* memory) {
-                array_init(memory, size);
-                object = memory;
-            }
-#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
-            void init(T* memory, T&& value) {
-                array_init_value(memory, size, sp_forward<T>(value));
-                object = memory;                
-            }
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-            template<typename... Args>
-            void init(T* memory, Args&&... args) {
-                array_init_args(memory, size, sp_forward<Args>(args)...);
-                object = memory;
-            }
-#endif
-#endif
-            void init_list(T* memory, const T* list) {
-                array_init_list(memory, size, list);
-                object = memory;
-            }
-            template<std::size_t M>
-            void init_list(T* memory, const T* list) {
-                array_init_list<T, M>(memory, size, list);
-                object = memory;
-            }
-            void noinit(T* memory) {
-                array_noinit(memory, size);
-                object = memory;
-            }
-            void operator()(const void*) {
-                if (object) {
-                    array_destroy(object, size);
-                    object = 0;
-                }
-            }
-        private:
-            std::size_t size;
-            T* object;
-        };
-        template<typename T, std::size_t N>
-        class array_deleter<T[N]> {
-        public:
-            array_deleter()
-                : object(0) {
-            }
-            ~array_deleter() {
-                if (object) {
-                    array_destroy(object, N);
-                }
-            }
-            void init(T* memory) {
-                array_init(memory, N);
-                object = memory;
-            }
-#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
-            void init(T* memory, T&& value) {
-                array_init_value(memory, N, sp_forward<T>(value));
-                object = memory;                
-            }
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-            template<typename... Args>
-            void init(T* memory, Args&&... args) {
-                array_init_args(memory, N, sp_forward<Args>(args)...);
-                object = memory;
-            }
-#endif
-#endif
-            void init_list(T* memory, const T* list) {
-                array_init_list(memory, N, list);
-                object = memory;
-            }
-            template<std::size_t M>
-            void init_list(T* memory, const T* list) {
-                array_init_list<T, M>(memory, N, list);
-                object = memory;
-            }
-            void noinit(T* memory) {
-                array_noinit(memory, N);
-                object = memory;
-            }
-            void operator()(const void*) {
-                if (object) {
-                    array_destroy(object, N);
-                    object = 0;
-                }
-            }
-        private:
-            T* object;
-        };
-    }
-}
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_nt.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
+
+//
+//  boost/detail/atomic_count_nt.hpp
+//
+//  Trivial atomic_count for the single-threaded case
+//
+//  http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html
+//
+//  Copyright 2013 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+namespace boost
+{
+
+namespace detail
+{
+
+class atomic_count
+{
+public:
+
+    explicit atomic_count( long v ): value_( v )
+    {
+    }
+
+    long operator++()
+    {
+        return ++value_;
+    }
+
+    long operator--()
+    {
+        return --value_;
+    }
+
+    operator long() const
+    {
+        return value_;
+    }
+
+private:
+
+    atomic_count(atomic_count const &);
+    atomic_count & operator=(atomic_count const &);
+
+    long value_;
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_pt.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,97 @@
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
+
+//
+//  boost/detail/atomic_count_pthreads.hpp
+//
+//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/assert.hpp>
+#include <pthread.h>
+
+//
+//  The generic pthread_mutex-based implementation sometimes leads to
+//    inefficiencies. Example: a class with two atomic_count members
+//    can get away with a single mutex.
+//
+//  Users can detect this situation by checking BOOST_AC_USE_PTHREADS.
+//
+
+namespace boost
+{
+
+namespace detail
+{
+
+class atomic_count
+{
+private:
+
+    class scoped_lock
+    {
+    public:
+
+        scoped_lock(pthread_mutex_t & m): m_(m)
+        {
+            BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
+        }
+
+        ~scoped_lock()
+        {
+            BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
+        }
+
+    private:
+
+        pthread_mutex_t & m_;
+    };
+
+public:
+
+    explicit atomic_count(long v): value_(v)
+    {
+        BOOST_VERIFY( pthread_mutex_init( &mutex_, 0 ) == 0 );
+    }
+
+    ~atomic_count()
+    {
+        BOOST_VERIFY( pthread_mutex_destroy( &mutex_ ) == 0 );
+    }
+
+    long operator++()
+    {
+        scoped_lock lock(mutex_);
+        return ++value_;
+    }
+
+    long operator--()
+    {
+        scoped_lock lock(mutex_);
+        return --value_;
+    }
+
+    operator long() const
+    {
+        scoped_lock lock(mutex_);
+        return value_;
+    }
+
+private:
+
+    atomic_count(atomic_count const &);
+    atomic_count & operator=(atomic_count const &);
+
+    mutable pthread_mutex_t mutex_;
+    long value_;
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_pthreads.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
-#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
-
-//
-//  boost/detail/atomic_count_pthreads.hpp
-//
-//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#include <pthread.h>
-
-//
-//  The generic pthread_mutex-based implementation sometimes leads to
-//    inefficiencies. Example: a class with two atomic_count members
-//    can get away with a single mutex.
-//
-//  Users can detect this situation by checking BOOST_AC_USE_PTHREADS.
-//
-
-namespace boost
-{
-
-namespace detail
-{
-
-class atomic_count
-{
-private:
-
-    class scoped_lock
-    {
-    public:
-
-        scoped_lock(pthread_mutex_t & m): m_(m)
-        {
-            pthread_mutex_lock(&m_);
-        }
-
-        ~scoped_lock()
-        {
-            pthread_mutex_unlock(&m_);
-        }
-
-    private:
-
-        pthread_mutex_t & m_;
-    };
-
-public:
-
-    explicit atomic_count(long v): value_(v)
-    {
-        pthread_mutex_init(&mutex_, 0);
-    }
-
-    ~atomic_count()
-    {
-        pthread_mutex_destroy(&mutex_);
-    }
-
-    long operator++()
-    {
-        scoped_lock lock(mutex_);
-        return ++value_;
-    }
-
-    long operator--()
-    {
-        scoped_lock lock(mutex_);
-        return --value_;
-    }
-
-    operator long() const
-    {
-        scoped_lock lock(mutex_);
-        return value_;
-    }
-
-private:
-
-    atomic_count(atomic_count const &);
-    atomic_count & operator=(atomic_count const &);
-
-    mutable pthread_mutex_t mutex_;
-    long value_;
-};
-
-} // namespace detail
-
-} // namespace boost
-
-#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_spin.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
+
+//
+//  boost/detail/atomic_count_spin.hpp
+//
+//  Copyright (c) 2013 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/smart_ptr/detail/spinlock_pool.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+class atomic_count
+{
+private:
+
+public:
+
+    explicit atomic_count( long v ): value_( v )
+    {
+    }
+
+    long operator++()
+    {
+        spinlock_pool<0>::scoped_lock lock( &value_ );
+        return ++value_;
+    }
+
+    long operator--()
+    {
+        spinlock_pool<0>::scoped_lock lock( &value_ );
+        return --value_;
+    }
+
+    operator long() const
+    {
+        spinlock_pool<0>::scoped_lock lock( &value_ );
+        return value_;
+    }
+
+private:
+
+    atomic_count(atomic_count const &);
+    atomic_count & operator=(atomic_count const &);
+
+    long value_;
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/atomic_count_std_atomic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,60 @@
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
+
+//
+//  boost/detail/atomic_count_std_atomic.hpp
+//
+//  atomic_count for std::atomic
+//
+//  Copyright 2013 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <atomic>
+#include <cstdint>
+
+namespace boost
+{
+
+namespace detail
+{
+
+class atomic_count
+{
+public:
+
+    explicit atomic_count( long v ): value_( v )
+    {
+    }
+
+    long operator++()
+    {
+        return value_.fetch_add( 1, std::memory_order_acq_rel ) + 1;
+    }
+
+    long operator--()
+    {
+        return value_.fetch_sub( 1, std::memory_order_acq_rel ) - 1;
+    }
+
+    operator long() const
+    {
+        return value_.load( std::memory_order_acquire );
+    }
+
+private:
+
+    atomic_count(atomic_count const &);
+    atomic_count & operator=(atomic_count const &);
+
+    std::atomic_int_least32_t value_;
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/make_array_helper.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2012 Glen Joseph Fernandes 
- * glenfe at live dot com
- *
- * Distributed under the Boost Software License, 
- * Version 1.0. (See accompanying file LICENSE_1_0.txt 
- * or copy at http://boost.org/LICENSE_1_0.txt)
- */
-#ifndef BOOST_SMART_PTR_DETAIL_MAKE_ARRAY_HELPER_HPP
-#define BOOST_SMART_PTR_DETAIL_MAKE_ARRAY_HELPER_HPP
-
-#include <boost/type_traits/alignment_of.hpp>
-
-namespace boost {
-    namespace detail {
-        template<typename T, typename Y = char>
-        class make_array_helper;
-        template<typename T, typename Y>
-        class make_array_helper<T[], Y> {
-            template<typename T2, typename Y2>
-            friend class make_array_helper;
-        public:
-            typedef Y           value_type;
-            typedef Y*          pointer;
-            typedef const Y*    const_pointer;
-            typedef Y&          reference;
-            typedef const Y&    const_reference;
-            typedef std::size_t size_type;
-            typedef ptrdiff_t   difference_type;
-            template<typename U>
-            struct rebind {
-                typedef make_array_helper<T[], U> other;
-            };
-            make_array_helper(std::size_t size_, T** data_)
-                : size(sizeof(T) * size_),
-                  data(data_) {
-            }
-            template<class U>
-            make_array_helper(const make_array_helper<T[], U>& other) 
-                : size(other.size),
-                  data(other.data) {
-            }
-            pointer address(reference value) const {
-                return &value;
-            }
-            const_pointer address(const_reference value) const {
-                return &value;
-            }
-            size_type max_size() const {
-                return static_cast<std::size_t>(-1) / sizeof(Y);
-            }
-            pointer allocate(size_type count, const void* = 0) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                void*  p1 = ::operator new(n1 + size);
-                char*  p2 = static_cast<char*>(p1) + n1;
-                while (std::size_t(p2) % a1 != 0) {
-                    p2--;
-                }
-                *data = reinterpret_cast<T*>(p2);
-                return  reinterpret_cast<Y*>(p1);
-            }
-            void deallocate(pointer memory, size_type) {
-                void* p1 = memory;
-                ::operator delete(p1);
-            }
-            void construct(pointer memory, const Y& value) {
-                void* p1 = memory;
-                ::new(p1) Y(value);
-            }
-            void destroy(pointer memory) {
-                memory->~Y();
-            }
-            template<typename U>
-            bool operator==(const make_array_helper<T[], U>&) const {
-                return true;
-            }
-            template<typename U>
-            bool operator!=(const make_array_helper<T[], U>& other) const {
-                return !(*this == other); 
-            }
-        private:
-            std::size_t size;
-            T** data;
-        };
-        template<typename T, std::size_t N, typename Y>
-        class make_array_helper<T[N], Y> {
-            template<typename T2, typename Y2>
-            friend class make_array_helper;
-        public:
-            typedef Y           value_type;
-            typedef Y*          pointer;
-            typedef const Y*    const_pointer;
-            typedef Y&          reference;
-            typedef const Y&    const_reference;
-            typedef std::size_t size_type;
-            typedef ptrdiff_t   difference_type;
-            template<typename U>
-            struct rebind {
-                typedef make_array_helper<T[N], U> other;
-            };
-            make_array_helper(T** data_)
-                : data(data_) {
-            }
-            template<class U>
-            make_array_helper(const make_array_helper<T[N], U>& other) 
-                : data(other.data) {
-            }
-            pointer address(reference value) const {
-                return &value;
-            }
-            const_pointer address(const_reference value) const {
-                return &value;
-            }
-            size_type max_size() const {
-                return static_cast<std::size_t>(-1) / sizeof(Y);
-            }
-            pointer allocate(size_type count, const void* = 0) {
-                std::size_t a1 = boost::alignment_of<T>::value;
-                std::size_t n1 = count * sizeof(Y) + a1 - 1;
-                void*  p1 = ::operator new(n1 + N1);
-                char*  p2 = static_cast<char*>(p1) + n1;
-                while (std::size_t(p2) % a1 != 0) {
-                    p2--;
-                }
-                *data = reinterpret_cast<T*>(p2);
-                return  reinterpret_cast<Y*>(p1);
-            }
-            void deallocate(pointer memory, size_type) {
-                void* p1 = memory;
-                ::operator delete(p1);
-            }
-            void construct(pointer memory, const Y& value) {
-                void* p1 = memory;
-                ::new(p1) Y(value);
-            }
-            void destroy(pointer memory) {
-                memory->~Y();
-            }
-            template<typename U>
-            bool operator==(const make_array_helper<T[N], U>&) const {
-                return true;
-            }
-            template<typename U>
-            bool operator!=(const make_array_helper<T[N], U>& other) const {
-                return !(*this == other); 
-            }
-        private:
-            enum {
-                N1 = N * sizeof(T)
-            };
-            T** data;
-        };
-    }
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/shared_array_nmt.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
-#define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
-
-//
-//  detail/shared_array_nmt.hpp - shared_array.hpp without member templates
-//
-//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
-//  Copyright (c) 2001, 2002 Peter Dimov
-//
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
-//
-
-#include <boost/assert.hpp>
-#include <boost/checked_delete.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/smart_ptr/detail/atomic_count.hpp>
-
-#include <cstddef>          // for std::ptrdiff_t
-#include <algorithm>        // for std::swap
-#include <functional>       // for std::less
-#include <new>              // for std::bad_alloc
-
-namespace boost
-{
-
-template<class T> class shared_array
-{
-private:
-
-    typedef detail::atomic_count count_type;
-
-public:
-
-    typedef T element_type;
-      
-    explicit shared_array(T * p = 0): px(p)
-    {
-#ifndef BOOST_NO_EXCEPTIONS
-
-        try  // prevent leak if new throws
-        {
-            pn = new count_type(1);
-        }
-        catch(...)
-        {
-            boost::checked_array_delete(p);
-            throw;
-        }
-
-#else
-
-        pn = new count_type(1);
-
-        if(pn == 0)
-        {
-            boost::checked_array_delete(p);
-            boost::throw_exception(std::bad_alloc());
-        }
-
-#endif
-    }
-
-    ~shared_array()
-    {
-        if(--*pn == 0)
-        {
-            boost::checked_array_delete(px);
-            delete pn;
-        }
-    }
-
-    shared_array(shared_array const & r) : px(r.px)  // never throws
-    {
-        pn = r.pn;
-        ++*pn;
-    }
-
-    shared_array & operator=(shared_array const & r)
-    {
-        shared_array(r).swap(*this);
-        return *this;
-    }
-
-    void reset(T * p = 0)
-    {
-        BOOST_ASSERT(p == 0 || p != px);
-        shared_array(p).swap(*this);
-    }
-
-    T * get() const  // never throws
-    {
-        return px;
-    }
-
-    T & operator[](std::ptrdiff_t i) const  // never throws
-    {
-        BOOST_ASSERT(px != 0);
-        BOOST_ASSERT(i >= 0);
-        return px[i];
-    }
-
-    long use_count() const  // never throws
-    {
-        return *pn;
-    }
-
-    bool unique() const  // never throws
-    {
-        return *pn == 1;
-    }
-
-    void swap(shared_array<T> & other)  // never throws
-    {
-        std::swap(px, other.px);
-        std::swap(pn, other.pn);
-    }
-
-private:
-
-    T * px;            // contained pointer
-    count_type * pn;   // ptr to reference counter
-      
-};  // shared_array
-
-template<class T, class U> inline bool operator==(shared_array<T> const & a, shared_array<U> const & b)
-{
-    return a.get() == b.get();
-}
-
-template<class T, class U> inline bool operator!=(shared_array<T> const & a, shared_array<U> const & b)
-{
-    return a.get() != b.get();
-}
-
-template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b)
-{
-    return std::less<T*>()(a.get(), b.get());
-}
-
-template<class T> void swap(shared_array<T> & a, shared_array<T> & b)
-{
-    a.swap(b);
-}
-
-} // namespace boost
-
-#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
--- a/DEPENDENCIES/generic/include/boost/smart_ptr/detail/shared_ptr_nmt.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-#ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
-#define BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
-
-//
-//  detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates
-//
-//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
-//  Copyright (c) 2001, 2002 Peter Dimov
-//
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-//
-//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
-//
-
-#include <boost/assert.hpp>
-#include <boost/checked_delete.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/smart_ptr/detail/atomic_count.hpp>
-
-#ifndef BOOST_NO_AUTO_PTR
-# include <memory>          // for std::auto_ptr
-#endif
-
-#include <algorithm>        // for std::swap
-#include <functional>       // for std::less
-#include <new>              // for std::bad_alloc
-
-namespace boost
-{
-
-template<class T> class shared_ptr
-{
-private:
-
-    typedef detail::atomic_count count_type;
-
-public:
-
-    typedef T element_type;
-    typedef T value_type;
-
-    explicit shared_ptr(T * p = 0): px(p)
-    {
-#ifndef BOOST_NO_EXCEPTIONS
-
-        try  // prevent leak if new throws
-        {
-            pn = new count_type(1);
-        }
-        catch(...)
-        {
-            boost::checked_delete(p);
-            throw;
-        }
-
-#else
-
-        pn = new count_type(1);
-
-        if(pn == 0)
-        {
-            boost::checked_delete(p);
-            boost::throw_exception(std::bad_alloc());
-        }
-
-#endif
-    }
-
-    ~shared_ptr()
-    {
-        if(--*pn == 0)
-        {
-            boost::checked_delete(px);
-            delete pn;
-        }
-    }
-
-    shared_ptr(shared_ptr const & r): px(r.px)  // never throws
-    {
-        pn = r.pn;
-        ++*pn;
-    }
-
-    shared_ptr & operator=(shared_ptr const & r)
-    {
-        shared_ptr(r).swap(*this);
-        return *this;
-    }
-
-#ifndef BOOST_NO_AUTO_PTR
-
-    explicit shared_ptr(std::auto_ptr<T> & r)
-    { 
-        pn = new count_type(1); // may throw
-        px = r.release(); // fix: moved here to stop leak if new throws
-    } 
-
-    shared_ptr & operator=(std::auto_ptr<T> & r)
-    {
-        shared_ptr(r).swap(*this);
-        return *this;
-    }
-
-#endif
-
-    void reset(T * p = 0)
-    {
-        BOOST_ASSERT(p == 0 || p != px);
-        shared_ptr(p).swap(*this);
-    }
-
-    T & operator*() const  // never throws
-    {
-        BOOST_ASSERT(px != 0);
-        return *px;
-    }
-
-    T * operator->() const  // never throws
-    {
-        BOOST_ASSERT(px != 0);
-        return px;
-    }
-
-    T * get() const  // never throws
-    {
-        return px;
-    }
-
-    long use_count() const  // never throws
-    {
-        return *pn;
-    }
-
-    bool unique() const  // never throws
-    {
-        return *pn == 1;
-    }
-    
-    void swap(shared_ptr<T> & other)  // never throws
-    {
-        std::swap(px, other.px);
-        std::swap(pn, other.pn);
-    }
-
-private:
-
-    T * px;            // contained pointer
-    count_type * pn;   // ptr to reference counter
-};
-
-template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
-{
-    return a.get() == b.get();
-}
-
-template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
-{
-    return a.get() != b.get();
-}
-
-template<class T> inline bool operator<(shared_ptr<T> const & a, shared_ptr<T> const & b)
-{
-    return std::less<T*>()(a.get(), b.get());
-}
-
-template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b)
-{
-    a.swap(b);
-}
-
-// get_pointer() enables boost::mem_fn to recognize shared_ptr
-
-template<class T> inline T * get_pointer(shared_ptr<T> const & p)
-{
-    return p.get();
-}
-
-} // namespace boost
-
-#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_counted_base_clang.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,140 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  detail/sp_counted_base_clang.hpp - __c11 clang intrinsics
+//
+//  Copyright (c) 2007, 2013, 2015 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/detail/sp_typeinfo.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
+
+inline void atomic_increment( atomic_int_least32_t * pw )
+{
+    __c11_atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
+}
+
+inline boost::int_least32_t atomic_decrement( atomic_int_least32_t * pw )
+{
+    return __c11_atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
+}
+
+inline boost::int_least32_t atomic_conditional_increment( atomic_int_least32_t * pw )
+{
+    // long r = *pw;
+    // if( r != 0 ) ++*pw;
+    // return r;
+
+    boost::int_least32_t r = __c11_atomic_load( pw, __ATOMIC_RELAXED );
+
+    for( ;; )
+    {
+        if( r == 0 )
+        {
+            return r;
+        }
+
+        if( __c11_atomic_compare_exchange_weak( pw, &r, r + 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
+        {
+            return r;
+        }
+    }    
+}
+
+class sp_counted_base
+{
+private:
+
+    sp_counted_base( sp_counted_base const & );
+    sp_counted_base & operator= ( sp_counted_base const & );
+
+    atomic_int_least32_t use_count_;	// #shared
+    atomic_int_least32_t weak_count_;	// #weak + (#shared != 0)
+
+public:
+
+    sp_counted_base()
+    {
+        __c11_atomic_init( &use_count_, 1 );
+        __c11_atomic_init( &weak_count_, 1 );
+    }
+
+    virtual ~sp_counted_base() // nothrow
+    {
+    }
+
+    // dispose() is called when use_count_ drops to zero, to release
+    // the resources managed by *this.
+
+    virtual void dispose() = 0; // nothrow
+
+    // destroy() is called when weak_count_ drops to zero.
+
+    virtual void destroy() // nothrow
+    {
+        delete this;
+    }
+
+    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
+    virtual void * get_untyped_deleter() = 0;
+
+    void add_ref_copy()
+    {
+        atomic_increment( &use_count_ );
+    }
+
+    bool add_ref_lock() // true on success
+    {
+        return atomic_conditional_increment( &use_count_ ) != 0;
+    }
+
+    void release() // nothrow
+    {
+        if( atomic_decrement( &use_count_ ) == 1 )
+        {
+            dispose();
+            weak_release();
+        }
+    }
+
+    void weak_add_ref() // nothrow
+    {
+        atomic_increment( &weak_count_ );
+    }
+
+    void weak_release() // nothrow
+    {
+        if( atomic_decrement( &weak_count_ ) == 1 )
+        {
+            destroy();
+        }
+    }
+
+    long use_count() const // nothrow
+    {
+        return __c11_atomic_load( const_cast< atomic_int_least32_t* >( &use_count_ ), __ATOMIC_ACQUIRE );
+    }
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,137 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  detail/sp_counted_base_std_atomic.hpp - C++11 std::atomic
+//
+//  Copyright (c) 2007, 2013 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/detail/sp_typeinfo.hpp>
+#include <atomic>
+#include <cstdint>
+
+namespace boost
+{
+
+namespace detail
+{
+
+inline void atomic_increment( std::atomic_int_least32_t * pw )
+{
+    pw->fetch_add( 1, std::memory_order_relaxed );
+}
+
+inline std::int_least32_t atomic_decrement( std::atomic_int_least32_t * pw )
+{
+    return pw->fetch_sub( 1, std::memory_order_acq_rel );
+}
+
+inline std::int_least32_t atomic_conditional_increment( std::atomic_int_least32_t * pw )
+{
+    // long r = *pw;
+    // if( r != 0 ) ++*pw;
+    // return r;
+
+    std::int_least32_t r = pw->load( std::memory_order_relaxed );
+
+    for( ;; )
+    {
+        if( r == 0 )
+        {
+            return r;
+        }
+
+        if( pw->compare_exchange_weak( r, r + 1, std::memory_order_relaxed, std::memory_order_relaxed ) )
+        {
+            return r;
+        }
+    }    
+}
+
+class sp_counted_base
+{
+private:
+
+    sp_counted_base( sp_counted_base const & );
+    sp_counted_base & operator= ( sp_counted_base const & );
+
+    std::atomic_int_least32_t use_count_;	// #shared
+    std::atomic_int_least32_t weak_count_;	// #weak + (#shared != 0)
+
+public:
+
+    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
+    {
+    }
+
+    virtual ~sp_counted_base() // nothrow
+    {
+    }
+
+    // dispose() is called when use_count_ drops to zero, to release
+    // the resources managed by *this.
+
+    virtual void dispose() = 0; // nothrow
+
+    // destroy() is called when weak_count_ drops to zero.
+
+    virtual void destroy() // nothrow
+    {
+        delete this;
+    }
+
+    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
+    virtual void * get_untyped_deleter() = 0;
+
+    void add_ref_copy()
+    {
+        atomic_increment( &use_count_ );
+    }
+
+    bool add_ref_lock() // true on success
+    {
+        return atomic_conditional_increment( &use_count_ ) != 0;
+    }
+
+    void release() // nothrow
+    {
+        if( atomic_decrement( &use_count_ ) == 1 )
+        {
+            dispose();
+            weak_release();
+        }
+    }
+
+    void weak_add_ref() // nothrow
+    {
+        atomic_increment( &weak_count_ );
+    }
+
+    void weak_release() // nothrow
+    {
+        if( atomic_decrement( &weak_count_ ) == 1 )
+        {
+            destroy();
+        }
+    }
+
+    long use_count() const // nothrow
+    {
+        return use_count_.load( std::memory_order_acquire );
+    }
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_interlocked.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,152 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/sp_interlocked.hpp
+//
+//  Copyright 2005, 2014 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/config.hpp>
+
+// BOOST_SP_HAS_INTRIN_H
+
+// VC9 has intrin.h, but it collides with <utility>
+#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1600
+
+# define BOOST_SP_HAS_INTRIN_H
+
+// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets.
+#elif defined( __MINGW64_VERSION_MAJOR )
+
+// MinGW-w64 provides intrin.h for both 32 and 64-bit targets.
+# define BOOST_SP_HAS_INTRIN_H
+
+// Intel C++ on Windows on VC10+ stdlib
+#elif defined( BOOST_INTEL_WIN ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520
+
+# define BOOST_SP_HAS_INTRIN_H
+
+#endif
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+# include <windows.h>
+
+# define BOOST_SP_INTERLOCKED_INCREMENT InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
+
+#elif defined( BOOST_USE_INTRIN_H ) || defined( BOOST_SP_HAS_INTRIN_H )
+
+#include <intrin.h>
+
+# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+#elif defined( _WIN32_WCE )
+
+#if _WIN32_WCE >= 0x600
+
+extern "C" long __cdecl _InterlockedIncrement( long volatile * );
+extern "C" long __cdecl _InterlockedDecrement( long volatile * );
+extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
+extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
+extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
+
+# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+#else
+
+// under Windows CE we still have old-style Interlocked* functions
+
+extern "C" long __cdecl InterlockedIncrement( long* );
+extern "C" long __cdecl InterlockedDecrement( long* );
+extern "C" long __cdecl InterlockedCompareExchange( long*, long, long );
+extern "C" long __cdecl InterlockedExchange( long*, long );
+extern "C" long __cdecl InterlockedExchangeAdd( long*, long );
+
+# define BOOST_SP_INTERLOCKED_INCREMENT InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
+
+#endif
+
+#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
+
+#if defined( __CLRCALL_PURE_OR_CDECL )
+
+extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * );
+extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * );
+extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long );
+extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long );
+extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long );
+
+#else
+
+extern "C" long __cdecl _InterlockedIncrement( long volatile * );
+extern "C" long __cdecl _InterlockedDecrement( long volatile * );
+extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
+extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
+extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
+
+#endif
+
+# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
+
+#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
+
+namespace boost
+{
+
+namespace detail
+{
+
+extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * );
+extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
+extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long );
+extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long );
+extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long );
+
+} // namespace detail
+
+} // namespace boost
+
+# define BOOST_SP_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement
+# define BOOST_SP_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
+# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
+# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd
+
+#else
+
+# error "Interlocked intrinsics not available"
+
+#endif
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/spinlock_std_atomic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,83 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  Copyright (c) 2014 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/smart_ptr/detail/yield_k.hpp>
+#include <atomic>
+
+namespace boost
+{
+
+namespace detail
+{
+
+class spinlock
+{
+public:
+
+    std::atomic_flag v_;
+
+public:
+
+    bool try_lock()
+    {
+        return !v_.test_and_set( std::memory_order_acquire );
+    }
+
+    void lock()
+    {
+        for( unsigned k = 0; !try_lock(); ++k )
+        {
+            boost::detail::yield( k );
+        }
+    }
+
+    void unlock()
+    {
+        v_ .clear( std::memory_order_release );
+    }
+
+public:
+
+    class scoped_lock
+    {
+    private:
+
+        spinlock & sp_;
+
+        scoped_lock( scoped_lock const & );
+        scoped_lock & operator=( scoped_lock const & );
+
+    public:
+
+        explicit scoped_lock( spinlock & sp ): sp_( sp )
+        {
+            sp.lock();
+        }
+
+        ~scoped_lock()
+        {
+            sp_.unlock();
+        }
+    };
+};
+
+} // namespace detail
+} // namespace boost
+
+#define BOOST_DETAIL_SPINLOCK_INIT { ATOMIC_FLAG_INIT }
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/up_if_array.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes 
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License, 
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt 
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_DETAIL_UP_IF_ARRAY_HPP
+#define BOOST_SMART_PTR_DETAIL_UP_IF_ARRAY_HPP
+
+#include <memory>
+
+namespace boost {
+    namespace detail {
+        template<class T>
+        struct up_if_array;
+
+        template<class T>
+        struct up_if_array<T[]> {
+            typedef std::unique_ptr<T[]> type;
+        };
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/detail/up_if_not_array.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes 
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License, 
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt 
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_DETAIL_UP_IF_NOT_ARRAY_HPP
+#define BOOST_SMART_PTR_DETAIL_UP_IF_NOT_ARRAY_HPP
+
+#include <memory>
+
+namespace boost {
+    namespace detail {
+        template<class T> 
+        struct up_if_not_array {
+            typedef std::unique_ptr<T> type;
+        };
+
+        template<class T>
+        struct up_if_not_array<T[]> {
+        };
+
+        template<class T, std::size_t N>
+        struct up_if_not_array<T[N]> {
+        };
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/make_unique.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License,
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP
+#define BOOST_SMART_PTR_MAKE_UNIQUE_HPP
+
+#include <boost/smart_ptr/make_unique_array.hpp>
+#include <boost/smart_ptr/make_unique_object.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/make_unique_array.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License,
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_ARRAY_HPP
+#define BOOST_SMART_PTR_MAKE_UNIQUE_ARRAY_HPP
+
+#include <boost/smart_ptr/detail/up_if_array.hpp>
+#include <boost/smart_ptr/detail/array_traits.hpp>
+
+namespace boost {
+    template<class T>
+    inline typename boost::detail::up_if_array<T>::type
+    make_unique(std::size_t size) {
+        typedef typename boost::detail::array_inner<T>::type U;
+        return std::unique_ptr<T>(new U[size]());
+    }
+    
+    template<class T>
+    inline typename boost::detail::up_if_array<T>::type
+    make_unique_noinit(std::size_t size) {
+        typedef typename boost::detail::array_inner<T>::type U;
+        return std::unique_ptr<T>(new U[size]);
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/smart_ptr/make_unique_object.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014 Glen Joseph Fernandes
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License,
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_OBJECT_HPP
+#define BOOST_SMART_PTR_MAKE_UNIQUE_OBJECT_HPP
+
+#include <boost/config.hpp>
+#include <boost/smart_ptr/detail/up_if_not_array.hpp>
+#include <boost/type_traits/add_rvalue_reference.hpp>
+#include <utility>
+
+namespace boost {
+    template<class T>
+    inline typename boost::detail::up_if_not_array<T>::type
+    make_unique() {
+        return std::unique_ptr<T>(new T());
+    }
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template<class T, class... Args>
+    inline typename boost::detail::up_if_not_array<T>::type
+    make_unique(Args&&... args) {
+        return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
+    }
+#endif
+    
+    template<class T>
+    inline typename boost::detail::up_if_not_array<T>::type
+    make_unique(typename add_rvalue_reference<T>::type value) {
+        return std::unique_ptr<T>(new T(std::move(value)));
+    }
+
+    template<class T>
+    inline typename boost::detail::up_if_not_array<T>::type
+    make_unique_noinit() {
+        return std::unique_ptr<T>(new T);
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+// The Boost Sort library cumulative header.
+
+//          Copyright Steven J. Ross 2014
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort/ for library home page.
+
+#ifndef BOOST_SORT_HPP
+#define BOOST_SORT_HPP
+
+/*
+Cumulative include for the Boost Sort library
+*/
+
+#include <boost/sort/spreadsort/spreadsort.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/constants.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+//constant definitions for the Boost Sort library
+
+//          Copyright Steven J. Ross 2001 - 2014
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/sort for library home page.
+#ifndef BOOST_SORT_SPREADSORT_DETAIL_CONSTANTS
+#define BOOST_SORT_SPREADSORT_DETAIL_CONSTANTS
+namespace boost {
+namespace sort {
+namespace spreadsort {
+namespace detail {
+//Tuning constants
+//This should be tuned to your processor cache;
+//if you go too large you get cache misses on bins
+//The smaller this number, the less worst-case memory usage.
+//If too small, too many recursions slow down spreadsort
+enum { max_splits = 11,
+//It's better to have a few cache misses and finish sorting
+//than to run another iteration
+max_finishing_splits = max_splits + 1,
+//Sets the minimum number of items per bin.
+int_log_mean_bin_size = 2,
+//Used to force a comparison-based sorting for small bins, if it's faster.
+//Minimum value 1
+int_log_min_split_count = 9,
+//This is the minimum split count to use spreadsort when it will finish in one
+//iteration.  Make this larger the faster std::sort is relative to integer_sort.
+int_log_finishing_count = 31,
+//Sets the minimum number of items per bin for floating point.
+float_log_mean_bin_size = 2,
+//Used to force a comparison-based sorting for small bins, if it's faster.
+//Minimum value 1
+float_log_min_split_count = 8,
+//This is the minimum split count to use spreadsort when it will finish in one
+//iteration.  Make this larger the faster std::sort is relative to float_sort.
+float_log_finishing_count = 4,
+//There is a minimum size below which it is not worth using spreadsort
+min_sort_size = 1000 };
+}
+}
+}
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/float_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,806 @@
+// Details for templated Spreadsort-based float_sort.
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+float_mem_cast fix provided by:
+Scott McMurray
+*/
+
+#ifndef BOOST_SORT_SPREADSORT_DETAIL_FLOAT_SORT_HPP
+#define BOOST_SORT_SPREADSORT_DETAIL_FLOAT_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <limits>
+#include <functional>
+#include <boost/static_assert.hpp>
+#include <boost/serialization/static_warning.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/integer_sort.hpp>
+#include <boost/sort/spreadsort/detail/spreadsort_common.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+  namespace detail {
+    //Casts a RandomAccessIter to the specified integer type
+    template<class Cast_type, class RandomAccessIter>
+    inline Cast_type
+    cast_float_iter(const RandomAccessIter & floatiter)
+    {
+      typedef typename std::iterator_traits<RandomAccessIter>::value_type
+        Data_type;
+      //Only cast IEEE floating-point numbers, and only to same-sized integers
+      BOOST_STATIC_ASSERT(sizeof(Cast_type) == sizeof(Data_type));
+      BOOST_STATIC_ASSERT(std::numeric_limits<Data_type>::is_iec559);
+      BOOST_STATIC_ASSERT(std::numeric_limits<Cast_type>::is_integer);
+      Cast_type result;
+      std::memcpy(&result, &(*floatiter), sizeof(Data_type));
+      return result;
+    }
+
+    // Return true if the list is sorted.  Otherwise, find the minimum and
+    // maximum.  Values are Right_shifted 0 bits before comparison.
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline bool
+    is_sorted_or_find_extremes(RandomAccessIter current, RandomAccessIter last,
+                  Div_type & max, Div_type & min, Right_shift rshift)
+    {
+      min = max = rshift(*current, 0);
+      Div_type prev = min;
+      bool sorted = true;
+      while (++current < last) {
+        Div_type value = rshift(*current, 0);
+        sorted &= value >= prev;
+        prev = value;
+        if (max < value)
+          max = value;
+        else if (value < min)
+          min = value;
+      }
+      return sorted;
+    }
+
+    //Specialized swap loops for floating-point casting
+    template <class RandomAccessIter, class Div_type>
+    inline void inner_float_swap_loop(RandomAccessIter * bins,
+                        const RandomAccessIter & nextbinstart, unsigned ii
+                        , const unsigned log_divisor, const Div_type div_min)
+    {
+      RandomAccessIter * local_bin = bins + ii;
+      for (RandomAccessIter current = *local_bin; current < nextbinstart;
+          ++current) {
+        for (RandomAccessIter * target_bin =
+            (bins + ((cast_float_iter<Div_type, RandomAccessIter>(current) >>
+                      log_divisor) - div_min));  target_bin != local_bin;
+          target_bin = bins + ((cast_float_iter<Div_type, RandomAccessIter>
+                               (current) >> log_divisor) - div_min)) {
+          typename std::iterator_traits<RandomAccessIter>::value_type tmp;
+          RandomAccessIter b = (*target_bin)++;
+          RandomAccessIter * b_bin = bins + ((cast_float_iter<Div_type,
+                              RandomAccessIter>(b) >> log_divisor) - div_min);
+          //Three-way swap; if the item to be swapped doesn't belong in the
+          //current bin, swap it to where it belongs
+          if (b_bin != local_bin) {
+            RandomAccessIter c = (*b_bin)++;
+            tmp = *c;
+            *c = *b;
+          }
+          else
+            tmp = *b;
+          *b = *current;
+          *current = tmp;
+        }
+      }
+      *local_bin = nextbinstart;
+    }
+
+    template <class RandomAccessIter, class Div_type>
+    inline void float_swap_loop(RandomAccessIter * bins,
+                          RandomAccessIter & nextbinstart, unsigned ii,
+                          const size_t *bin_sizes,
+                          const unsigned log_divisor, const Div_type div_min)
+    {
+      nextbinstart += bin_sizes[ii];
+      inner_float_swap_loop<RandomAccessIter, Div_type>
+        (bins, nextbinstart, ii, log_divisor, div_min);
+    }
+
+    // Return true if the list is sorted.  Otherwise, find the minimum and
+    // maximum.  Values are cast to Cast_type before comparison.
+    template <class RandomAccessIter, class Cast_type>
+    inline bool
+    is_sorted_or_find_extremes(RandomAccessIter current, RandomAccessIter last,
+                  Cast_type & max, Cast_type & min)
+    {
+      min = max = cast_float_iter<Cast_type, RandomAccessIter>(current);
+      Cast_type prev = min;
+      bool sorted = true;
+      while (++current < last) {
+        Cast_type value = cast_float_iter<Cast_type, RandomAccessIter>(current);
+        sorted &= value >= prev;
+        prev = value;
+        if (max < value)
+          max = value;
+        else if (value < min)
+          min = value;
+      }
+      return sorted;
+    }
+
+    //Special-case sorting of positive floats with casting
+    template <class RandomAccessIter, class Div_type, class Size_type>
+    inline void
+    positive_float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+              , size_t *bin_sizes)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes<RandomAccessIter, Div_type>(first, last, 
+                                                                max, min))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned((cast_float_iter<Div_type, RandomAccessIter>(
+            current++) >> log_divisor) - div_min)]++;
+      bins[0] = first;
+      for (unsigned u = 0; u < bin_count - 1; u++)
+        bins[u + 1] = bins[u] + bin_sizes[u];
+
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      for (unsigned u = 0; u < bin_count - 1; ++u)
+        float_swap_loop<RandomAccessIter, Div_type>
+          (bins, nextbinstart, u, bin_sizes, log_divisor, div_min);
+      bins[bin_count - 1] = last;
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u],
+          ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u]);
+        else
+          positive_float_sort_rec<RandomAccessIter, Div_type, Size_type>
+            (lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
+      }
+    }
+
+    //Sorting negative floats
+    //Bins are iterated in reverse because max_neg_float = min_neg_int
+    template <class RandomAccessIter, class Div_type, class Size_type>
+    inline void
+    negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+                        std::vector<RandomAccessIter> &bin_cache,
+                        unsigned cache_offset, size_t *bin_sizes)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes<RandomAccessIter, Div_type>(first, last, 
+                                                                max, min))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned((cast_float_iter<Div_type, RandomAccessIter>(
+            current++) >> log_divisor) - div_min)]++;
+      bins[bin_count - 1] = first;
+      for (int ii = bin_count - 2; ii >= 0; --ii)
+        bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      //The last bin will always have the correct elements in it
+      for (int ii = bin_count - 1; ii > 0; --ii)
+        float_swap_loop<RandomAccessIter, Div_type>
+          (bins, nextbinstart, ii, bin_sizes, log_divisor, div_min);
+      //Update the end position because we don't process the last bin
+      bin_cache[cache_offset] = last;
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_end - 1; ii >= static_cast<int>(cache_offset);
+          lastPos = bin_cache[ii], --ii) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii]);
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type, Size_type>
+            (lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
+      }
+    }
+
+    //Sorting negative floats
+    //Bins are iterated in reverse order because max_neg_float = min_neg_int
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Size_type>
+    inline void
+    negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+              , size_t *bin_sizes, Right_shift rshift)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      bins[bin_count - 1] = first;
+      for (int ii = bin_count - 2; ii >= 0; --ii)
+        bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      //The last bin will always have the correct elements in it
+      for (int ii = bin_count - 1; ii > 0; --ii)
+        swap_loop<RandomAccessIter, Div_type, Right_shift>
+          (bins, nextbinstart, ii, rshift, bin_sizes, log_divisor, div_min);
+      //Update the end position of the unprocessed last bin
+      bin_cache[cache_offset] = last;
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_end - 1; ii >= static_cast<int>(cache_offset);
+          lastPos = bin_cache[ii], --ii) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii]);
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type, Right_shift,
+                                  Size_type>
+            (lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, rshift);
+      }
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare, class Size_type>
+    inline void
+    negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+            std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset,
+            size_t *bin_sizes, Right_shift rshift, Compare comp)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      bins[bin_count - 1] = first;
+      for (int ii = bin_count - 2; ii >= 0; --ii)
+        bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      //The last bin will always have the correct elements in it
+      for (int ii = bin_count - 1; ii > 0; --ii)
+        swap_loop<RandomAccessIter, Div_type, Right_shift>
+          (bins, nextbinstart, ii, rshift, bin_sizes, log_divisor, div_min);
+      //Update the end position of the unprocessed last bin
+      bin_cache[cache_offset] = last;
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_end - 1; ii >= static_cast<int>(cache_offset);
+          lastPos = bin_cache[ii], --ii) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii], comp);
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type, Right_shift,
+                                  Compare, Size_type>(lastPos, bin_cache[ii],
+                                                      bin_cache, cache_end,
+                                                      bin_sizes, rshift, comp);
+      }
+    }
+
+    //Casting special-case for floating-point sorting
+    template <class RandomAccessIter, class Div_type, class Size_type>
+    inline void
+    float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+                std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+                , size_t *bin_sizes)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes<RandomAccessIter, Div_type>(first, last, 
+                                                                max, min))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned((cast_float_iter<Div_type, RandomAccessIter>(
+            current++) >> log_divisor) - div_min)]++;
+      //The index of the first positive bin
+      //Must be divided small enough to fit into an integer
+      unsigned first_positive = (div_min < 0) ? unsigned(-div_min) : 0;
+      //Resetting if all bins are negative
+      if (cache_offset + first_positive > cache_end)
+        first_positive = cache_end - cache_offset;
+      //Reversing the order of the negative bins
+      //Note that because of the negative/positive ordering direction flip
+      //We can not depend upon bin order and positions matching up
+      //so bin_sizes must be reused to contain the end of the bin
+      if (first_positive > 0) {
+        bins[first_positive - 1] = first;
+        for (int ii = first_positive - 2; ii >= 0; --ii) {
+          bins[ii] = first + bin_sizes[ii + 1];
+          bin_sizes[ii] += bin_sizes[ii + 1];
+        }
+        //Handling positives following negatives
+        if (first_positive < bin_count) {
+          bins[first_positive] = first + bin_sizes[0];
+          bin_sizes[first_positive] += bin_sizes[0];
+        }
+      }
+      else
+        bins[0] = first;
+      for (unsigned u = first_positive; u < bin_count - 1; u++) {
+        bins[u + 1] = first + bin_sizes[u];
+        bin_sizes[u + 1] += bin_sizes[u];
+      }
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      for (unsigned u = 0; u < bin_count; ++u) {
+        nextbinstart = first + bin_sizes[u];
+        inner_float_swap_loop<RandomAccessIter, Div_type>
+          (bins, nextbinstart, u, log_divisor, div_min);
+      }
+
+      if (!log_divisor)
+        return;
+
+      //Handling negative values first
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_offset + first_positive - 1; 
+           ii >= static_cast<int>(cache_offset);
+           lastPos = bin_cache[ii--]) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii]);
+        //sort negative values using reversed-bin spreadsort
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type, Size_type>
+            (lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
+      }
+
+      for (unsigned u = cache_offset + first_positive; u < cache_end;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u]);
+        //sort positive values using normal spreadsort
+        else
+          positive_float_sort_rec<RandomAccessIter, Div_type, Size_type>
+            (lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
+      }
+    }
+
+    //Functor implementation for recursive sorting
+    template <class RandomAccessIter, class Div_type, class Right_shift
+      , class Size_type>
+    inline void
+    float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+              , size_t *bin_sizes, Right_shift rshift)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      //The index of the first positive bin
+      unsigned first_positive = (div_min < 0) ? unsigned(-div_min) : 0;
+      //Resetting if all bins are negative
+      if (cache_offset + first_positive > cache_end)
+        first_positive = cache_end - cache_offset;
+      //Reversing the order of the negative bins
+      //Note that because of the negative/positive ordering direction flip
+      //We can not depend upon bin order and positions matching up
+      //so bin_sizes must be reused to contain the end of the bin
+      if (first_positive > 0) {
+        bins[first_positive - 1] = first;
+        for (int ii = first_positive - 2; ii >= 0; --ii) {
+          bins[ii] = first + bin_sizes[ii + 1];
+          bin_sizes[ii] += bin_sizes[ii + 1];
+        }
+        //Handling positives following negatives
+        if (static_cast<unsigned>(first_positive) < bin_count) {
+          bins[first_positive] = first + bin_sizes[0];
+          bin_sizes[first_positive] += bin_sizes[0];
+        }
+      }
+      else
+        bins[0] = first;
+      for (unsigned u = first_positive; u < bin_count - 1; u++) {
+        bins[u + 1] = first + bin_sizes[u];
+        bin_sizes[u + 1] += bin_sizes[u];
+      }
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      for (unsigned u = 0; u < bin_count; ++u) {
+        next_bin_start = first + bin_sizes[u];
+        inner_swap_loop<RandomAccessIter, Div_type, Right_shift>
+          (bins, next_bin_start, u, rshift, log_divisor, div_min);
+      }
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Handling negative values first
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_offset + first_positive - 1; 
+           ii >= static_cast<int>(cache_offset);
+           lastPos = bin_cache[ii--]) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii]);
+        //sort negative values using reversed-bin spreadsort
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type,
+            Right_shift, Size_type>(lastPos, bin_cache[ii], bin_cache,
+                                    cache_end, bin_sizes, rshift);
+      }
+
+      for (unsigned u = cache_offset + first_positive; u < cache_end;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u]);
+        //sort positive values using normal spreadsort
+        else
+          spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Size_type,
+                          float_log_mean_bin_size, float_log_min_split_count,
+                          float_log_finishing_count>
+            (lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, rshift);
+      }
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare, class Size_type>
+    inline void
+    float_sort_rec(RandomAccessIter first, RandomAccessIter last,
+            std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset,
+            size_t *bin_sizes, Right_shift rshift, Compare comp)
+    {
+      Div_type max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+        return;
+      unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type(max - min)));
+      Div_type div_min = min >> log_divisor;
+      Div_type div_max = max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      //The index of the first positive bin
+      unsigned first_positive = 
+        (div_min < 0) ? static_cast<unsigned>(-div_min) : 0;
+      //Resetting if all bins are negative
+      if (cache_offset + first_positive > cache_end)
+        first_positive = cache_end - cache_offset;
+      //Reversing the order of the negative bins
+      //Note that because of the negative/positive ordering direction flip
+      //We can not depend upon bin order and positions matching up
+      //so bin_sizes must be reused to contain the end of the bin
+      if (first_positive > 0) {
+        bins[first_positive - 1] = first;
+        for (int ii = first_positive - 2; ii >= 0; --ii) {
+          bins[ii] = first + bin_sizes[ii + 1];
+          bin_sizes[ii] += bin_sizes[ii + 1];
+        }
+        //Handling positives following negatives
+        if (static_cast<unsigned>(first_positive) < bin_count) {
+          bins[first_positive] = first + bin_sizes[0];
+          bin_sizes[first_positive] += bin_sizes[0];
+        }
+      }
+      else
+        bins[0] = first;
+      for (unsigned u = first_positive; u < bin_count - 1; u++) {
+        bins[u + 1] = first + bin_sizes[u];
+        bin_sizes[u + 1] += bin_sizes[u];
+      }
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      for (unsigned u = 0; u < bin_count; ++u) {
+        next_bin_start = first + bin_sizes[u];
+        inner_swap_loop<RandomAccessIter, Div_type, Right_shift>
+          (bins, next_bin_start, u, rshift, log_divisor, div_min);
+      }
+
+      //Return if we've completed bucketsorting
+      if (!log_divisor)
+        return;
+
+      //Handling negative values first
+      size_t max_count = get_min_count<float_log_mean_bin_size,
+                                       float_log_min_split_count,
+                                       float_log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (int ii = cache_offset + first_positive - 1; 
+           ii >= static_cast<int>(cache_offset);
+           lastPos = bin_cache[ii--]) {
+        size_t count = bin_cache[ii] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[ii], comp);
+        //sort negative values using reversed-bin spreadsort
+        else
+          negative_float_sort_rec<RandomAccessIter, Div_type, Right_shift,
+                                  Compare, Size_type>(lastPos, bin_cache[ii],
+                                                      bin_cache, cache_end,
+                                                      bin_sizes, rshift, comp);
+      }
+
+      for (unsigned u = cache_offset + first_positive; u < cache_end;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u], comp);
+        //sort positive values using normal spreadsort
+        else
+          spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+                          Size_type, float_log_mean_bin_size,
+                          float_log_min_split_count, float_log_finishing_count>
+      (lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, rshift, comp);
+      }
+    }
+
+    //Checking whether the value type is a float, and trying a 32-bit integer
+    template <class RandomAccessIter>
+    inline typename boost::enable_if_c< sizeof(boost::uint32_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type)
+      && std::numeric_limits<typename
+      std::iterator_traits<RandomAccessIter>::value_type>::is_iec559,
+      void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, boost::int32_t, boost::uint32_t>
+        (first, last, bin_cache, 0, bin_sizes);
+    }
+
+    //Checking whether the value type is a double, and using a 64-bit integer
+    template <class RandomAccessIter>
+    inline typename boost::enable_if_c< sizeof(boost::uint64_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type)
+      && std::numeric_limits<typename
+      std::iterator_traits<RandomAccessIter>::value_type>::is_iec559,
+      void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, boost::int64_t, boost::uint64_t>
+        (first, last, bin_cache, 0, bin_sizes);
+    }
+
+    template <class RandomAccessIter>
+    inline typename boost::disable_if_c< (sizeof(boost::uint64_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type)
+      || sizeof(boost::uint32_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type))
+      && std::numeric_limits<typename
+      std::iterator_traits<RandomAccessIter>::value_type>::is_iec559,
+      void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last)
+    {
+      BOOST_STATIC_WARNING(!(sizeof(boost::uint64_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type)
+      || sizeof(boost::uint32_t) ==
+      sizeof(typename std::iterator_traits<RandomAccessIter>::value_type))
+      || !std::numeric_limits<typename
+      std::iterator_traits<RandomAccessIter>::value_type>::is_iec559);
+      std::sort(first, last);
+    }
+
+    //These approaches require the user to do the typecast
+    //with rshift but default comparision
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline typename boost::enable_if_c< sizeof(size_t) >= sizeof(Div_type),
+      void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, Div_type, Right_shift, size_t>
+        (first, last, bin_cache, 0, bin_sizes, rshift);
+    }
+
+    //maximum integer size with rshift but default comparision
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline typename boost::enable_if_c< sizeof(size_t) < sizeof(Div_type)
+      && sizeof(boost::uintmax_t) >= sizeof(Div_type), void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, Div_type, Right_shift, boost::uintmax_t>
+        (first, last, bin_cache, 0, bin_sizes, rshift);
+    }
+
+    //sizeof(Div_type) doesn't match, so use std::sort
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline typename boost::disable_if_c< sizeof(boost::uintmax_t) >=
+      sizeof(Div_type), void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift)
+    {
+      BOOST_STATIC_WARNING(sizeof(boost::uintmax_t) >= sizeof(Div_type));
+      std::sort(first, last);
+    }
+
+    //specialized comparison
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    inline typename boost::enable_if_c< sizeof(size_t) >= sizeof(Div_type),
+      void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift, Compare comp)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+        size_t>
+        (first, last, bin_cache, 0, bin_sizes, rshift, comp);
+    }
+
+    //max-sized integer with specialized comparison
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    inline typename boost::enable_if_c< sizeof(size_t) < sizeof(Div_type)
+      && sizeof(boost::uintmax_t) >= sizeof(Div_type), void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift, Compare comp)
+    {
+      size_t bin_sizes[1 << max_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      float_sort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+        boost::uintmax_t>
+        (first, last, bin_cache, 0, bin_sizes, rshift, comp);
+    }
+
+    //sizeof(Div_type) doesn't match, so use std::sort
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    inline typename boost::disable_if_c< sizeof(boost::uintmax_t) >=
+      sizeof(Div_type), void >::type
+    float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+               Right_shift rshift, Compare comp)
+    {
+      BOOST_STATIC_WARNING(sizeof(boost::uintmax_t) >= sizeof(Div_type));
+      std::sort(first, last, comp);
+    }
+  }
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/integer_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,494 @@
+// Details for templated Spreadsort-based integer_sort.
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+*/
+
+#ifndef BOOST_SORT_SPREADSORT_DETAIL_INTEGER_SORT_HPP
+#define BOOST_SORT_SPREADSORT_DETAIL_INTEGER_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <limits>
+#include <functional>
+#include <boost/static_assert.hpp>
+#include <boost/serialization/static_warning.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/spreadsort_common.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+  namespace detail {
+    // Return true if the list is sorted.  Otherwise, find the minimum and
+    // maximum using <.
+    template <class RandomAccessIter>
+    inline bool
+    is_sorted_or_find_extremes(RandomAccessIter current, RandomAccessIter last,
+                               RandomAccessIter & max, RandomAccessIter & min)
+    {
+      min = max = current;
+      //This assumes we have more than 1 element based on prior checks.
+      while (!(*(current + 1) < *current)) {
+        //If everything is in sorted order, return
+        if (++current == last - 1)
+          return true;
+      }
+
+      //The maximum is the last sorted element
+      max = current;
+      //Start from the first unsorted element
+      while (++current < last) {
+        if (*max < *current)
+          max = current;
+        else if (*current < *min)
+          min = current;
+      }
+      return false;
+    }
+
+    // Return true if the list is sorted.  Otherwise, find the minimum and
+    // maximum.
+    // Use a user-defined comparison operator
+    template <class RandomAccessIter, class Compare>
+    inline bool
+    is_sorted_or_find_extremes(RandomAccessIter current, RandomAccessIter last,
+                RandomAccessIter & max, RandomAccessIter & min, Compare comp)
+    {
+      min = max = current;
+      while (!comp(*(current + 1), *current)) {
+        //If everything is in sorted order, return
+        if (++current == last - 1)
+          return true;
+      }
+
+      //The maximum is the last sorted element
+      max = current;
+      while (++current < last) {
+        if (comp(*max, *current))
+          max = current;
+        else if (comp(*current, *min))
+          min = current;
+      }
+      return false;
+    }
+
+    //Gets a non-negative right bit shift to operate as a logarithmic divisor
+    template<unsigned log_mean_bin_size>
+    inline int
+    get_log_divisor(size_t count, int log_range)
+    {
+      int log_divisor;
+      //If we can finish in one iteration without exceeding either
+      //(2 to the max_finishing_splits) or n bins, do so
+      if ((log_divisor = log_range - rough_log_2_size(count)) <= 0 && 
+         log_range <= max_finishing_splits)
+        log_divisor = 0; 
+      else {
+        //otherwise divide the data into an optimized number of pieces
+        log_divisor += log_mean_bin_size;
+        //Cannot exceed max_splits or cache misses slow down bin lookups
+        if ((log_range - log_divisor) > max_splits)
+          log_divisor = log_range - max_splits;
+      }
+      return log_divisor;
+    }
+
+    //Implementation for recursive integer sorting
+    template <class RandomAccessIter, class Div_type, class Size_type>
+    inline void
+    spreadsort_rec(RandomAccessIter first, RandomAccessIter last,
+              std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+              , size_t *bin_sizes)
+    {
+      //This step is roughly 10% of runtime, but it helps avoid worst-case
+      //behavior and improve behavior with real data
+      //If you know the maximum and minimum ahead of time, you can pass those
+      //values in and skip this step for the first iteration
+      RandomAccessIter max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min))
+        return;
+      RandomAccessIter * target_bin;
+      unsigned log_divisor = get_log_divisor<int_log_mean_bin_size>(
+          last - first, rough_log_2_size(Size_type((*max >> 0) - (*min >> 0))));
+      Div_type div_min = *min >> log_divisor;
+      Div_type div_max = *max >> log_divisor;
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins =
+        size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[size_t((*(current++) >> log_divisor) - div_min)]++;
+      //Assign the bin positions
+      bins[0] = first;
+      for (unsigned u = 0; u < bin_count - 1; u++)
+        bins[u + 1] = bins[u] + bin_sizes[u];
+
+      RandomAccessIter nextbinstart = first;
+      //Swap into place
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned u = 0; u < bin_count - 1; ++u) {
+        RandomAccessIter * local_bin = bins + u;
+        nextbinstart += bin_sizes[u];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < nextbinstart;
+            ++current) {
+          //Swapping elements in current into place until the correct
+          //element has been swapped in
+          for (target_bin = (bins + ((*current >> log_divisor) - div_min));
+              target_bin != local_bin;
+            target_bin = bins + ((*current >> log_divisor) - div_min)) {
+            //3-way swap; this is about 1% faster than a 2-way swap
+            //The main advantage is less copies are involved per item
+            //put in the correct place
+            typename std::iterator_traits<RandomAccessIter>::value_type tmp;
+            RandomAccessIter b = (*target_bin)++;
+            RandomAccessIter * b_bin = bins + ((*b >> log_divisor) - div_min);
+            if (b_bin != local_bin) {
+              RandomAccessIter c = (*b_bin)++;
+              tmp = *c;
+              *c = *b;
+            }
+            else
+              tmp = *b;
+            *b = *current;
+            *current = tmp;
+          }
+        }
+        *local_bin = nextbinstart;
+      }
+      bins[bin_count - 1] = last;
+
+      //If we've bucketsorted, the array is sorted and we should skip recursion
+      if (!log_divisor)
+        return;
+      //log_divisor is the remaining range; calculating the comparison threshold
+      size_t max_count =
+        get_min_count<int_log_mean_bin_size, int_log_min_split_count,
+                      int_log_finishing_count>(log_divisor);
+
+      //Recursing
+      RandomAccessIter lastPos = first;
+      for (unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u],
+          ++u) {
+        Size_type count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u]);
+        else
+          spreadsort_rec<RandomAccessIter, Div_type, Size_type>(lastPos,
+                                                                 bin_cache[u],
+                                                                 bin_cache,
+                                                                 cache_end,
+                                                                 bin_sizes);
+      }
+    }
+
+    //Generic bitshift-based 3-way swapping code
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline void inner_swap_loop(RandomAccessIter * bins,
+      const RandomAccessIter & next_bin_start, unsigned ii, Right_shift &rshift
+      , const unsigned log_divisor, const Div_type div_min)
+    {
+      RandomAccessIter * local_bin = bins + ii;
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        for (RandomAccessIter * target_bin =
+            (bins + (rshift(*current, log_divisor) - div_min));
+            target_bin != local_bin;
+            target_bin = bins + (rshift(*current, log_divisor) - div_min)) {
+          typename std::iterator_traits<RandomAccessIter>::value_type tmp;
+          RandomAccessIter b = (*target_bin)++;
+          RandomAccessIter * b_bin =
+            bins + (rshift(*b, log_divisor) - div_min);
+          //Three-way swap; if the item to be swapped doesn't belong
+          //in the current bin, swap it to where it belongs
+          if (b_bin != local_bin) {
+            RandomAccessIter c = (*b_bin)++;
+            tmp = *c;
+            *c = *b;
+          }
+          //Note: we could increment current once the swap is done in this case
+          //but that seems to impair performance
+          else
+            tmp = *b;
+          *b = *current;
+          *current = tmp;
+        }
+      }
+      *local_bin = next_bin_start;
+    }
+
+    //Standard swapping wrapper for ascending values
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline void swap_loop(RandomAccessIter * bins,
+             RandomAccessIter & next_bin_start, unsigned ii, Right_shift &rshift
+             , const size_t *bin_sizes
+             , const unsigned log_divisor, const Div_type div_min)
+    {
+      next_bin_start += bin_sizes[ii];
+      inner_swap_loop<RandomAccessIter, Div_type, Right_shift>(bins,
+                              next_bin_start, ii, rshift, log_divisor, div_min);
+    }
+
+    //Functor implementation for recursive sorting
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare, class Size_type, unsigned log_mean_bin_size,
+                unsigned log_min_split_count, unsigned log_finishing_count>
+    inline void
+    spreadsort_rec(RandomAccessIter first, RandomAccessIter last,
+          std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+          , size_t *bin_sizes, Right_shift rshift, Compare comp)
+    {
+      RandomAccessIter max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min, comp))
+        return;
+      unsigned log_divisor = get_log_divisor<log_mean_bin_size>(last - first,
+            rough_log_2_size(Size_type(rshift(*max, 0) - rshift(*min, 0))));
+      Div_type div_min = rshift(*min, log_divisor);
+      Div_type div_max = rshift(*max, log_divisor);
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      bins[0] = first;
+      for (unsigned u = 0; u < bin_count - 1; u++)
+        bins[u + 1] = bins[u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      for (unsigned u = 0; u < bin_count - 1; ++u)
+        swap_loop<RandomAccessIter, Div_type, Right_shift>(bins, next_bin_start,
+                                  u, rshift, bin_sizes, log_divisor, div_min);
+      bins[bin_count - 1] = last;
+
+      //If we've bucketsorted, the array is sorted
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<log_mean_bin_size, log_min_split_count,
+                          log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u],
+          ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u], comp);
+        else
+          spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+        Size_type, log_mean_bin_size, log_min_split_count, log_finishing_count>
+      (lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, rshift, comp);
+      }
+    }
+
+    //Functor implementation for recursive sorting with only Shift overridden
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Size_type, unsigned log_mean_bin_size,
+              unsigned log_min_split_count, unsigned log_finishing_count>
+    inline void
+    spreadsort_rec(RandomAccessIter first, RandomAccessIter last,
+              std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
+              , size_t *bin_sizes, Right_shift rshift)
+    {
+      RandomAccessIter max, min;
+      if (is_sorted_or_find_extremes(first, last, max, min))
+        return;
+      unsigned log_divisor = get_log_divisor<log_mean_bin_size>(last - first,
+            rough_log_2_size(Size_type(rshift(*max, 0) - rshift(*min, 0))));
+      Div_type div_min = rshift(*min, log_divisor);
+      Div_type div_max = rshift(*max, log_divisor);
+      unsigned bin_count = unsigned(div_max - div_min) + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, bin_count);
+
+      //Calculating the size of each bin
+      for (RandomAccessIter current = first; current != last;)
+        bin_sizes[unsigned(rshift(*(current++), log_divisor) - div_min)]++;
+      bins[0] = first;
+      for (unsigned u = 0; u < bin_count - 1; u++)
+        bins[u + 1] = bins[u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter nextbinstart = first;
+      for (unsigned ii = 0; ii < bin_count - 1; ++ii)
+        swap_loop<RandomAccessIter, Div_type, Right_shift>(bins, nextbinstart,
+                                ii, rshift, bin_sizes, log_divisor, div_min);
+      bins[bin_count - 1] = last;
+
+      //If we've bucketsorted, the array is sorted
+      if (!log_divisor)
+        return;
+
+      //Recursing
+      size_t max_count = get_min_count<log_mean_bin_size, log_min_split_count,
+                          log_finishing_count>(log_divisor);
+      RandomAccessIter lastPos = first;
+      for (unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u],
+          ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        if (count < 2)
+          continue;
+        if (count < max_count)
+          std::sort(lastPos, bin_cache[u]);
+        else
+          spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Size_type,
+          log_mean_bin_size, log_min_split_count, log_finishing_count>(lastPos,
+                      bin_cache[u], bin_cache, cache_end, bin_sizes, rshift);
+      }
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Div_type>
+    //Only use spreadsort if the integer can fit in a size_t
+    inline typename boost::enable_if_c< sizeof(Div_type) <= sizeof(size_t),
+                                                            void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, size_t>(first, last,
+          bin_cache, 0, bin_sizes);
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Div_type>
+    //Only use spreadsort if the integer can fit in a uintmax_t
+    inline typename boost::enable_if_c< (sizeof(Div_type) > sizeof(size_t))
+      && sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, boost::uintmax_t>(first,
+          last, bin_cache, 0, bin_sizes);
+    }
+
+    template <class RandomAccessIter, class Div_type>
+    inline typename boost::disable_if_c< sizeof(Div_type) <= sizeof(size_t)
+      || sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    //defaulting to std::sort when integer_sort won't work
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type)
+    {
+      //Warning that we're using std::sort, even though integer_sort was called
+      BOOST_STATIC_WARNING( sizeof(Div_type) <= sizeof(size_t) );
+      std::sort(first, last);
+    }
+
+
+    //Same for the full functor version
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    //Only use spreadsort if the integer can fit in a size_t
+    inline typename boost::enable_if_c< sizeof(Div_type) <= sizeof(size_t),
+                                 void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift, Compare comp)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+          size_t, int_log_mean_bin_size, int_log_min_split_count, 
+                        int_log_finishing_count>
+          (first, last, bin_cache, 0, bin_sizes, shift, comp);
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    //Only use spreadsort if the integer can fit in a uintmax_t
+    inline typename boost::enable_if_c< (sizeof(Div_type) > sizeof(size_t))
+      && sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift, Compare comp)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
+                        boost::uintmax_t, int_log_mean_bin_size,
+                        int_log_min_split_count, int_log_finishing_count>
+          (first, last, bin_cache, 0, bin_sizes, shift, comp);
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift,
+              class Compare>
+    inline typename boost::disable_if_c< sizeof(Div_type) <= sizeof(size_t)
+      || sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    //defaulting to std::sort when integer_sort won't work
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift, Compare comp)
+    {
+      //Warning that we're using std::sort, even though integer_sort was called
+      BOOST_STATIC_WARNING( sizeof(Div_type) <= sizeof(size_t) );
+      std::sort(first, last, comp);
+    }
+
+
+    //Same for the right shift version
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    //Only use spreadsort if the integer can fit in a size_t
+    inline typename boost::enable_if_c< sizeof(Div_type) <= sizeof(size_t),
+                                 void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, Right_shift, size_t,
+          int_log_mean_bin_size, int_log_min_split_count, 
+                        int_log_finishing_count>
+          (first, last, bin_cache, 0, bin_sizes, shift);
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    //Only use spreadsort if the integer can fit in a uintmax_t
+    inline typename boost::enable_if_c< (sizeof(Div_type) > sizeof(size_t))
+      && sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift)
+    {
+      size_t bin_sizes[1 << max_finishing_splits];
+      std::vector<RandomAccessIter> bin_cache;
+      spreadsort_rec<RandomAccessIter, Div_type, Right_shift,
+                        boost::uintmax_t, int_log_mean_bin_size,
+                        int_log_min_split_count, int_log_finishing_count>
+          (first, last, bin_cache, 0, bin_sizes, shift);
+    }
+
+    template <class RandomAccessIter, class Div_type, class Right_shift>
+    inline typename boost::disable_if_c< sizeof(Div_type) <= sizeof(size_t)
+      || sizeof(Div_type) <= sizeof(boost::uintmax_t), void >::type
+    //defaulting to std::sort when integer_sort won't work
+    integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
+                Right_shift shift)
+    {
+      //Warning that we're using std::sort, even though integer_sort was called
+      BOOST_STATIC_WARNING( sizeof(Div_type) <= sizeof(size_t) );
+      std::sort(first, last);
+    }
+  }
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/spreadsort_common.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,124 @@
+// Contains get_min_count, the core optimization of the spreadsort algorithm.
+// Also has other helper functions commonly useful across variants.
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+*/
+
+#ifndef BOOST_SORT_SPREADSORT_DETAIL_SPREAD_SORT_COMMON_HPP
+#define BOOST_SORT_SPREADSORT_DETAIL_SPREAD_SORT_COMMON_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <limits>
+#include <functional>
+#include <boost/static_assert.hpp>
+#include <boost/serialization/static_warning.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+ namespace detail {
+    //This only works on unsigned data types
+    template <typename T>
+    inline unsigned
+    rough_log_2_size(const T& input)
+    {
+      unsigned result = 0;
+      //The && is necessary on some compilers to avoid infinite loops
+      //it doesn't significantly impair performance
+      while ((input >> result) && (result < (8*sizeof(T)))) ++result;
+      return result;
+    }
+
+    //Gets the minimum size to call spreadsort on to control worst-case runtime.
+    //This is called for a set of bins, instead of bin-by-bin, to minimize
+    //runtime overhead.
+    //This could be replaced by a lookup table of sizeof(Div_type)*8 but this
+    //function is more general.
+    template<unsigned log_mean_bin_size,
+      unsigned log_min_split_count, unsigned log_finishing_count>
+    inline size_t
+    get_min_count(unsigned log_range)
+    {
+      const size_t typed_one = 1;
+      const unsigned min_size = log_mean_bin_size + log_min_split_count;
+      //Assuring that constants have valid settings
+      BOOST_STATIC_ASSERT(log_min_split_count <= max_splits &&
+                          log_min_split_count > 0);
+      BOOST_STATIC_ASSERT(max_splits > 1 &&
+                          max_splits < (8 * sizeof(unsigned)));
+      BOOST_STATIC_ASSERT(max_finishing_splits >= max_splits &&
+                          max_finishing_splits < (8 * sizeof(unsigned)));
+      BOOST_STATIC_ASSERT(log_mean_bin_size >= 0);
+      BOOST_STATIC_ASSERT(log_finishing_count >= 0);
+      //if we can complete in one iteration, do so
+      //This first check allows the compiler to optimize never-executed code out
+      if (log_finishing_count < min_size) {
+        if (log_range <= min_size && log_range <= max_splits) {
+          //Return no smaller than a certain minimum limit
+          if (log_range <= log_finishing_count)
+            return typed_one << log_finishing_count;
+          return typed_one << log_range;
+        }
+      }
+      const unsigned base_iterations = max_splits - log_min_split_count;
+      //sum of n to n + x = ((x + 1) * (n + (n + x)))/2 + log_mean_bin_size
+      const unsigned base_range =
+          ((base_iterations + 1) * (max_splits + log_min_split_count))/2
+          + log_mean_bin_size;
+      //Calculating the required number of iterations, and returning
+      //1 << (iteration_count + min_size)
+      if (log_range < base_range) {
+        unsigned result = log_min_split_count;
+        for (unsigned offset = min_size; offset < log_range;
+          offset += ++result);
+        //Preventing overflow; this situation shouldn't occur
+        if ((result + log_mean_bin_size) >= (8 * sizeof(size_t)))
+          return typed_one << ((8 * sizeof(size_t)) - 1);
+        return typed_one << (result + log_mean_bin_size);
+      }
+      //A quick division can calculate the worst-case runtime for larger ranges
+      unsigned remainder = log_range - base_range;
+      //the max_splits - 1 is used to calculate the ceiling of the division
+      unsigned bit_length = ((((max_splits - 1) + remainder)/max_splits)
+        + base_iterations + min_size);
+      //Preventing overflow; this situation shouldn't occur
+      if (bit_length >= (8 * sizeof(size_t)))
+        return typed_one << ((8 * sizeof(size_t)) - 1);
+      //n(log_range)/max_splits + C, optimizing worst-case performance
+      return typed_one << bit_length;
+    }
+
+    // Resizes the bin cache and bin sizes, and initializes each bin size to 0.
+    // This generates the memory overhead to use in radix sorting.
+    template <class RandomAccessIter>
+    inline RandomAccessIter *
+    size_bins(size_t *bin_sizes, std::vector<RandomAccessIter>
+  &bin_cache, unsigned cache_offset, unsigned &cache_end, unsigned bin_count)
+    {
+      // Clear the bin sizes
+      for (size_t u = 0; u < bin_count; u++)
+        bin_sizes[u] = 0;
+      //Make sure there is space for the bins
+      cache_end = cache_offset + bin_count;
+      if (cache_end > bin_cache.size())
+        bin_cache.resize(cache_end);
+      return &(bin_cache[cache_offset]);
+    }
+  }
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/detail/string_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,819 @@
+// Details for a templated general-case hybrid-radix string_sort.
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+*/
+
+#ifndef BOOST_SORT_SPREADSORT_DETAIL_SPREAD_SORT_HPP
+#define BOOST_SORT_SPREADSORT_DETAIL_SPREAD_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <limits>
+#include <functional>
+#include <boost/static_assert.hpp>
+#include <boost/serialization/static_warning.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/spreadsort_common.hpp>
+#include <boost/cstdint.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+  namespace detail {
+    static const int max_step_size = 64;
+
+    //Offsetting on identical characters.  This function works a chunk of
+    //characters at a time for cache efficiency and optimal worst-case
+    //performance.
+    template<class RandomAccessIter, class Unsigned_char_type>
+    inline void
+    update_offset(RandomAccessIter first, RandomAccessIter finish,
+                  size_t &char_offset)
+    {
+      const int char_size = sizeof(Unsigned_char_type);
+      size_t nextOffset = char_offset;
+      int step_size = max_step_size;
+      while (true) {
+        RandomAccessIter curr = first;
+        do {
+          //Ignore empties, but if the nextOffset would exceed the length or
+          //not match, exit; we've found the last matching character
+          //This will reduce the step_size if the current step doesn't match.
+          if ((*curr).size() > char_offset) {
+            if((*curr).size() <= (nextOffset + step_size)) {
+              step_size = (*curr).size() - nextOffset - 1;
+              if (step_size < 1) {
+                char_offset = nextOffset;
+                return;
+              }
+            }
+            const int step_byte_size = step_size * char_size;
+            if (memcmp(curr->data() + nextOffset, first->data() + nextOffset, 
+                       step_byte_size) != 0) {
+              if (step_size == 1) {
+                char_offset = nextOffset;
+                return;
+              }
+              step_size = (step_size > 4) ? 4 : 1;
+              continue;
+            }
+          }
+          ++curr;
+        } while (curr != finish);
+        nextOffset += step_size;
+      }
+    }
+
+    //Offsetting on identical characters.  This function works a character
+    //at a time for optimal worst-case performance.
+    template<class RandomAccessIter, class Get_char, class Get_length>
+    inline void
+    update_offset(RandomAccessIter first, RandomAccessIter finish,
+                  size_t &char_offset, Get_char getchar, Get_length length)
+    {
+      size_t nextOffset = char_offset;
+      while (true) {
+        RandomAccessIter curr = first;
+        do {
+          //ignore empties, but if the nextOffset would exceed the length or
+          //not match, exit; we've found the last matching character
+          if (length(*curr) > char_offset && (length(*curr) <= (nextOffset + 1)
+            || getchar((*curr), nextOffset) != getchar((*first), nextOffset))) {
+            char_offset = nextOffset;
+            return;
+          }
+        } while (++curr != finish);
+        ++nextOffset;
+      }
+    }
+
+    //This comparison functor assumes strings are identical up to char_offset
+    template<class Data_type, class Unsigned_char_type>
+    struct offset_less_than {
+      offset_less_than(size_t char_offset) : fchar_offset(char_offset){}
+      inline bool operator()(const Data_type &x, const Data_type &y) const
+      {
+        size_t minSize = (std::min)(x.size(), y.size());
+        for (size_t u = fchar_offset; u < minSize; ++u) {
+          BOOST_STATIC_ASSERT(sizeof(x[u]) == sizeof(Unsigned_char_type));
+          if (static_cast<Unsigned_char_type>(x[u]) !=
+              static_cast<Unsigned_char_type>(y[u])) {
+            return static_cast<Unsigned_char_type>(x[u]) < 
+              static_cast<Unsigned_char_type>(y[u]);
+          }
+        }
+        return x.size() < y.size();
+      }
+      size_t fchar_offset;
+    };
+
+    //Compares strings assuming they are identical up to char_offset
+    template<class Data_type, class Unsigned_char_type>
+    struct offset_greater_than {
+      offset_greater_than(size_t char_offset) : fchar_offset(char_offset){}
+      inline bool operator()(const Data_type &x, const Data_type &y) const
+      {
+        size_t minSize = (std::min)(x.size(), y.size());
+        for (size_t u = fchar_offset; u < minSize; ++u) {
+          BOOST_STATIC_ASSERT(sizeof(x[u]) == sizeof(Unsigned_char_type));
+          if (static_cast<Unsigned_char_type>(x[u]) !=
+              static_cast<Unsigned_char_type>(y[u])) {
+            return static_cast<Unsigned_char_type>(x[u]) > 
+              static_cast<Unsigned_char_type>(y[u]);
+          }
+        }
+        return x.size() > y.size();
+      }
+      size_t fchar_offset;
+    };
+
+    //This comparison functor assumes strings are identical up to char_offset
+    template<class Data_type, class Get_char, class Get_length>
+    struct offset_char_less_than {
+      offset_char_less_than(size_t char_offset) : fchar_offset(char_offset){}
+      inline bool operator()(const Data_type &x, const Data_type &y) const
+      {
+        size_t minSize = (std::min)(length(x), length(y));
+        for (size_t u = fchar_offset; u < minSize; ++u) {
+          if (getchar(x, u) != getchar(y, u)) {
+            return getchar(x, u) < getchar(y, u);
+          }
+        }
+        return length(x) < length(y);
+      }
+      size_t fchar_offset;
+      Get_char getchar;
+      Get_length length;
+    };
+
+    //String sorting recursive implementation
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline void
+    string_sort_rec(RandomAccessIter first, RandomAccessIter last,
+                    size_t char_offset,
+                    std::vector<RandomAccessIter> &bin_cache,
+                    unsigned cache_offset, size_t *bin_sizes)
+    {
+      typedef typename std::iterator_traits<RandomAccessIter>::value_type
+        Data_type;
+      //This section makes handling of long identical substrings much faster
+      //with a mild average performance impact.
+      //Iterate to the end of the empties.  If all empty, return
+      while ((*first).size() <= char_offset) {
+        if (++first == last)
+          return;
+      }
+      RandomAccessIter finish = last - 1;
+      //Getting the last non-empty
+      for (;(*finish).size() <= char_offset; --finish);
+      ++finish;
+      //Offsetting on identical characters.  This section works
+      //a few characters at a time for optimal worst-case performance.
+      update_offset<RandomAccessIter, Unsigned_char_type>(first, finish,
+                                                          char_offset);
+      
+      const unsigned bin_count = (1 << (sizeof(Unsigned_char_type)*8));
+      //Equal worst-case of radix and comparison is when bin_count = n*log(n).
+      const unsigned max_size = bin_count;
+      const unsigned membin_count = bin_count + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, membin_count) + 1;
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last; ++current) {
+        if ((*current).size() <= char_offset) {
+          bin_sizes[0]++;
+        }
+        else
+          bin_sizes[static_cast<Unsigned_char_type>((*current)[char_offset])
+                    + 1]++;
+      }
+      //Assign the bin positions
+      bin_cache[cache_offset] = first;
+      for (unsigned u = 0; u < membin_count - 1; u++)
+        bin_cache[cache_offset + u + 1] =
+          bin_cache[cache_offset + u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      //handling empty bins
+      RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
+      next_bin_start +=  bin_sizes[0];
+      RandomAccessIter * target_bin;
+      //Iterating over each element in the bin of empties
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        //empties belong in this bin
+        while ((*current).size() > char_offset) {
+          target_bin =
+            bins + static_cast<Unsigned_char_type>((*current)[char_offset]);
+          iter_swap(current, (*target_bin)++);
+        }
+      }
+      *local_bin = next_bin_start;
+      //iterate backwards to find the last bin with elements in it
+      //this saves iterations in multiple loops
+      unsigned last_bin = bin_count - 1;
+      for (; last_bin && !bin_sizes[last_bin + 1]; --last_bin);
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned u = 0; u < last_bin; ++u) {
+        local_bin = bins + u;
+        next_bin_start += bin_sizes[u + 1];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < next_bin_start;
+            ++current) {
+          //Swapping into place until the correct element has been swapped in
+          for (target_bin = bins + static_cast<Unsigned_char_type>
+              ((*current)[char_offset]);  target_bin != local_bin;
+            target_bin = bins + static_cast<Unsigned_char_type>
+              ((*current)[char_offset])) iter_swap(current, (*target_bin)++);
+        }
+        *local_bin = next_bin_start;
+      }
+      bins[last_bin] = last;
+      //Recursing
+      RandomAccessIter lastPos = bin_cache[cache_offset];
+      //Skip this loop for empties
+      for (unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_size)
+          std::sort(lastPos, bin_cache[u],
+              offset_less_than<Data_type, Unsigned_char_type>(char_offset + 1));
+        else
+          string_sort_rec<RandomAccessIter, Unsigned_char_type>(lastPos,
+              bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes);
+      }
+    }
+
+    //Sorts strings in reverse order, with empties at the end
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline void
+    reverse_string_sort_rec(RandomAccessIter first, RandomAccessIter last,
+                            size_t char_offset,
+                            std::vector<RandomAccessIter> &bin_cache,
+                            unsigned cache_offset,
+                            size_t *bin_sizes)
+    {
+      typedef typename std::iterator_traits<RandomAccessIter>::value_type
+        Data_type;
+      //This section makes handling of long identical substrings much faster
+      //with a mild average performance impact.
+      RandomAccessIter curr = first;
+      //Iterate to the end of the empties.  If all empty, return
+      while ((*curr).size() <= char_offset) {
+        if (++curr == last)
+          return;
+      }
+      //Getting the last non-empty
+      while ((*(--last)).size() <= char_offset);
+      ++last;
+      //Offsetting on identical characters.  This section works
+      //a few characters at a time for optimal worst-case performance.
+      update_offset<RandomAccessIter, Unsigned_char_type>(first, last,
+                                                          char_offset);
+      RandomAccessIter * target_bin;
+
+      const unsigned bin_count = (1 << (sizeof(Unsigned_char_type)*8));
+      //Equal worst-case of radix and comparison when bin_count = n*log(n).
+      const unsigned max_size = bin_count;
+      const unsigned membin_count = bin_count + 1;
+      const unsigned max_bin = bin_count - 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, membin_count);
+      RandomAccessIter * end_bin = &(bin_cache[cache_offset + max_bin]);
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last; ++current) {
+        if ((*current).size() <= char_offset) {
+          bin_sizes[bin_count]++;
+        }
+        else
+          bin_sizes[max_bin - static_cast<Unsigned_char_type>
+            ((*current)[char_offset])]++;
+      }
+      //Assign the bin positions
+      bin_cache[cache_offset] = first;
+      for (unsigned u = 0; u < membin_count - 1; u++)
+        bin_cache[cache_offset + u + 1] =
+          bin_cache[cache_offset + u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = last;
+      //handling empty bins
+      RandomAccessIter * local_bin = &(bin_cache[cache_offset + bin_count]);
+      RandomAccessIter lastFull = *local_bin;
+      //Iterating over each element in the bin of empties
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        //empties belong in this bin
+        while ((*current).size() > char_offset) {
+          target_bin =
+            end_bin - static_cast<Unsigned_char_type>((*current)[char_offset]);
+          iter_swap(current, (*target_bin)++);
+        }
+      }
+      *local_bin = next_bin_start;
+      next_bin_start = first;
+      //iterate backwards to find the last non-empty bin
+      //this saves iterations in multiple loops
+      unsigned last_bin = max_bin;
+      for (; last_bin && !bin_sizes[last_bin]; --last_bin);
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned u = 0; u < last_bin; ++u) {
+        local_bin = bins + u;
+        next_bin_start += bin_sizes[u];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < next_bin_start;
+            ++current) {
+          //Swapping into place until the correct element has been swapped in
+          for (target_bin =
+            end_bin - static_cast<Unsigned_char_type>((*current)[char_offset]);
+            target_bin != local_bin;
+            target_bin =
+            end_bin - static_cast<Unsigned_char_type>((*current)[char_offset]))
+              iter_swap(current, (*target_bin)++);
+        }
+        *local_bin = next_bin_start;
+      }
+      bins[last_bin] = lastFull;
+      //Recursing
+      RandomAccessIter lastPos = first;
+      //Skip this loop for empties
+      for (unsigned u = cache_offset; u <= cache_offset + last_bin;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_size)
+          std::sort(lastPos, bin_cache[u], offset_greater_than<Data_type,
+                    Unsigned_char_type>(char_offset + 1));
+        else
+          reverse_string_sort_rec<RandomAccessIter, Unsigned_char_type>
+    (lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes);
+      }
+    }
+
+    //String sorting recursive implementation
+    template <class RandomAccessIter, class Unsigned_char_type, class Get_char,
+              class Get_length>
+    inline void
+    string_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              size_t char_offset, std::vector<RandomAccessIter> &bin_cache,
+              unsigned cache_offset, size_t *bin_sizes,
+              Get_char getchar, Get_length length)
+    {
+      typedef typename std::iterator_traits<RandomAccessIter>::value_type
+        Data_type;
+      //This section makes handling of long identical substrings much faster
+      //with a mild average performance impact.
+      //Iterate to the end of the empties.  If all empty, return
+      while (length(*first) <= char_offset) {
+        if (++first == last)
+          return;
+      }
+      RandomAccessIter finish = last - 1;
+      //Getting the last non-empty
+      for (;length(*finish) <= char_offset; --finish);
+      ++finish;
+      update_offset(first, finish, char_offset, getchar, length);
+
+      const unsigned bin_count = (1 << (sizeof(Unsigned_char_type)*8));
+      //Equal worst-case of radix and comparison is when bin_count = n*log(n).
+      const unsigned max_size = bin_count;
+      const unsigned membin_count = bin_count + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, membin_count) + 1;
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last; ++current) {
+        if (length(*current) <= char_offset) {
+          bin_sizes[0]++;
+        }
+        else
+          bin_sizes[getchar((*current), char_offset) + 1]++;
+      }
+      //Assign the bin positions
+      bin_cache[cache_offset] = first;
+      for (unsigned u = 0; u < membin_count - 1; u++)
+        bin_cache[cache_offset + u + 1] =
+          bin_cache[cache_offset + u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      //handling empty bins
+      RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
+      next_bin_start +=  bin_sizes[0];
+      RandomAccessIter * target_bin;
+      //Iterating over each element in the bin of empties
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        //empties belong in this bin
+        while (length(*current) > char_offset) {
+          target_bin = bins + getchar((*current), char_offset);
+          iter_swap(current, (*target_bin)++);
+        }
+      }
+      *local_bin = next_bin_start;
+      //iterate backwards to find the last bin with elements in it
+      //this saves iterations in multiple loops
+      unsigned last_bin = bin_count - 1;
+      for (; last_bin && !bin_sizes[last_bin + 1]; --last_bin);
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned ii = 0; ii < last_bin; ++ii) {
+        local_bin = bins + ii;
+        next_bin_start += bin_sizes[ii + 1];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < next_bin_start;
+            ++current) {
+          //Swapping into place until the correct element has been swapped in
+          for (target_bin = bins + getchar((*current), char_offset);
+              target_bin != local_bin;
+              target_bin = bins + getchar((*current), char_offset))
+            iter_swap(current, (*target_bin)++);
+        }
+        *local_bin = next_bin_start;
+      }
+      bins[last_bin] = last;
+
+      //Recursing
+      RandomAccessIter lastPos = bin_cache[cache_offset];
+      //Skip this loop for empties
+      for (unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_size)
+          std::sort(lastPos, bin_cache[u], offset_char_less_than<Data_type,
+                    Get_char, Get_length>(char_offset + 1));
+        else
+          string_sort_rec<RandomAccessIter, Unsigned_char_type, Get_char,
+            Get_length>(lastPos, bin_cache[u], char_offset + 1, bin_cache,
+                        cache_end, bin_sizes, getchar, length);
+      }
+    }
+
+    //String sorting recursive implementation
+    template <class RandomAccessIter, class Unsigned_char_type, class Get_char,
+              class Get_length, class Compare>
+    inline void
+    string_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              size_t char_offset, std::vector<RandomAccessIter> &bin_cache,
+              unsigned cache_offset, size_t *bin_sizes,
+              Get_char getchar, Get_length length, Compare comp)
+    {
+      //This section makes handling of long identical substrings much faster
+      //with a mild average performance impact.
+      //Iterate to the end of the empties.  If all empty, return
+      while (length(*first) <= char_offset) {
+        if (++first == last)
+          return;
+      }
+      RandomAccessIter finish = last - 1;
+      //Getting the last non-empty
+      for (;length(*finish) <= char_offset; --finish);
+      ++finish;
+      update_offset(first, finish, char_offset, getchar, length);
+
+      const unsigned bin_count = (1 << (sizeof(Unsigned_char_type)*8));
+      //Equal worst-case of radix and comparison is when bin_count = n*log(n).
+      const unsigned max_size = bin_count;
+      const unsigned membin_count = bin_count + 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, membin_count) + 1;
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last; ++current) {
+        if (length(*current) <= char_offset) {
+          bin_sizes[0]++;
+        }
+        else
+          bin_sizes[getchar((*current), char_offset) + 1]++;
+      }
+      //Assign the bin positions
+      bin_cache[cache_offset] = first;
+      for (unsigned u = 0; u < membin_count - 1; u++)
+        bin_cache[cache_offset + u + 1] =
+          bin_cache[cache_offset + u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = first;
+      //handling empty bins
+      RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
+      next_bin_start +=  bin_sizes[0];
+      RandomAccessIter * target_bin;
+      //Iterating over each element in the bin of empties
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        //empties belong in this bin
+        while (length(*current) > char_offset) {
+          target_bin = bins + getchar((*current), char_offset);
+          iter_swap(current, (*target_bin)++);
+        }
+      }
+      *local_bin = next_bin_start;
+      //iterate backwards to find the last bin with elements in it
+      //this saves iterations in multiple loops
+      unsigned last_bin = bin_count - 1;
+      for (; last_bin && !bin_sizes[last_bin + 1]; --last_bin);
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned u = 0; u < last_bin; ++u) {
+        local_bin = bins + u;
+        next_bin_start += bin_sizes[u + 1];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < next_bin_start;
+            ++current) {
+          //Swapping into place until the correct element has been swapped in
+          for (target_bin = bins + getchar((*current), char_offset);
+              target_bin != local_bin;
+              target_bin = bins + getchar((*current), char_offset))
+            iter_swap(current, (*target_bin)++);
+        }
+        *local_bin = next_bin_start;
+      }
+      bins[last_bin] = last;
+
+      //Recursing
+      RandomAccessIter lastPos = bin_cache[cache_offset];
+      //Skip this loop for empties
+      for (unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_size)
+          std::sort(lastPos, bin_cache[u], comp);
+        else
+          string_sort_rec<RandomAccessIter, Unsigned_char_type, Get_char,
+                          Get_length, Compare>
+            (lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end,
+             bin_sizes, getchar, length, comp);
+      }
+    }
+
+    //Sorts strings in reverse order, with empties at the end
+    template <class RandomAccessIter, class Unsigned_char_type, class Get_char,
+              class Get_length, class Compare>
+    inline void
+    reverse_string_sort_rec(RandomAccessIter first, RandomAccessIter last,
+              size_t char_offset, std::vector<RandomAccessIter> &bin_cache,
+              unsigned cache_offset, size_t *bin_sizes,
+              Get_char getchar, Get_length length, Compare comp)
+    {
+      //This section makes handling of long identical substrings much faster
+      //with a mild average performance impact.
+      RandomAccessIter curr = first;
+      //Iterate to the end of the empties.  If all empty, return
+      while (length(*curr) <= char_offset) {
+        if (++curr == last)
+          return;
+      }
+      //Getting the last non-empty
+      while (length(*(--last)) <= char_offset);
+      ++last;
+      //Offsetting on identical characters.  This section works
+      //a character at a time for optimal worst-case performance.
+      update_offset(curr, last, char_offset, getchar, length);
+
+      const unsigned bin_count = (1 << (sizeof(Unsigned_char_type)*8));
+      //Equal worst-case of radix and comparison is when bin_count = n*log(n).
+      const unsigned max_size = bin_count;
+      const unsigned membin_count = bin_count + 1;
+      const unsigned max_bin = bin_count - 1;
+      unsigned cache_end;
+      RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset,
+                                          cache_end, membin_count);
+      RandomAccessIter *end_bin = &(bin_cache[cache_offset + max_bin]);
+
+      //Calculating the size of each bin; this takes roughly 10% of runtime
+      for (RandomAccessIter current = first; current != last; ++current) {
+        if (length(*current) <= char_offset) {
+          bin_sizes[bin_count]++;
+        }
+        else
+          bin_sizes[max_bin - getchar((*current), char_offset)]++;
+      }
+      //Assign the bin positions
+      bin_cache[cache_offset] = first;
+      for (unsigned u = 0; u < membin_count - 1; u++)
+        bin_cache[cache_offset + u + 1] =
+          bin_cache[cache_offset + u] + bin_sizes[u];
+
+      //Swap into place
+      RandomAccessIter next_bin_start = last;
+      //handling empty bins
+      RandomAccessIter * local_bin = &(bin_cache[cache_offset + bin_count]);
+      RandomAccessIter lastFull = *local_bin;
+      RandomAccessIter * target_bin;
+      //Iterating over each element in the bin of empties
+      for (RandomAccessIter current = *local_bin; current < next_bin_start;
+          ++current) {
+        //empties belong in this bin
+        while (length(*current) > char_offset) {
+          target_bin = end_bin - getchar((*current), char_offset);
+          iter_swap(current, (*target_bin)++);
+        }
+      }
+      *local_bin = next_bin_start;
+      next_bin_start = first;
+      //iterate backwards to find the last bin with elements in it
+      //this saves iterations in multiple loops
+      unsigned last_bin = max_bin;
+      for (; last_bin && !bin_sizes[last_bin]; --last_bin);
+      //This dominates runtime, mostly in the swap and bin lookups
+      for (unsigned u = 0; u < last_bin; ++u) {
+        local_bin = bins + u;
+        next_bin_start += bin_sizes[u];
+        //Iterating over each element in this bin
+        for (RandomAccessIter current = *local_bin; current < next_bin_start;
+            ++current) {
+          //Swapping into place until the correct element has been swapped in
+          for (target_bin = end_bin - getchar((*current), char_offset);
+              target_bin != local_bin;
+              target_bin = end_bin - getchar((*current), char_offset))
+            iter_swap(current, (*target_bin)++);
+        }
+        *local_bin = next_bin_start;
+      }
+      bins[last_bin] = lastFull;
+      //Recursing
+      RandomAccessIter lastPos = first;
+      //Skip this loop for empties
+      for (unsigned u = cache_offset; u <= cache_offset + last_bin;
+          lastPos = bin_cache[u], ++u) {
+        size_t count = bin_cache[u] - lastPos;
+        //don't sort unless there are at least two items to Compare
+        if (count < 2)
+          continue;
+        //using std::sort if its worst-case is better
+        if (count < max_size)
+          std::sort(lastPos, bin_cache[u], comp);
+        else
+          reverse_string_sort_rec<RandomAccessIter, Unsigned_char_type,
+                                  Get_char, Get_length, Compare>
+            (lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end,
+             bin_sizes, getchar, length, comp);
+      }
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline typename boost::enable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                      >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+                Unsigned_char_type)
+    {
+      size_t bin_sizes[(1 << (8 * sizeof(Unsigned_char_type))) + 1];
+      std::vector<RandomAccessIter> bin_cache;
+      string_sort_rec<RandomAccessIter, Unsigned_char_type>
+        (first, last, 0, bin_cache, 0, bin_sizes);
+    }
+
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline typename boost::disable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                       >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+                Unsigned_char_type)
+    {
+      //Warning that we're using std::sort, even though string_sort was called
+      BOOST_STATIC_WARNING( sizeof(Unsigned_char_type) <= 2 );
+      std::sort(first, last);
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline typename boost::enable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                      >::type
+    reverse_string_sort(RandomAccessIter first, RandomAccessIter last,
+                        Unsigned_char_type)
+    {
+      size_t bin_sizes[(1 << (8 * sizeof(Unsigned_char_type))) + 1];
+      std::vector<RandomAccessIter> bin_cache;
+      reverse_string_sort_rec<RandomAccessIter, Unsigned_char_type>
+        (first, last, 0, bin_cache, 0, bin_sizes);
+    }
+
+    template <class RandomAccessIter, class Unsigned_char_type>
+    inline typename boost::disable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                       >::type
+    reverse_string_sort(RandomAccessIter first, RandomAccessIter last,
+                Unsigned_char_type)
+    {
+      typedef typename std::iterator_traits<RandomAccessIter>::value_type
+        Data_type;
+      //Warning that we're using std::sort, even though string_sort was called
+      BOOST_STATIC_WARNING( sizeof(Unsigned_char_type) <= 2 );
+      std::sort(first, last, std::greater<Data_type>());
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Unsigned_char_type>
+    inline typename boost::enable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                      >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+                Get_char getchar, Get_length length, Unsigned_char_type)
+    {
+      size_t bin_sizes[(1 << (8 * sizeof(Unsigned_char_type))) + 1];
+      std::vector<RandomAccessIter> bin_cache;
+      string_sort_rec<RandomAccessIter, Unsigned_char_type, Get_char,
+        Get_length>(first, last, 0, bin_cache, 0, bin_sizes, getchar, length);
+    }
+
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Unsigned_char_type>
+    inline typename boost::disable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                       >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+                Get_char getchar, Get_length length, Unsigned_char_type)
+    {
+      //Warning that we're using std::sort, even though string_sort was called
+      BOOST_STATIC_WARNING( sizeof(Unsigned_char_type) <= 2 );
+      std::sort(first, last);
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Compare, class Unsigned_char_type>
+    inline typename boost::enable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                      >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+        Get_char getchar, Get_length length, Compare comp, Unsigned_char_type)
+    {
+      size_t bin_sizes[(1 << (8 * sizeof(Unsigned_char_type))) + 1];
+      std::vector<RandomAccessIter> bin_cache;
+      string_sort_rec<RandomAccessIter, Unsigned_char_type, Get_char
+        , Get_length, Compare>
+        (first, last, 0, bin_cache, 0, bin_sizes, getchar, length, comp);
+    }
+
+    //disable_if_c was refusing to compile, so rewrote to use enable_if_c
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Compare, class Unsigned_char_type>
+    inline typename boost::enable_if_c< (sizeof(Unsigned_char_type) > 2), void
+                                        >::type
+    string_sort(RandomAccessIter first, RandomAccessIter last,
+        Get_char getchar, Get_length length, Compare comp, Unsigned_char_type)
+    {
+      //Warning that we're using std::sort, even though string_sort was called
+      BOOST_STATIC_WARNING( sizeof(Unsigned_char_type) <= 2 );
+      std::sort(first, last, comp);
+    }
+
+    //Holds the bin vector and makes the initial recursive call
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Compare, class Unsigned_char_type>
+    inline typename boost::enable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                      >::type
+    reverse_string_sort(RandomAccessIter first, RandomAccessIter last,
+        Get_char getchar, Get_length length, Compare comp, Unsigned_char_type)
+    {
+      size_t bin_sizes[(1 << (8 * sizeof(Unsigned_char_type))) + 1];
+      std::vector<RandomAccessIter> bin_cache;
+      reverse_string_sort_rec<RandomAccessIter, Unsigned_char_type, Get_char,
+                              Get_length, Compare>
+        (first, last, 0, bin_cache, 0, bin_sizes, getchar, length, comp);
+    }
+
+    template <class RandomAccessIter, class Get_char, class Get_length,
+              class Compare, class Unsigned_char_type>
+    inline typename boost::disable_if_c< sizeof(Unsigned_char_type) <= 2, void
+                                                                       >::type
+    reverse_string_sort(RandomAccessIter first, RandomAccessIter last,
+        Get_char getchar, Get_length length, Compare comp, Unsigned_char_type)
+    {
+      //Warning that we're using std::sort, even though string_sort was called
+      BOOST_STATIC_WARNING( sizeof(Unsigned_char_type) <= 2 );
+      std::sort(first, last, comp);
+    }
+  }
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/float_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,134 @@
+//Templated Spreadsort-based implementation of float_sort and float_mem_cast
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort/ for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+float_mem_cast fix provided by:
+Scott McMurray
+*/
+
+#ifndef BOOST_FLOAT_SORT_HPP
+#define BOOST_FLOAT_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <limits>
+#include <boost/static_assert.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/float_sort.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+
+  /*!
+  \brief Casts a float to the specified integer type.
+
+  \tparam Data_type Floating-point IEEE 754/IEC559 type.
+  \tparam Cast_type Integer type (same size) to which to cast.
+
+  \par Example:
+  \code
+  struct rightshift {
+    int operator()(const DATA_TYPE &x, const unsigned offset) const {
+      return float_mem_cast<KEY_TYPE, CAST_TYPE>(x.key) >> offset;
+    }
+  };
+  \endcode
+  */
+  template<class Data_type, class Cast_type>
+  inline Cast_type
+  float_mem_cast(const Data_type & data)
+  {
+    // Only cast IEEE floating-point numbers, and only to a same-sized integer.
+    BOOST_STATIC_ASSERT(sizeof(Cast_type) == sizeof(Data_type));
+    BOOST_STATIC_ASSERT(std::numeric_limits<Data_type>::is_iec559);
+    BOOST_STATIC_ASSERT(std::numeric_limits<Cast_type>::is_integer);
+    Cast_type result;
+    std::memcpy(&result, &data, sizeof(Cast_type));
+    return result;
+  }
+
+
+  /*!
+    \brief @c float_sort with casting to the appropriate size.
+
+    \param[in] first Iterator pointer to first element.
+    \param[in] last Iterator pointing to one beyond the end of data.
+
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_float_sort.htm"> windows_float_sort</a>
+   \n
+   <a href="../../doc/graph/osx_float_sort.htm"> osx_float_sort</a>
+
+
+
+   \par A simple example of sorting some floating-point is:
+   \code
+     vector<float> vec;
+     vec.push_back(1.0);
+     vec.push_back(2.3);
+     vec.push_back(1.3);
+     spreadsort(vec.begin(), vec.end());
+   \endcode
+   \par The sorted vector contains ascending values "1.0 1.3 2.3".
+
+  */
+  template <class RandomAccessIter>
+  inline void float_sort(RandomAccessIter first, RandomAccessIter last)
+  {
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else
+      detail::float_sort(first, last);
+  }
+
+  /*!
+    \brief Floating-point sort algorithm using random access iterators with just right-shift functor.
+
+    \param[in] first Iterator pointer to first element.
+    \param[in] last Iterator pointing to one beyond the end of data.
+    \param[in] rshift Functor that returns the result of shifting the value_type right a specified number of bits.
+
+  */
+  template <class RandomAccessIter, class Right_shift>
+  inline void float_sort(RandomAccessIter first, RandomAccessIter last,
+                         Right_shift rshift)
+  {
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else
+      detail::float_sort(first, last, rshift(*first, 0), rshift);
+  }
+
+
+  /*!
+   \brief Float sort algorithm using random access iterators with both right-shift and user-defined comparison operator.
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] rshift Functor that returns the result of shifting the value_type right a specified number of bits.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+  */
+
+  template <class RandomAccessIter, class Right_shift, class Compare>
+  inline void float_sort(RandomAccessIter first, RandomAccessIter last,
+                         Right_shift rshift, Compare comp)
+  {
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last, comp);
+    else
+      detail::float_sort(first, last, rshift(*first, 0), rshift, comp);
+  }
+}
+}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/integer_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,185 @@
+//Templated Spreadsort-based implementation of integer_sort
+
+//          Copyright Steven J. Ross 2001 - 2014.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort/ for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+
+Doxygen comments by Paul A. Bristow Jan 2015
+
+*/
+
+#ifndef BOOST_INTEGER_SORT_HPP
+#define BOOST_INTEGER_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <limits>
+#include <boost/static_assert.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/integer_sort.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+  //Top-level sorting call for integers.
+
+
+/*! \brief Integer sort algorithm using random access iterators.
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors, or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter>
+  inline void integer_sort(RandomAccessIter first, RandomAccessIter last)
+  {
+    // Don't sort if it's too small to optimize.
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else
+      detail::integer_sort(first, last, *first >> 0);
+  }
+
+/*! \brief Integer sort algorithm using random access iterators with both right-shift and user-defined comparison operator.
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] shift Functor that returns the result of shifting the value_type right a specified number of bits.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+*/
+  template <class RandomAccessIter, class Right_shift, class Compare>
+  inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
+                           Right_shift shift, Compare comp) {
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last, comp);
+    else
+      detail::integer_sort(first, last, shift(*first, 0), shift, comp);
+  }
+
+/*! \brief Integer sort algorithm using random access iterators with just right-shift functor.
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+
+\par Performance:
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+  * <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>\n
+  * <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] shift A functor that returns the result of shifting the value_type right a specified number of bits.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter, class Right_shift>
+  inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
+                           Right_shift shift) {
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else
+      detail::integer_sort(first, last, shift(*first, 0), shift);
+  }
+}
+}
+}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/spreadsort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,121 @@
+// Templated generic hybrid sorting
+
+//          Copyright Steven J. Ross 2001 - 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort/ for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+float_mem_cast fix provided by:
+Scott McMurray
+*/
+
+#ifndef BOOST_SORT_SPREADSORT_HPP
+#define BOOST_SORT_SPREADSORT_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <string>
+#include <limits>
+#include <boost/type_traits.hpp>
+#include <boost/sort/spreadsort/integer_sort.hpp>
+#include <boost/sort/spreadsort/float_sort.hpp>
+#include <boost/sort/spreadsort/string_sort.hpp>
+
+namespace boost {
+namespace sort {
+
+/*! Namespace for spreadsort sort variants for different data types.
+\note Use hyperlinks (coloured) to get detailed information about functions.
+*/
+namespace spreadsort {
+
+  /*!
+    \brief Generic @c spreadsort variant detecting integer-type elements so call to @c integer_sort.
+    \details If the data type provided is an integer, @c integer_sort is used.
+    \note Sorting other data types requires picking between @c integer_sort, @c float_sort and @c string_sort directly,
+    as @c spreadsort won't accept types that don't have the appropriate @c type_traits.
+    \param[in] first Iterator pointer to first element.
+    \param[in] last Iterator pointing to one beyond the end of data.
+
+    \pre [@c first, @c last) is a valid range.
+    \pre @c RandomAccessIter @c value_type is mutable.
+    \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+    \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+    which returns an integer-type right-shifted a specified number of bits.
+    \post The elements in the range [@c first, @c last) are sorted in ascending order.
+  */
+
+  template <class RandomAccessIter>
+  inline typename boost::enable_if_c< std::numeric_limits<
+    typename std::iterator_traits<RandomAccessIter>::value_type >::is_integer,
+    void >::type
+  spreadsort(RandomAccessIter first, RandomAccessIter last)
+  {
+    integer_sort(first, last);
+  }
+
+  /*!
+    \brief Generic @c spreadsort variant detecting float element type so call to @c float_sort.
+    \details If the data type provided is a float or castable-float, @c float_sort is used.
+    \note Sorting other data types requires picking between @c integer_sort, @c float_sort and @c string_sort directly,
+    as @c spreadsort won't accept types that don't have the appropriate @c type_traits.
+
+    \param[in] first Iterator pointer to first element.
+    \param[in] last Iterator pointing to one beyond the end of data.
+
+    \pre [@c first, @c last) is a valid range.
+    \pre @c RandomAccessIter @c value_type is mutable.
+    \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+    \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+    which returns an integer-type right-shifted a specified number of bits.
+    \post The elements in the range [@c first, @c last) are sorted in ascending order.
+  */
+
+  template <class RandomAccessIter>
+  inline typename boost::enable_if_c< !std::numeric_limits<
+    typename std::iterator_traits<RandomAccessIter>::value_type >::is_integer
+    && std::numeric_limits<
+    typename std::iterator_traits<RandomAccessIter>::value_type >::is_iec559,
+    void >::type
+  spreadsort(RandomAccessIter first, RandomAccessIter last)
+  {
+    float_sort(first, last);
+  }
+
+  /*!
+    \brief  Generic @c spreadsort variant detecting string element type so call to @c string_sort for @c std::strings and @c std::wstrings.
+    \details If the data type provided is a string or wstring, @c string_sort is used.
+    \note Sorting other data types requires picking between @c integer_sort, @c float_sort and @c string_sort directly,
+    as @c spreadsort won't accept types that don't have the appropriate @c type_traits.
+
+    \param[in] first Iterator pointer to first element.
+    \param[in] last Iterator pointing to one beyond the end of data.
+
+    \pre [@c first, @c last) is a valid range.
+    \pre @c RandomAccessIter @c value_type is mutable.
+    \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+    \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+    which returns an integer-type right-shifted a specified number of bits.
+    \post The elements in the range [@c first, @c last) are sorted in ascending order.
+  */
+
+  template <class RandomAccessIter>
+  inline typename boost::enable_if_c<
+    is_same<typename std::iterator_traits<RandomAccessIter>::value_type,
+            typename std::string>::value ||
+    is_same<typename std::iterator_traits<RandomAccessIter>::value_type,
+            typename std::wstring>::value, void >::type
+  spreadsort(RandomAccessIter first, RandomAccessIter last)
+  {
+    string_sort(first, last);
+  }
+} // namespace spreadsort
+} // namespace sort
+} // namespace boost
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/sort/spreadsort/string_sort.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,449 @@
+//Templated hybrid string_sort
+
+//          Copyright Steven J. Ross 2001 - 2009.
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/sort/ for library home page.
+
+/*
+Some improvements suggested by:
+Phil Endecott and Frank Gennari
+*/
+
+#ifndef BOOST_STRING_SORT_HPP
+#define BOOST_STRING_SORT_HPP
+#include <algorithm>
+#include <vector>
+#include <cstring>
+#include <limits>
+#include <boost/static_assert.hpp>
+#include <boost/sort/spreadsort/detail/constants.hpp>
+#include <boost/sort/spreadsort/detail/string_sort.hpp>
+
+namespace boost {
+namespace sort {
+namespace spreadsort {
+
+/*! \brief String sort algorithm using random access iterators, allowing character-type overloads.\n
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c string_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+\par
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+<a href="../../doc/graph/windows_string_sort.htm"> windows_string_sort</a>\n
+<a href="../../doc/graph/osx_string_sort.htm"> osx_string_sort</a>
+
+   \tparam RandomAccessIter <a href="http://www.cplusplus.com/reference/iterator/RandomAccessIterator/">Random access iterator</a>
+   \tparam Unsigned_char_type  Unsigned character type used for string.
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] unused value with the same type as the result of the [] operator, defining the Unsigned_char_type.  The actual value is unused.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+
+  template <class RandomAccessIter, class Unsigned_char_type>
+  inline void string_sort(RandomAccessIter first, RandomAccessIter last,
+                          Unsigned_char_type unused)
+  {
+    //Don't sort if it's too small to optimize
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else
+      detail::string_sort(first, last, unused);
+  }
+
+
+/*! \brief String sort algorithm using random access iterators, wraps using default of unsigned char.
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c string_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_string_sort.htm"> windows_string_sort</a>
+   \n
+   <a href="../../doc/graph/osx_string_sort.htm"> osx_string_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter>
+  inline void string_sort(RandomAccessIter first, RandomAccessIter last)
+  {
+    unsigned char unused = '\0';
+    string_sort(first, last, unused);
+  }
+
+
+/*! \brief String sort algorithm using random access iterators, allowing character-type overloads.
+
+  (All variants fall back to @c std::sort if the data size is too small, < detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+
+   \tparam RandomAccessIter <a href="http://www.cplusplus.com/reference/iterator/RandomAccessIterator/">Random access iterator</a>
+   \tparam Comp Functor type to use for comparison.
+   \tparam Unsigned_char_type Unsigned character type used for string.
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+   \param[in] unused value with the same type as the result of the [] operator, defining the Unsigned_char_type.  The actual value is unused.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws  std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+*/
+  template <class RandomAccessIter, class Compare, class Unsigned_char_type>
+  inline void reverse_string_sort(RandomAccessIter first,
+                RandomAccessIter last, Compare comp, Unsigned_char_type unused)
+  {
+    //Don't sort if it's too small to optimize.
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last, comp);
+    else
+      detail::reverse_string_sort(first, last, unused);
+  }
+
+
+/*! \brief String sort algorithm using random access iterators,  wraps using default of @c unsigned char.
+
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws  std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+*/
+  template <class RandomAccessIter, class Compare>
+  inline void reverse_string_sort(RandomAccessIter first,
+                                  RandomAccessIter last, Compare comp)
+  {
+    unsigned char unused = '\0';
+    reverse_string_sort(first, last, comp, unused);
+  }
+
+
+/*! \brief String sort algorithm using random access iterators,  wraps using default of @c unsigned char.
+
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] getchar Bracket functor equivalent to @c operator[], taking a number corresponding to the character offset.
+   \param[in] length Functor to get the length of the string in characters.
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+   which returns an integer-type right-shifted a specified number of bits.
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws  std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter, class Get_char, class Get_length>
+  inline void string_sort(RandomAccessIter first, RandomAccessIter last,
+                          Get_char getchar, Get_length length)
+  {
+    //Don't sort if it's too small to optimize
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last);
+    else {
+      //skipping past empties, which allows us to get the character type
+      //.empty() is not used so as not to require a user declaration of it
+      while (!length(*first)) {
+        if (++first == last)
+          return;
+      }
+      detail::string_sort(first, last, getchar, length, getchar((*first), 0));
+    }
+  }
+
+
+
+/*! \brief String sort algorithm using random access iterators,  wraps using default of @c unsigned char.
+
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] getchar Bracket functor equivalent to @c operator[], taking a number corresponding to the character offset.
+   \param[in] length Functor to get the length of the string in characters.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter, class Get_char, class Get_length,
+            class Compare>
+  inline void string_sort(RandomAccessIter first, RandomAccessIter last,
+                          Get_char getchar, Get_length length, Compare comp)
+  {
+    //Don't sort if it's too small to optimize
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last, comp);
+    else {
+      //skipping past empties, which allows us to get the character type
+      //.empty() is not used so as not to require a user declaration of it
+      while (!length(*first)) {
+        if (++first == last)
+          return;
+      }
+      detail::string_sort(first, last, getchar, length, comp,
+                          getchar((*first), 0));
+    }
+  }
+
+
+/*! \brief Reverse String sort algorithm using random access iterators.
+
+  (All variants fall back to @c std::sort if the data size is too small, < @c detail::min_sort_size).
+
+  \details @c integer_sort is a fast templated in-place hybrid radix/comparison algorithm,
+which in testing tends to be roughly 50% to 2X faster than @c std::sort for large tests (>=100kB).\n
+Worst-case performance is <em>  O(N * (lg(range)/s + s)) </em>,
+so @c integer_sort is asymptotically faster
+than pure comparison-based algorithms. @c s is @c max_splits, which defaults to 11,
+so its worst-case with default settings for 32-bit integers is
+<em> O(N * ((32/11) </em> slow radix-based iterations fast comparison-based iterations).\n\n
+Some performance plots of runtime vs. n and log(range) are provided:\n
+   <a href="../../doc/graph/windows_integer_sort.htm"> windows_integer_sort</a>
+   \n
+   <a href="../../doc/graph/osx_integer_sort.htm"> osx_integer_sort</a>
+
+
+   \param[in] first Iterator pointer to first element.
+   \param[in] last Iterator pointing to one beyond the end of data.
+   \param[in] getchar Bracket functor equivalent to @c operator[], taking a number corresponding to the character offset.
+   \param[in] length Functor to get the length of the string in characters.
+   \param[in] comp A binary functor that returns whether the first element passed to it should go before the second in order.
+
+
+   \pre [@c first, @c last) is a valid range.
+   \pre @c RandomAccessIter @c value_type is mutable.
+   \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+   \post The elements in the range [@c first, @c last) are sorted in ascending order.
+
+   \return @c void.
+
+   \throws std::exception Propagates exceptions if any of the element comparisons, the element swaps (or moves),
+   the right shift, subtraction of right-shifted elements, functors,
+   or any operations on iterators throw.
+
+   \warning Throwing an exception may cause data loss. This will also throw if a small vector resize throws, in which case there will be no data loss.
+   \warning Invalid arguments cause undefined behaviour.
+   \note @c spreadsort function provides a wrapper that calls the fastest sorting algorithm available for a data type,
+   enabling faster generic-programming.
+
+   \remark The lesser of <em> O(N*log(N)) </em> comparisons and <em> O(N*log(K/S + S)) </em>operations worst-case, where:
+   \remark  *  N is @c last - @c first,
+   \remark  *  K is the log of the range in bits (32 for 32-bit integers using their full range),
+   \remark  *  S is a constant called max_splits, defaulting to 11 (except for strings where it is the log of the character size).
+
+*/
+  template <class RandomAccessIter, class Get_char, class Get_length,
+            class Compare>
+  inline void reverse_string_sort(RandomAccessIter first,
+    RandomAccessIter last, Get_char getchar, Get_length length, Compare comp)
+  {
+    //Don't sort if it's too small to optimize
+    if (last - first < detail::min_sort_size)
+      std::sort(first, last, comp);
+    else {
+      //skipping past empties, which allows us to get the character type
+      //.empty() is not used so as not to require a user declaration of it
+      while (!length(*(--last))) {
+        //If there is just one non-empty at the beginning, this is sorted
+        if (first == last)
+          return;
+      }
+      //making last just after the end of the non-empty part of the array
+      detail::reverse_string_sort(first, last + 1, getchar, length, comp,
+                                  getchar((*last), 0));
+    }
+  }
+}
+}
+}
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_SPIRIT_PHOENIX_APRIL_11_2008_0850AM)
-#define BOOST_SPIRIT_PHOENIX_APRIL_11_2008_0850AM
-
-#include <boost/spirit/home/phoenix/algorithm.hpp>
-#include <boost/spirit/home/phoenix/bind.hpp>
-#include <boost/spirit/home/phoenix/container.hpp>
-#include <boost/spirit/home/phoenix/core.hpp>
-#include <boost/spirit/home/phoenix/function.hpp>
-#include <boost/spirit/home/phoenix/fusion.hpp>
-#include <boost/spirit/home/phoenix/object.hpp>
-#include <boost/spirit/home/phoenix/operator.hpp>
-#include <boost/spirit/home/phoenix/scope.hpp>
-#include <boost/spirit/home/phoenix/statement.hpp>
-#include <boost/spirit/home/phoenix/stl.hpp>
-#include <boost/spirit/home/phoenix/version.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/algorithm.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_ALGORITHM_HPP
-#define PHOENIX_ALGORITHM_HPP
-
-#include <boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_BIND_HPP
-#define PHOENIX_BIND_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/bind/bind_function.hpp>
-#include <boost/spirit/home/phoenix/bind/bind_function_object.hpp>
-#include <boost/spirit/home/phoenix/bind/bind_member_function.hpp>
-#include <boost/spirit/home/phoenix/bind/bind_member_variable.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_BIND_BIND_FUNCTION_HPP
-#define PHOENIX_BIND_BIND_FUNCTION_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
-#include <boost/spirit/home/phoenix/bind/detail/function_ptr.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename RT>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<0>
-          , detail::function_ptr<0, RT, RT(*)()>
-        >::type>
-    bind(RT(*f)())
-    {
-        typedef detail::function_ptr<0, RT, RT(*)()> fp_type;
-        return compose<detail::function_eval<0> >(fp_type(f));
-    }
-
-    template <typename RT, typename T0, typename A0>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::function_ptr<1, RT, RT(*)(T0)>
-          , A0
-        >::type>
-    bind(RT(*f)(T0), A0 const& _0)
-    {
-        typedef detail::function_ptr<1, RT, RT(*)(T0)> fp_type;
-        return compose<detail::function_eval<1> >(fp_type(f), _0);
-    }
-
-    template <typename RT, typename T0, typename T1, typename A0, typename A1>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<2>
-          , detail::function_ptr<2, RT, RT(*)(T0, T1)>
-          , A0, A1
-        >::type>
-    bind(RT(*f)(T0, T1), A0 const& _0, A1 const& _1)
-    {
-        typedef detail::function_ptr<2, RT, RT(*)(T0, T1)> fp_type;
-        return compose<detail::function_eval<2> >(fp_type(f), _0, _1);
-    }
-
-    //  Bring in the rest of the function binders
-    #include <boost/spirit/home/phoenix/bind/detail/bind_function.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_function_object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_BIND_BIND_FUNCTION_OBJECT_HPP
-#define PHOENIX_BIND_BIND_FUNCTION_OBJECT_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename F>
-    inline actor<typename as_composite<detail::function_eval<0>, F>::type>
-    bind(F const& f)
-    {
-        return compose<detail::function_eval<0> >(f);
-    }
-
-    template <typename F, typename A0>
-    inline actor<typename as_composite<detail::function_eval<1>, F, A0>::type>
-    bind(F const& f, A0 const& _0)
-    {
-        return compose<detail::function_eval<1> >(f, _0);
-    }
-
-    template <typename F, typename A0, typename A1>
-    inline actor<typename as_composite<detail::function_eval<2>, F, A0, A1>::type>
-    bind(F const& f, A0 const& _0, A1 const& _1)
-    {
-        return compose<detail::function_eval<2> >(f, _0, _1);
-    }
-
-    //  Bring in the rest of the function object binders
-    #include <boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_member_function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_BIND_BIND_MEMBER_FUNCTION_HPP
-#define PHOENIX_BIND_BIND_MEMBER_FUNCTION_HPP
-
-#include <boost/spirit/home/phoenix/core/reference.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
-#include <boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename RT, typename ClassT, typename ClassA>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_function_ptr<0, RT, RT(ClassT::*)()>
-          , ClassA
-        >::type>
-    bind(RT(ClassT::*f)(), ClassA const& obj)
-    {
-        typedef detail::member_function_ptr<0, RT, RT(ClassT::*)()> fp_type;
-        return compose<detail::function_eval<1> >(fp_type(f), obj);
-    }
-
-    template <typename RT, typename ClassT, typename ClassA>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_function_ptr<0, RT, RT(ClassT::*)() const>
-          , ClassA
-        >::type>
-    bind(RT(ClassT::*f)() const, ClassA const& obj)
-    {
-        typedef detail::member_function_ptr<0, RT, RT(ClassT::*)() const> fp_type;
-        return compose<detail::function_eval<1> >(fp_type(f), obj);
-    }
-
-    template <typename RT, typename ClassT>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_function_ptr<0, RT, RT(ClassT::*)()>
-          , actor<reference<ClassT> >
-        >::type>
-    bind(RT(ClassT::*f)(), ClassT& obj)
-    {
-        typedef detail::member_function_ptr<0, RT, RT(ClassT::*)()> fp_type;
-        return compose<detail::function_eval<1> >(
-            fp_type(f)
-          , actor<reference<ClassT> >(reference<ClassT>(obj)));
-    }
-
-    template <typename RT, typename ClassT>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_function_ptr<0, RT, RT(ClassT::*)() const>
-          , actor<reference<ClassT> >
-        >::type>
-    bind(RT(ClassT::*f)() const, ClassT& obj)
-    {
-        typedef detail::member_function_ptr<0, RT, RT(ClassT::*)() const> fp_type;
-        return compose<detail::function_eval<1> >(
-            fp_type(f)
-          , actor<reference<ClassT> >(reference<ClassT>(obj)));
-    }
-
-    //  Bring in the rest of the function binders
-    #include <boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/bind_member_variable.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
-#define PHOENIX_BIND_BIND_MEMBER_VARIABLE_HPP
-
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/remove_pointer.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/reference.hpp>
-#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/remove_pointer.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <typename RT, typename MP>
-        struct member_variable
-        {
-            template <typename Class>
-            struct result
-            {
-                typedef typename boost::mpl::if_<
-                    boost::is_const<
-                        typename boost::remove_pointer<
-                            typename boost::remove_reference<Class>::type
-                        >::type
-                    >
-                  , const RT&
-                  , RT&
-                >::type type;
-            };
-
-            member_variable(MP mp)
-                : mp(mp) {}
-
-            template <typename Class>
-            RT& operator()(Class& obj) const
-            {
-                return obj.*mp;
-            }
-
-            template <typename Class>
-            RT& operator()(Class* obj) const
-            {
-                return obj->*mp;
-            }
-
-            template <typename Class>
-            RT const& operator()(Class const& obj) const
-            {
-                return obj.*mp;
-            }
-
-            template <typename Class>
-            RT const& operator()(Class const* obj) const
-            {
-                return obj->*mp;
-            }
-
-            MP mp;
-        };
-    }
-
-    template <typename RT, typename ClassT, typename ClassA>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_variable<RT, RT ClassT::*>
-          , ClassA
-        >::type>
-    bind(RT ClassT::*mp, ClassA const& obj)
-    {
-        typedef detail::member_variable<RT, RT ClassT::*> mp_type;
-        return compose<detail::function_eval<1> >(mp_type(mp), obj);
-    }
-
-    template <typename RT, typename ClassT>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<1>
-          , detail::member_variable<RT, RT ClassT::*>
-          , actor<reference<ClassT> >
-        >::type>
-    bind(RT ClassT::*mp, ClassT& obj)
-    {
-        typedef detail::member_variable<RT, RT ClassT::*> mp_type;
-        return compose<detail::function_eval<1> >(
-            mp_type(mp)
-          , actor<reference<ClassT> >(reference<ClassT>(obj)));
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_BIND_DETAIL_BIND_FUNCTION_HPP)
-#define PHOENIX_BIND_DETAIL_BIND_FUNCTION_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT),                              \
-    "boost/spirit/home/phoenix/bind/detail/bind_function.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename RT
-      , BOOST_PP_ENUM_PARAMS(N, typename T)
-      , BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<N>
-          , detail::function_ptr<N, RT, RT(*)(BOOST_PP_ENUM_PARAMS(N, T))>
-          , BOOST_PP_ENUM_PARAMS(N, A)
-        >::type>
-    bind(RT(*f)(BOOST_PP_ENUM_PARAMS(N, T))
-      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        typedef detail::function_ptr<
-            N, RT, RT(*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
-        return compose<detail::function_eval<N> >(
-            fp_type(f), BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_BIND_DETAIL_BIND_FUNCTION_OBJECT_HPP)
-#define PHOENIX_BIND_DETAIL_BIND_FUNCTION_OBJECT_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT),                              \
-    "boost/spirit/home/phoenix/bind/detail/bind_function_object.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename F, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<typename as_composite<detail::function_eval<N>, F
-      , BOOST_PP_ENUM_PARAMS(N, A)>::type>
-    bind(F const& f, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        return compose<detail::function_eval<N> >(f, BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_BIND_DETAIL_BIND_MEMBER_FUNCTION_HPP)
-#define PHOENIX_BIND_DETAIL_BIND_MEMBER_FUNCTION_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/inc.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)),                \
-    "boost/spirit/home/phoenix/bind/detail/bind_member_function.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename RT
-      , typename ClassT
-      , BOOST_PP_ENUM_PARAMS(N, typename T)
-      , typename ClassA
-      , BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<BOOST_PP_INC(N)>
-          , detail::member_function_ptr<N,
-                RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))>
-          , ClassA, BOOST_PP_ENUM_PARAMS(N, A)
-        >::type>
-    bind(
-        RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T))
-      , ClassA const& obj
-      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        typedef detail::member_function_ptr<
-            N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
-        return compose<detail::function_eval<BOOST_PP_INC(N)> >(
-            fp_type(f), obj, BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-    template <typename RT
-      , typename ClassT
-      , BOOST_PP_ENUM_PARAMS(N, typename T)
-      , typename ClassA
-      , BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<BOOST_PP_INC(N)>
-          , detail::member_function_ptr<N,
-                RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const>
-          , ClassA, BOOST_PP_ENUM_PARAMS(N, A)
-        >::type>
-    bind(
-        RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T)) const
-      , ClassA const& obj
-      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        typedef detail::member_function_ptr<
-            N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const> fp_type;
-        return compose<detail::function_eval<BOOST_PP_INC(N)> >(
-            fp_type(f), obj, BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-    template <typename RT
-      , typename ClassT
-      , BOOST_PP_ENUM_PARAMS(N, typename T)
-      , BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<BOOST_PP_INC(N)>
-          , detail::member_function_ptr<N,
-                RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))>
-          , actor<reference<ClassT> >
-          , BOOST_PP_ENUM_PARAMS(N, A)
-        >::type>
-    bind(
-        RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T))
-      , ClassT& obj
-      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        typedef detail::member_function_ptr<
-            N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T))> fp_type;
-        return compose<detail::function_eval<BOOST_PP_INC(N)> >(
-            fp_type(f)
-          , actor<reference<ClassT> >(reference<ClassT>(obj))
-          , BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-    template <typename RT
-      , typename ClassT
-      , BOOST_PP_ENUM_PARAMS(N, typename T)
-      , BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<
-        typename as_composite<
-            detail::function_eval<BOOST_PP_INC(N)>
-          , detail::member_function_ptr<N,
-                RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const>
-          , actor<reference<ClassT> >
-          , BOOST_PP_ENUM_PARAMS(N, A)
-        >::type>
-    bind(
-        RT(ClassT::*f)(BOOST_PP_ENUM_PARAMS(N, T)) const
-      , ClassT& obj
-      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        typedef detail::member_function_ptr<
-            N, RT, RT(ClassT::*)(BOOST_PP_ENUM_PARAMS(N, T)) const> fp_type;
-        return compose<detail::function_eval<BOOST_PP_INC(N)> >(
-            fp_type(f)
-          , actor<reference<ClassT> >(reference<ClassT>(obj))
-          , BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/function_ptr.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP)
-#define PHOENIX_BIND_DETAIL_FUNCTION_PTR_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/dec.hpp>
-
-namespace boost { namespace phoenix { namespace detail
-{
-    template <int N>
-    struct function_ptr_impl
-    {
-        template <typename RT, typename FP>
-        struct impl;
-    };
-
-    template <int N, typename RT, typename FP>
-    struct function_ptr : function_ptr_impl<N>::template impl<RT, FP>
-    {
-        typedef typename function_ptr_impl<N>::template impl<RT, FP> base;
-        function_ptr(FP fp)
-            : base(fp) {}
-    };
-
-    template <>
-    struct function_ptr_impl<0>
-    {
-        template <typename RT, typename FP>
-        struct impl
-        {
-            typedef RT result_type;
-
-            impl(FP fp)
-                : fp(fp) {}
-
-            RT operator()() const
-            {
-                return fp();
-            }
-
-            FP fp;
-        };
-    };
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (1, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/bind/detail/function_ptr.hpp"))
-#include BOOST_PP_ITERATE()
-
-}}} // namespace boost::phoenix::detail
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <>
-    struct function_ptr_impl<N>
-    {
-        template <typename RT, typename FP>
-        struct impl
-        {
-            template <BOOST_PP_ENUM_PARAMS(N, typename T)>
-            struct result
-            {
-                typedef RT type;
-            };
-
-            impl(FP fp)
-                : fp(fp) {}
-
-            template <BOOST_PP_ENUM_PARAMS(N, typename A)>
-            RT operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
-            {
-                return fp(BOOST_PP_ENUM_PARAMS(N, _));
-            }
-
-            FP fp;
-        };
-    };
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_BIND_DETAIL_MEMBER_FUNCTION_PTR_HPP)
-#define PHOENIX_BIND_DETAIL_MEMBER_FUNCTION_PTR_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/utility/addressof.hpp>
-
-namespace boost { namespace phoenix { namespace detail
-{
-    template <int N>
-    struct member_function_ptr_impl
-    {
-        template <typename RT, typename FP>
-        struct impl;
-    };
-
-    template <int N, typename RT, typename FP>
-    struct member_function_ptr
-        : member_function_ptr_impl<N>::template impl<RT, FP>
-    {
-        typedef typename member_function_ptr_impl<N>::
-            template impl<RT, FP> base;
-        member_function_ptr(FP fp)
-            : base(fp) {}
-    };
-
-    template <>
-    struct member_function_ptr_impl<0>
-    {
-        template <typename RT, typename FP>
-        struct impl
-        {
-            template <typename Class>
-            struct result
-            {
-                typedef RT type;
-            };
-
-            impl(FP fp)
-                : fp(fp) {}
-
-            template <typename Class>
-            RT operator()(Class& obj) const
-            {
-                return (obj.*fp)();
-            }
-
-            template <typename Class>
-            RT operator()(Class* obj) const
-            {
-                return (obj->*fp)();
-            }
-
-            FP fp;
-        };
-    };
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (1, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/bind/detail/member_function_ptr.hpp"))
-#include BOOST_PP_ITERATE()
-
-}}} // namespace boost::phoenix::detail
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <>
-    struct member_function_ptr_impl<N>
-    {
-        template <typename RT, typename FP>
-        struct impl
-        {
-            template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename T)>
-            struct result
-            {
-                typedef RT type;
-            };
-
-            impl(FP fp)
-                : fp(fp) {}
-
-            template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename A)>
-            RT operator()(Class& obj, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
-            {
-                return (obj.*fp)(BOOST_PP_ENUM_PARAMS(N, _));
-            }
-
-            template <typename Class, BOOST_PP_ENUM_PARAMS(N, typename A)>
-            RT operator()(Class* obj, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _)) const
-            {
-                return (obj->*fp)(BOOST_PP_ENUM_PARAMS(N, _));
-            }
-
-            FP fp;
-        };
-    };
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/container.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CONTAINER_HPP
-#define PHOENIX_CONTAINER_HPP
-
-#include <boost/spirit/home/phoenix/stl/container/container.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_HPP
-#define PHOENIX_CORE_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/core/basic_environment.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/as_actor.hpp>
-#include <boost/spirit/home/phoenix/core/is_actor.hpp>
-#include <boost/spirit/home/phoenix/core/argument.hpp>
-#include <boost/spirit/home/phoenix/core/value.hpp>
-#include <boost/spirit/home/phoenix/core/reference.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/nothing.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/actor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,194 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_ACTOR_HPP
-#define PHOENIX_CORE_ACTOR_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-
-#if !defined(BOOST_RESULT_OF_NUM_ARGS)
-# define BOOST_RESULT_OF_NUM_ARGS PHOENIX_ACTOR_LIMIT
-#elif (BOOST_RESULT_OF_NUM_ARGS < PHOENIX_ACTOR_LIMIT)
-# error "BOOST_RESULT_OF_NUM_ARGS < PHOENIX_ACTOR_LIMIT"
-#endif
-
-#include <boost/spirit/home/phoenix/core/basic_environment.hpp>
-#include <boost/mpl/min.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/add_const.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/utility/result_of.hpp>
-
-namespace boost { namespace phoenix
-{
-    // phoenix::void_ is the same as fusion::void_
-    typedef fusion::void_ void_;
-
-    namespace detail
-    {
-        //  Forward declarations. These will come in when we get to the
-        //  operator module, yet, the actor's assignment operator and index
-        //  operator are required to be members.
-
-        template <typename T0, typename T1>
-        struct make_assign_composite;
-
-        template <typename T0, typename T1>
-        struct make_index_composite;
-
-        template <typename BaseT0, typename BaseT1>
-        struct comma_result;
-
-        // error no arguments supplied
-        struct error_expecting_arguments
-        {
-            template <typename T>
-            error_expecting_arguments(T const&) {}
-        };
-    }
-
-    template <typename Eval, typename Env>
-    struct eval_result
-    {
-        typedef typename Eval::template result<Env>::type type;
-    };
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable: 4522) // multiple assignment operators specified warning
-#endif
-
-    template <typename Eval>
-    struct actor : Eval
-    {
-        typedef actor<Eval> self_type;
-        typedef Eval eval_type;
-
-        template <class Sig> struct result {};
-
-        actor()
-            : Eval() {}
-
-        actor(Eval const& base)
-            : Eval(base) {}
-
-        template <typename T0>
-        explicit actor(T0 const& _0)
-            : Eval(_0) {}
-
-        template <typename T0, typename T1>
-        actor(T0 const& _0, T1 const& _1)
-            : Eval(_0, _1) {}
-
-        typedef typename
-            mpl::eval_if<
-                typename Eval::no_nullary // avoid calling eval_result when this is true
-              , mpl::identity<detail::error_expecting_arguments>
-              , eval_result<eval_type, basic_environment<> >
-            >::type
-        nullary_result;
-
-        actor& operator=(actor const& rhs)
-        {
-            Eval::operator=(rhs);
-            return *this;
-        }
-
-        actor& operator=(actor& rhs)
-        {
-            Eval::operator=(rhs);
-            return *this;
-        }
-
-        nullary_result
-        operator()() const
-        {
-            return eval_type::eval(basic_environment<>());
-        }
-
-        template <class F, class A0>
-        struct result<F(A0)>
-          : eval_result<
-                eval_type
-              , basic_environment<
-                    typename remove_reference<A0>::type
-                >
-            >
-        {};
-
-        template <typename T0>
-        typename result<actor(T0&)>::type
-        operator()(T0& _0) const
-        {
-            return eval_type::eval(basic_environment<T0>(_0));
-        }
-
-        template <class F, class A0, class A1>
-        struct result<F(A0,A1)>
-          : eval_result<
-                eval_type
-              , basic_environment<
-                    typename remove_reference<A0>::type
-                  , typename remove_reference<A1>::type
-                >
-            >
-        {};
-
-        template <typename T0, typename T1>
-        typename result<actor(T0&,T1&)>::type
-        operator()(T0& _0, T1& _1) const
-        {
-            return eval_type::eval(basic_environment<T0, T1>(_0, _1));
-        }
-
-        template <typename T1>
-        typename detail::make_assign_composite<self_type, T1>::type
-        operator=(T1 const& a1) const;
-
-        template <typename T1>
-        typename detail::make_index_composite<self_type, T1>::type
-        operator[](T1 const& a1) const;
-
-        //  Bring in the rest of the constructors and function call operators
-        #include <boost/spirit/home/phoenix/core/detail/actor.hpp>
-    };
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-    //  Forward declaration: The intent to overload the comma must be
-    //  stated early on to avoid the subtle problem that arises when
-    //  the header file where the comma operator overload is defined,
-    //  is not included by the client and the client attempts to use
-    //  the comma anyway.
-
-    namespace detail
-    {
-        template <typename BaseT0, typename BaseT1>
-        struct comma_result;
-    }
-
-    template <typename BaseT0, typename BaseT1>
-    typename detail::comma_result<BaseT0, BaseT1>::type
-    operator,(actor<BaseT0> const& a0, actor<BaseT1> const& a1);
-}}
-
-namespace boost
-{
-    template <typename Eval>
-    struct result_of<phoenix::actor<Eval>()>
-    {
-        typedef typename phoenix::actor<Eval>::nullary_result type;
-    };
-
-    template <typename Eval>
-    struct result_of<phoenix::actor<Eval> const()>
-        : result_of<phoenix::actor<Eval>()>
-    {};
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/argument.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_ARGUMENT_HPP
-#define PHOENIX_CORE_ARGUMENT_HPP
-
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
-#include <boost/preprocessor/inc.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/fusion/include/at.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/less.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/size.hpp>
-#include <boost/type_traits/add_reference.hpp>
-
-#define PHOENIX_DECLARE_ARG(z, n, data)                                       \
-    typedef actor<argument<n> >                                               \
-        BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)), _type);              \
-    actor<argument<n> > const                                                 \
-        BOOST_PP_CAT(arg, BOOST_PP_INC(n)) = argument<n>();                   \
-    typedef actor<argument<n> >                                               \
-        BOOST_PP_CAT(BOOST_PP_CAT(_, BOOST_PP_INC(n)), _type);                \
-    actor<argument<n> > const                                                 \
-        BOOST_PP_CAT(_, BOOST_PP_INC(n)) = argument<n>();
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <typename Arg>
-        struct error_argument_not_found {};
-        inline void test_invalid_argument(int) {}
-    }
-
-    template <int N>
-    struct argument
-    {
-        typedef mpl::true_ no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef typename
-                fusion::result_of::at<typename Env::tie_type, mpl::int_<N> >::type
-            type;
-        };
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            typedef typename
-                mpl::if_<
-                    mpl::less<mpl::int_<N>, mpl::size<typename Env::args_type> >
-                  , int
-                  , detail::error_argument_not_found<argument<N> >
-                >::type
-            check_out_of_bounds;
-
-            detail::test_invalid_argument(check_out_of_bounds());
-            return fusion::at_c<N>(env.args());
-        }
-    };
-
-    namespace arg_names
-    {
-    //  Phoenix style names
-        typedef actor<argument<0> > arg1_type;
-        actor<argument<0> > const arg1 = argument<0>();
-        typedef actor<argument<1> > arg2_type;
-        actor<argument<1> > const arg2 = argument<1>();
-        typedef actor<argument<2> > arg3_type;
-        actor<argument<2> > const arg3 = argument<2>();
-
-    //  BLL style names
-        typedef actor<argument<0> > _1_type;
-        actor<argument<0> > const _1 = argument<0>();
-        typedef actor<argument<1> > _2_type;
-        actor<argument<1> > const _2 = argument<1>();
-        typedef actor<argument<2> > _3_type;
-        actor<argument<2> > const _3 = argument<2>();
-
-    //  Bring in the rest or the Phoenix style arguments (arg4 .. argN+1)
-    //  and BLL style arguments (_4 .. _N+1), using PP
-        BOOST_PP_REPEAT_FROM_TO(
-            3, PHOENIX_ARG_LIMIT, PHOENIX_DECLARE_ARG, _)
-    }
-}}
-
-#undef PHOENIX_DECLARE_ARG
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/as_actor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_AS_ACTOR_HPP
-#define PHOENIX_CORE_AS_ACTOR_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename T>
-    struct as_actor_base; // defined in value.hpp
-
-    template <typename Base>
-    struct as_actor_base<actor<Base> >
-    {
-        typedef Base type;
-
-        static Base const&
-        convert(actor<Base> const& x)
-        {
-            return x;
-        }
-    };
-
-    template <>
-    struct as_actor_base<fusion::void_>
-    {
-        typedef fusion::void_ type;
-        struct error_attempting_to_convert_void_type_to_an_actor {};
-
-        static void
-        convert(error_attempting_to_convert_void_type_to_an_actor);
-    };
-
-    template <>
-    struct as_actor_base<void>
-    {
-        typedef void type;
-        struct error_attempting_to_convert_void_type_to_an_actor {};
-
-        static void
-        convert(error_attempting_to_convert_void_type_to_an_actor);
-    };
-
-    template <typename T>
-    struct as_actor
-    {
-        typedef actor<typename as_actor_base<T>::type> type;
-
-        static type
-        convert(T const& x)
-        {
-            return as_actor_base<T>::convert(x);
-        }
-    };
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/basic_environment.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_BASIC_ENVIRONMENT_HPP
-#define PHOENIX_CORE_BASIC_ENVIRONMENT_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/mpl/remove.hpp>
-#include <boost/mpl/transform.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/fusion/include/as_vector.hpp>
-#include <boost/fusion/include/mpl.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <
-        BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-            PHOENIX_ARG_LIMIT, typename T, fusion::void_)>
-    class basic_environment
-    {
-        typedef
-            mpl::BOOST_PP_CAT(vector, PHOENIX_ARG_LIMIT)<
-                BOOST_PP_ENUM_PARAMS(PHOENIX_ARG_LIMIT, T)>
-        args_with_void_type;
-
-    public:
-
-        // args_type: the list of types in an mpl::sequence
-        typedef typename 
-            mpl::remove<args_with_void_type, fusion::void_>::type 
-        args_type;
-        
-        // tie_type: a fusion::tuple of references
-        typedef typename
-            fusion::result_of::as_vector<
-                typename mpl::transform<
-                    args_type, boost::add_reference<mpl::_1> 
-                >::type
-            >::type
-        tie_type;
-
-        basic_environment()
-            : args_() {}
-
-        template <typename U0>
-        explicit basic_environment(U0& _0)
-            : args_(_0) {}
-
-        template <typename U0, typename U1>
-        basic_environment(U0& _0, U1& _1)
-            : args_(_0, _1) {}
-
-        //  Bring in the rest of the constructors
-        #include <boost/spirit/home/phoenix/core/detail/basic_environment.hpp>
-
-        tie_type const& 
-        args() const
-        {
-            return args_;
-        }
-
-        tie_type& 
-        args()
-        {
-            return args_;
-        }
-
-    private:
-
-        tie_type args_;
-    };
-}}
-
-#endif
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/compose.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_COMPOSE_HPP
-#define PHOENIX_CORE_COMPOSE_HPP
-
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/value.hpp>
-#include <boost/spirit/home/phoenix/core/as_actor.hpp>
-
-#define PHOENIX_AS_ACTOR(z, n, data)                                            \
-    typename mpl::eval_if<                                                      \
-        is_same<BOOST_PP_CAT(T, n), fusion::void_>                              \
-      , mpl::identity<fusion::void_>                                            \
-      , as_actor_base<BOOST_PP_CAT(T, n)>                                       \
-    >::type
-
-namespace boost { namespace phoenix
-{
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  as_composite<EvalPolicy, T0,... TN> metafunction
-//
-//      Create a composite given an EvalPolicy and types T0..TN.
-//      The types are converted to an actor through the as_actor
-//      metafunction (see as_actor.hpp).
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <
-        typename EvalPolicy
-      , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-            PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
-    struct as_composite
-    {
-        typedef composite<
-            EvalPolicy
-          , fusion::vector<
-                BOOST_PP_ENUM(PHOENIX_COMPOSITE_LIMIT, PHOENIX_AS_ACTOR, _)>
-        >
-        type;
-    };
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  compose functions
-//
-//      Usage:
-//
-//          compose<EvalPolicy>(_0, _1,... _N)
-//
-//      Returns a composite given an EvalPolicy and arguments _0.._N. 
-//      The arguments are converted to an actor through the as_actor
-//      metafunction (see as_actor.hpp).
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <typename EvalPolicy>
-    inline actor<typename as_composite<EvalPolicy>::type>
-    compose()
-    {
-        return actor<typename as_composite<EvalPolicy>::type>();
-    }
-
-    template <typename EvalPolicy, typename T0>
-    inline actor<typename as_composite<EvalPolicy, T0>::type>
-    compose(T0 const& _0)
-    {
-        return actor<typename as_composite<EvalPolicy, T0>::type>(
-            as_actor<T0>::convert(_0)
-        );
-    }
-
-    template <typename EvalPolicy, typename T0, typename T1>
-    inline actor<typename as_composite<EvalPolicy, T0, T1>::type>
-    compose(T0 const& _0, T1 const& _1)
-    {
-        return actor<typename as_composite<EvalPolicy, T0, T1>::type>(
-            as_actor<T0>::convert(_0)
-          , as_actor<T1>::convert(_1)
-        );
-    }
-
-    //  Bring in the the rest of the compose overloads
-    #include <boost/spirit/home/phoenix/core/detail/compose.hpp>
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  re_curry<EvalPolicy, T0,...TN>
-//
-//      returns the result of re currying T0..TN using EvalPolicy.
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <
-        typename EvalPolicy
-      , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-            PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
-    struct re_curry
-    {
-        typedef actor<
-            typename as_composite<
-                EvalPolicy
-              , BOOST_PP_ENUM_PARAMS(PHOENIX_COMPOSITE_LIMIT, T)>::type
-            >
-        type;
-    };
-}}
-
-#undef PHOENIX_AS_ACTOR
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/composite.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_COMPOSITE_HPP
-#define PHOENIX_CORE_COMPOSITE_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/is_actor.hpp>
-#include <boost/fusion/include/vector.hpp>
-#include <boost/fusion/include/at.hpp>
-#include <boost/fusion/include/size.hpp>
-#include <boost/fusion/include/mpl.hpp>
-#include <boost/mpl/fold.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/or.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <int N>
-        struct composite_eval;
-        
-        struct compute_no_nullary
-        {
-            template <typename State, typename T>
-            struct apply
-            {
-                typedef typename 
-                    mpl::or_<typename T::no_nullary, State>::type
-                type;
-            };
-        };
-    }
-
-    template <typename EvalPolicy, typename EvalTuple>
-    struct composite : EvalTuple
-    {
-        typedef EvalTuple base_type;
-        typedef composite<EvalPolicy, EvalTuple> self_type;
-        typedef EvalPolicy eval_policy_type;
-        
-        typedef typename
-            mpl::fold<
-                EvalTuple
-              , mpl::false_
-              , detail::compute_no_nullary
-            >::type
-        no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef
-                typename detail::composite_eval<
-                    fusion::result_of::size<base_type>::value>::
-                template result<self_type, Env>::type
-            type;
-        };
-
-        composite()
-            : base_type() {}
-
-        composite(base_type const& base)
-            : base_type(base) {}
-
-        template <typename U0>
-        composite(U0& _0)
-            : base_type(_0) {}
-
-        template <typename U0, typename U1>
-        composite(U0& _0, U1& _1)
-            : base_type(_0, _1) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            typedef typename result<Env>::type return_type;
-            return detail::
-                composite_eval<fusion::result_of::size<base_type>::value>::template
-                    call<return_type>(*this, env);
-        }
-
-        //  Bring in the rest of the constructors
-        #include <boost/spirit/home/phoenix/core/detail/composite.hpp>
-    };
-
-    //  Bring in the detail::composite_eval<0..N> definitions
-    #include <boost/spirit/home/phoenix/core/detail/composite_eval.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/actor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_CORE_DETAIL_ACTOR_HPP
-#define PHOENIX_CORE_DETAIL_ACTOR_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/facilities/intercept.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_ACTOR_LIMIT,                                                \
-    "boost/spirit/home/phoenix/core/detail/actor.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <BOOST_PP_ENUM_PARAMS(N, typename T)>
-    actor(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
-        : Eval(BOOST_PP_ENUM_PARAMS(N, _)) {}
-
-    template <typename F, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    struct result<F(BOOST_PP_ENUM_PARAMS(N, A))>
-      : eval_result<
-            eval_type
-          , basic_environment<
-                BOOST_PP_ENUM_BINARY_PARAMS(
-                    N
-                  , typename remove_reference<A
-                  , >::type BOOST_PP_INTERCEPT
-                )
-            >
-        >
-    {};
-
-    template <BOOST_PP_ENUM_PARAMS(N, typename T)>
-    typename result<
-        actor(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & BOOST_PP_INTERCEPT))
-    >::type
-    operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _)) const
-    {
-        return eval_type::eval(
-            basic_environment<BOOST_PP_ENUM_PARAMS(N, T)>(
-                BOOST_PP_ENUM_PARAMS(N, _))
-        );
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/basic_environment.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_CORE_DETAIL_BASIC_ENVIRONMENT_HPP
-#define PHOENIX_CORE_DETAIL_BASIC_ENVIRONMENT_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_ARG_LIMIT,                                                  \
-    "boost/spirit/home/phoenix/core/detail/basic_environment.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <BOOST_PP_ENUM_PARAMS(N, typename U)>
-    basic_environment(BOOST_PP_ENUM_BINARY_PARAMS(N, U, & _))
-        : args_(BOOST_PP_ENUM_PARAMS(N, _)) {}
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/compose.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_CORE_DETAIL_COMPOSE_DETAIL_HPP
-#define PHOENIX_CORE_DETAIL_COMPOSE_DETAIL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-
-#define PHOENIX_AS_ACTOR_CONVERT(z, n, data)                                    \
-    as_actor<BOOST_PP_CAT(T, n)>::convert(BOOST_PP_CAT(_, n))
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/core/detail/compose.hpp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_AS_ACTOR_CONVERT
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename EvalPolicy, BOOST_PP_ENUM_PARAMS(N, typename T)>
-    inline actor<
-        typename as_composite<EvalPolicy, BOOST_PP_ENUM_PARAMS(N, T)>::type>
-    compose(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
-    {
-        return actor<
-            typename as_composite<EvalPolicy, BOOST_PP_ENUM_PARAMS(N, T)>::type>(
-                BOOST_PP_ENUM(N, PHOENIX_AS_ACTOR_CONVERT, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_CORE_DETAIL_COMPOSITE_HPP
-#define PHOENIX_CORE_DETAIL_COMPOSITE_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/core/detail/composite.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <BOOST_PP_ENUM_PARAMS(N, typename U)>
-    composite(BOOST_PP_ENUM_BINARY_PARAMS(N, U, & _))
-        : base_type(BOOST_PP_ENUM_PARAMS(N, _)) {}
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_CORE_DETAIL_COMPOSITE_EVAL_HPP
-#define PHOENIX_CORE_DETAIL_COMPOSITE_EVAL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-
-    namespace detail
-    {
-        template <int N>
-        struct composite_eval;
-
-        template <>
-        struct composite_eval<0>
-        {
-            template <typename Composite, typename Env>
-            struct result
-            {
-                typedef typename Composite::eval_policy_type::
-                    template result<Env>::type
-                type;
-            };
-
-            template <typename RT, typename Composite, typename Env>
-            static RT
-            call(Composite const& /*composite*/, Env const& env)
-            {
-                typedef typename Composite::eval_policy_type eval_policy_type;
-                return eval_policy_type::template eval<RT>(env);
-            }
-        };
-
-        template <typename Actor, typename Env>
-        struct eval_is_actor
-            : is_actor<typename Actor::template result<Env>::type> {};
-
-        template <typename Actor, typename Env>
-        struct eval_is_void
-            : is_same<typename Actor::template result<Env>::type, fusion::void_> {};
-    }
-
-#define PHOENIX_GET_ACTOR_TYPE(z, n, data)                                      \
-    typedef                                                                     \
-        typename fusion::result_of::value_at_c<Composite, n>::type              \
-    BOOST_PP_CAT(actor, n);
-
-#define PHOENIX_GET_ACTOR(z, n, data)                                           \
-    fusion::at_c<n>(composite)
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (1, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/core/detail/composite_eval.hpp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_GET_ACTOR
-#undef PHOENIX_GET_ACTOR_TYPE
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    namespace detail
-    {
-        template <>
-        struct composite_eval<N>
-        {
-            template <typename Composite, typename Env>
-            struct result
-            {
-                BOOST_PP_REPEAT(N, PHOENIX_GET_ACTOR_TYPE, _)
-
-                typedef typename
-                    Composite::eval_policy_type::template result<
-                        Env, BOOST_PP_ENUM_PARAMS(N, actor)
-                    >::type
-                type;
-            };
-
-            template <typename RT, typename Composite, typename Env>
-            static RT
-            call(Composite const& composite, Env const& env)
-            {
-                typedef typename Composite::eval_policy_type eval_policy_type;
-                return eval_policy_type::template eval<RT>(
-                    env, BOOST_PP_ENUM(N, PHOENIX_GET_ACTOR, _));
-            }
-        };
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/composite_info.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_DETAIL_COMPOSITE_INFO_HPP
-#define PHOENIX_CORE_DETAIL_COMPOSITE_INFO_HPP
-
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/greater.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/spirit/home/fusion/algorithm/fold.hpp>
-
-namespace boost { namespace phoenix { namespace detail
-{
-    struct max_nesting
-    {
-        template <typename T, typename State>
-        struct result :
-            mpl::if_<
-                mpl::greater<typename T::nesting, State>
-              , typename T::nesting
-              , State
-            >
-        {};
-    };
-
-    template <typename ActorTuple>
-    struct compute_nesting
-    {
-        typedef typename
-            fusion::meta::fold<ActorTuple, mpl::int_<0>, max_nesting>::type
-        type;
-    };
-
-}}}
-
-#endif
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/detail/function_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(BOOST_PP_IS_ITERATING)
-#if !defined(PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP)
-#define PHOENIX_CORE_DETAIL_FUNCTION_EVAL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/enum.hpp>
-#include <boost/preprocessor/repeat.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/find.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-
-// we assume that mpl::vectorN, where N = PHOENIX_COMPOSITE_LIMIT
-// is included already.
-
-namespace boost { namespace phoenix { namespace detail
-{
-    template <int N>
-    struct function_eval;
-
-    template <>
-    struct function_eval<0>
-    {
-        template <typename Env, typename F>
-        struct result
-        {
-            typedef typename
-                remove_reference<
-                    typename F::template result<Env>::type 
-                >::type
-            fn;
-            typedef typename fn::result_type type;
-        };
-
-        template <typename RT, typename Env, typename F>
-        static RT
-        eval(Env const& env, F const& f)
-        {
-            return f.eval(env)();
-        }
-    };
-
-    template <typename T>
-    T& help_rvalue_deduction(T& x)
-    {
-        return x;
-    }
-
-    template <typename T>
-    T const& help_rvalue_deduction(T const& x)
-    {
-        return x;
-    }
-
-// When we call f(_0, _1...) we remove the reference when deducing f's
-// return type. $$$ Explain why $$$
-
-#define PHOENIX_GET_ARG(z, n, data)                                             \
-    typedef typename                                                            \
-        remove_reference<                                                       \
-            typename BOOST_PP_CAT(A, n)::template result<Env>::type             \
-        >::type                                                                 \
-    BOOST_PP_CAT(a, n);
-
-#define PHOENIX_EVAL_ARG(z, n, data)                                            \
-    help_rvalue_deduction(BOOST_PP_CAT(_, n).eval(env))
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (1, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT),                              \
-    "boost/spirit/home/phoenix/core/detail/function_eval.hpp"))
-#include BOOST_PP_ITERATE()
-
-}}} // namespace boost::phoenix::detail
-
-#undef PHOENIX_GET_ARG
-#undef PHOENIX_EVAL_ARG
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <>
-    struct function_eval<N>
-    {
-        template <typename Env, typename F
-          , BOOST_PP_ENUM_PARAMS(N, typename A)>
-        struct result
-        {
-            typedef typename
-                remove_reference<
-                    typename F::template result<Env>::type 
-                >::type
-            fn;
-            BOOST_PP_REPEAT(N, PHOENIX_GET_ARG, _)
-
-            typedef BOOST_PP_CAT(mpl::vector, N)
-                <BOOST_PP_ENUM_PARAMS(N, a)>
-            args;
-
-            typedef typename
-                fn::template result<BOOST_PP_ENUM_PARAMS(N, a)>
-            function_apply;
-
-            typedef typename
-                mpl::eval_if<
-                    is_same<
-                        typename mpl::find<args, fusion::void_>::type
-                      , typename mpl::end<args>::type>
-                  , function_apply
-                  , mpl::identity<fusion::void_>
-                >::type
-            type;
-        };
-
-        template <typename RT, typename Env, typename F
-          , BOOST_PP_ENUM_PARAMS(N, typename A)>
-        static RT
-        eval(Env const& env, F const& f
-          , BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
-        {
-            return f.eval(env)(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
-        }
-    };
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/is_actor.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_IS_ACTOR_HPP
-#define PHOENIX_CORE_IS_ACTOR_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix
-{
-///////////////////////////////////////////////////////////////////////////////
-//
-//  is_actor<T>
-//
-//      Tests if T is an actor. Evaluates to mpl::true_ or mpl::false_
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <typename T>
-    struct is_actor : mpl::false_ {};
-
-    template <typename Base>
-    struct is_actor<actor<Base> > : mpl::true_ {};
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/limits.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_LIMITS_HPP
-#define PHOENIX_CORE_LIMITS_HPP
-
-#include <boost/preprocessor/dec.hpp>
-
-#if !defined(PHOENIX_LIMIT)
-# define PHOENIX_LIMIT 10
-#elif (PHOENIX_LIMIT < 5)
-# error "PHOENIX_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_ARG_LIMIT)
-# define PHOENIX_ARG_LIMIT PHOENIX_LIMIT
-#elif (PHOENIX_ARG_LIMIT < 5)
-# error "PHOENIX_ARG_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_ACTOR_LIMIT)
-# define PHOENIX_ACTOR_LIMIT PHOENIX_LIMIT
-#elif (PHOENIX_ACTOR_LIMIT > PHOENIX_ARG_LIMIT)
-# error "PHOENIX_ACTOR_LIMIT > PHOENIX_ARG_LIMIT"
-#elif (PHOENIX_ACTOR_LIMIT < 3)
-# error "PHOENIX_ACTOR_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_COMPOSITE_LIMIT)
-# define PHOENIX_COMPOSITE_LIMIT PHOENIX_LIMIT
-#elif (PHOENIX_COMPOSITE_LIMIT < 5)
-# error "PHOENIX_COMPOSITE_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_MEMBER_LIMIT)
-# define PHOENIX_MEMBER_LIMIT BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT))
-#elif (PHOENIX_MEMBER_LIMIT > PHOENIX_COMPOSITE_LIMIT)
-# error "PHOENIX_MEMBER_LIMIT > PHOENIX_COMPOSITE_LIMIT"
-#elif (PHOENIX_MEMBER_LIMIT < 3)
-# error "PHOENIX_MEMBER_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_CATCH_LIMIT)
-# define PHOENIX_CATCH_LIMIT BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)
-#elif (PHOENIX_CATCH_LIMIT < 1)
-# error "PHOENIX_CATCH_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_DYNAMIC_LIMIT)
-# define PHOENIX_DYNAMIC_LIMIT PHOENIX_LIMIT
-#elif (PHOENIX_DYNAMIC_LIMIT < 1)
-# error "PHOENIX_DYNAMIC_LIMIT is set too low"
-#endif
-
-#if !defined(PHOENIX_LOCAL_LIMIT)
-# define PHOENIX_LOCAL_LIMIT PHOENIX_LIMIT
-#elif (PHOENIX_LOCAL_LIMIT < 3)
-# error "PHOENIX_LOCAL_LIMIT is set too low"
-#endif
-
-
-#if !defined(FUSION_MAX_VECTOR_SIZE)
-# define FUSION_MAX_VECTOR_SIZE PHOENIX_LIMIT
-#elif (FUSION_MAX_VECTOR_SIZE < PHOENIX_LIMIT)
-# error "FUSION_MAX_VECTOR_SIZE < PHOENIX_LIMIT"
-#endif
-
-// this include will bring in mpl::vectorN and 
-// fusion::vectorN where N is PHOENIX_LIMIT
-#include <boost/fusion/include/vector.hpp>
-
-// for some reason, this must be included now to make
-// detail/type_deduction.hpp compile. $$$ TODO: Investigate further $$$
-#include <boost/mpl/vector/vector20.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/nothing.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_NOTHING_HPP
-#define PHOENIX_CORE_NOTHING_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix
-{
-///////////////////////////////////////////////////////////////////////////////
-//
-//  null_actor
-//
-//      A actor that does nothing (a "bum", if you will :-).
-//
-///////////////////////////////////////////////////////////////////////////////
-    struct null_actor
-    {
-        typedef mpl::false_ no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename Env>
-        void
-        eval(Env const&) const
-        {
-        }
-    };
-
-    actor<null_actor> const nothing = null_actor();
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/reference.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_REFERENCE_HPP
-#define PHOENIX_CORE_REFERENCE_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename T>
-    struct reference
-    {
-        // $$$ TODO: a better (user friendly) static assert
-        BOOST_STATIC_ASSERT(
-            mpl::not_<is_reference<T> >::value != 0);
-
-        typedef mpl::false_ no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef T& type;
-        };
-
-        reference(T& arg)
-            : ref(arg) {}
-
-        template <typename Env>
-        T& eval(Env const&) const
-        {
-            return ref;
-        }
-
-        T& ref;
-
-    private:
-        // silence MSVC warning C4512: assignment operator could not be generated
-        reference& operator= (reference const&);
-    };
-
-    template <typename T>
-    inline actor<reference<T> > const
-    ref(T& v)
-    {
-        return reference<T>(v);
-    }
-
-    template <typename T>
-    inline actor<reference<T const> > const
-    cref(T const& v)
-    {
-        return reference<T const>(v);
-    }
-
-    namespace detail
-    {
-        struct error_attempting_to_convert_an_actor_to_a_reference {};
-    }
-
-    template <typename Base>
-    void
-    ref(actor<Base> const& v
-        , detail::error_attempting_to_convert_an_actor_to_a_reference
-            = detail::error_attempting_to_convert_an_actor_to_a_reference());
-
-    template <typename Base>
-    void
-    cref(actor<Base> const& v
-        , detail::error_attempting_to_convert_an_actor_to_a_reference
-            = detail::error_attempting_to_convert_an_actor_to_a_reference());
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/core/value.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CORE_VALUE_HPP
-#define PHOENIX_CORE_VALUE_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/as_actor.hpp>
-#include <boost/static_assert.hpp>
-
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/add_const.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/remove_pointer.hpp>
-#include <boost/type_traits/is_function.hpp>
-
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace meta
-    {
-        template<typename T>
-        struct const_ref
-            : add_reference<typename add_const<T>::type>
-        {};
-
-        template<typename T>
-        struct argument_type
-            : mpl::eval_if<
-            is_function<typename remove_pointer<T>::type>,
-            mpl::identity<T>,
-            const_ref<T> >
-        {
-            typedef T type;
-        };
-    }
-
-    template <typename T>
-    struct value
-    {
-        BOOST_STATIC_ASSERT(
-            mpl::not_<is_reference<T> >::value != 0);
-
-        typedef mpl::false_ no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef T type;
-        };
-
-        value()
-            : val() {}
-
-        value(T const& arg)
-            : val(arg) {}
-
-        template <typename Env>
-        T const&
-        eval(Env const&) const
-        {
-            return val;
-        }
-
-        T val;
-    };
-
-    template <typename Actor>
-    struct actor_value
-    {
-        typedef typename Actor::no_nullary no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef typename
-                remove_reference<
-                    typename eval_result<Actor, Env>::type
-                >::type
-            type;
-        };
-
-        actor_value(Actor const& actor_)
-            : actor(actor_) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            return actor.eval(env);
-        }
-
-        Actor actor;
-    };
-
-    template <typename T>
-    inline typename as_actor<T>::type
-    val(T const& v)
-    {
-        return as_actor<T>::convert(v);
-    }
-
-    template <typename Derived>
-    inline actor<actor_value<Derived> >
-    val(actor<Derived> const& actor)
-    {
-        return actor_value<Derived>(actor);
-    }
-
-    template <typename T>
-    struct as_actor_base
-    {
-        typedef value<T> type;
-
-        static value<T>
-        convert(typename meta::argument_type<T>::type x)
-        {
-            return value<T>(x);
-        }
-    };
-
-    // Sometimes it is necessary to auto-convert references to
-    // a value<T>. This happens when we are re-currying. This
-    // cannot happen through the standard public actor interfaces.
-    template <typename T>
-    struct as_actor_base<T&>
-    {
-        typedef value<T> type;
-
-        static value<T>
-        convert(T& x)
-        {
-            return value<T>(x);
-        }
-    };
-
-    template <typename T, int N>
-    struct as_actor_base<T[N]>
-    {
-        typedef value<T const*> type;
-
-        static value<T const*>
-        convert(T const x[N])
-        {
-            return value<T const*>(x);
-        }
-    };
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/detail/local_reference.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_DETAIL_LOCAL_REFERENCE_HPP
-#define PHOENIX_DETAIL_LOCAL_REFERENCE_HPP
-
-#include <boost/utility/addressof.hpp>
-
-namespace boost { namespace phoenix { namespace detail
-{
-    template <typename T>
-    struct local_reference
-    { 
-        typedef T type;
-    
-        explicit local_reference(T& t): t_(boost::addressof(t)) {}
-        operator T& () const { return *t_; }
-        local_reference& operator=(T const& x) { *t_ = x; return *this; }
-        local_reference const& operator=(T const& x) const { *t_ = x; return *this; }
-        T& get() const { return *t_; }
-        T* get_pointer() const { return t_; }
-    
-    private:
-    
-        T* t_;
-    };
-    
-    template <typename T>
-    struct unwrap_local_reference
-    {
-        typedef T type; // T should be a reference
-    };
-
-    template <typename T>
-    struct unwrap_local_reference<local_reference<T> >
-    {
-        typedef T type; // unwrap the reference; T is a value
-    };
-}}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/detail/type_deduction.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,497 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_DETAIL_TYPE_DEDUCTION_HPP
-#define PHOENIX_DETAIL_TYPE_DEDUCTION_HPP
-
-/*=============================================================================
-
-    Return Type Deduction
-    [JDG Sept. 15, 2003]
-
-    Before C++ adopts the typeof, there is currently no way to deduce the
-    result type of an expression such as x + y. This deficiency is a major
-    problem with template metaprogramming; for example, when writing
-    forwarding functions that attempt to capture the essence of an
-    expression inside a function. Consider the std::plus<T>:
-
-        template <typename T>
-        struct plus : public binary_function<T, T, T>
-        {
-            T operator()(T const& x, T const& y) const
-            {
-                return x + y;
-            }
-        };
-
-    What's wrong with this? Well, this functor does not accurately capture
-    the behavior of the plus operator. 1) It does not handle the case where
-    x and y are of different types (e.g. x is short and y is int). 2) It
-    assumes that the arguments and return type are the same (i.e. when
-    adding a short and an int, the return type ought to be an int). Due to
-    these shortcomings, std::plus<T>(x, y) is a poor substitute for x + y.
-
-    The case where x is short and y is int does not really expose the
-    problem. We can simply use std::plus<int> and be happy that the
-    operands x and y will simply be converted to an int. The problem
-    becomes evident when an operand is a user defined type such as bigint.
-    Here, the conversion to bigint is simply not acceptable. Even if the
-    unnecessary conversion is tolerable, in generic code, it is not always
-    possible to choose the right T type that can accomodate both x and y
-    operands.
-
-    To truly model the plus operator, what we need is a polymorphic functor
-    that can take arbitrary x and y operands. Here's a rough schematic:
-
-        struct plus
-        {
-            template <typename X, typename Y>
-            unspecified-type
-            operator()(X const& x, Y const& y) const
-            {
-                return x + y;
-            }
-        };
-
-    Now, we can handle the case where X and Y are arbitrary types. We've
-    solved the first problem. To solve the second problem, we need some
-    form of return type deduction mechanism. If we had the typeof, it would
-    be something like:
-
-        template <typename X, typename Y>
-        typeof(X() + Y())
-        operator()(X const& x, Y const& y) const
-        {
-            return x + y;
-        }
-
-    Without the typeof facility, it is only possible to wrap an expression
-    such as x + y in a function or functor if we are given a hint that
-    tells us what the actual result type of such an expression is. Such a
-    hint can be in the form of a metaprogram, that, given the types of the
-    arguments, will return the result type. Example:
-
-        template <typename X, typename Y>
-        struct result_of_plus
-        {
-            typedef unspecified-type type;
-        };
-
-    Given a result_of_plus metaprogram, we can complete our polymorphic
-    plus functor:
-
-        struct plus
-        {
-            template <typename X, typename Y>
-            typename result_of_plus<X, Y>::type
-            operator()(X const& x, Y const& y) const
-            {
-                return x + y;
-            }
-        };
-
-    The process is not automatic. We have to specialize the metaprogram for
-    specific argument types. Examples:
-
-        template <>
-        struct result_of_plus<short, int>
-        {
-            typedef int type;
-        };
-
-        template <typename T>
-        struct result_of_plus<std::complex<T>, std::complex<T> >
-        {
-            typedef std::complex<T> type;
-        };
-
-    To make it easier for the user, specializations are provided for common
-    types such as primitive c++ types (e.g. int, char, double, etc.), and
-    standard types (e.g. std::complex, iostream, std containers and
-    iterators).
-
-    To further improve the ease of use, for user defined classes, we can
-    supply a few more basic specializations through metaprogramming using
-    heuristics based on canonical operator rules (Such heuristics can be
-    found in the LL and Phoenix, for example). For example, it is rather
-    common that the result of x += y is X& or the result of x || y is a
-    bool. The client is out of luck if her classes do not follow the
-    canonical rules. She'll then have to supply her own specialization.
-
-    The type deduction mechanism demostrated below approaches the problem
-    not through specialization and heuristics, but through a limited form
-    of typeof mechanism. The code does not use heuristics, hence, no
-    guessing games. The code takes advantage of the fact that, in general,
-    the result type of an expression is related to one its arguments' type.
-    For example, x + y, where x has type int and y has type double, has the
-    result type double (the second operand type). Another example, x[y]
-    where x is a vector<T> and y is a std::size_t, has the result type
-    vector<T>::reference (the vector<T>'s reference type type).
-
-    The limited form of type deduction presented can detect common
-    relations if the result of a binary or unary operation, given arguments
-    x and y with types X and Y (respectively), is X, Y, X&, Y&, X*, Y*, X
-    const*, Y const*, bool, int, unsigned, double, container and iterator
-    elements (e.g the T, where X is: T[N], T*, vector<T>, map<T>,
-    vector<T>::iterator). More arguments/return type relationships can be
-    established if needed.
-
-    A set of overloaded test(T) functions capture these argument related
-    types. Each test(T) function returns a distinct type that can be used
-    to determine the exact type of an expression.
-
-    Consider:
-
-        template <typename X, typename Y>
-        x_value_type
-        test(X const&);
-
-        template <typename X, typename Y>
-        y_value_type
-        test(Y const&);
-
-    Given an expression x + y, where x is int and y is double, the call to:
-
-        test<int, double>(x + y)
-
-    will return a y_value_type.
-
-    Now, if we rig x_value_type and y_value_type such that both have unique
-    sizes, we can use sizeof(test<X, Y>(x + y)) to determine if the result
-    type is either X or Y.
-
-    For example, if:
-
-        sizeof(test<X, Y>(x + y)) == sizeof(y_value_type)
-
-    then, we know for sure that the result of x + y has type Y.
-
-    The same basic scheme can be used to detect more argument-dependent
-    return types where the sizeof the test(T) return type is used to index
-    through a boost::mpl vector which holds each of the corresponding
-    result types.
-
-==============================================================================*/
-#include <boost/mpl/vector/vector20.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/not.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/remove_cv.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/type_traits/is_array.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
-
-namespace boost
-{
-    struct error_cant_deduce_type {};
-}
-
-namespace boost { namespace type_deduction_detail
-{
-    typedef char(&bool_value_type)[1];
-    typedef char(&int_value_type)[2];
-    typedef char(&uint_value_type)[3];
-    typedef char(&double_value_type)[4];
-
-    typedef char(&bool_reference_type)[5];
-    typedef char(&int_reference_type)[6];
-    typedef char(&uint_reference_type)[7];
-    typedef char(&double_reference_type)[8];
-
-    typedef char(&x_value_type)[9];
-    typedef char(&x_reference_type)[10];
-    typedef char(&x_const_pointer_type)[11];
-    typedef char(&x_pointer_type)[12];
-
-    typedef char(&y_value_type)[13];
-    typedef char(&y_reference_type)[14];
-    typedef char(&y_const_pointer_type)[15];
-    typedef char(&y_pointer_type)[16];
-
-    typedef char(&container_reference_type)[17];
-    typedef char(&container_const_reference_type)[18];
-    typedef char(&container_mapped_type)[19];
-
-    typedef char(&cant_deduce_type)[20];
-
-    template <typename T, typename Plain = typename remove_cv<T>::type>
-    struct is_basic
-        : mpl::or_<
-            is_same<Plain, bool>
-          , is_same<Plain, int>
-          , is_same<Plain, unsigned>
-          , is_same<Plain, double>
-        > {};
-
-    template <typename C>
-    struct reference_type
-    {
-        typedef typename C::reference type;
-    };
-
-    template <typename T>
-    struct reference_type<T const>
-        : reference_type<T> {};
-
-    template <typename T, std::size_t N>
-    struct reference_type<T[N]>
-    {
-        typedef T& type;
-    };
-
-    template <typename T>
-    struct reference_type<T*>
-    {
-        typedef T& type;
-    };
-
-    template <typename T>
-    struct reference_type<T* const>
-    {
-        typedef T const& type;
-    };
-
-    template <typename C>
-    struct const_reference_type
-    {
-        typedef typename C::const_reference type;
-    };
-
-    template <typename C>
-    struct mapped_type
-    {
-        typedef typename C::mapped_type type;
-    };
-
-    struct asymmetric;
-
-    template <typename X, typename Y>
-    cant_deduce_type
-    test(...); // The black hole !!!
-
-    template <typename X, typename Y>
-    bool_value_type
-    test(bool const&);
-
-    template <typename X, typename Y>
-    int_value_type
-    test(int const&);
-
-    template <typename X, typename Y>
-    uint_value_type
-    test(unsigned const&);
-
-    template <typename X, typename Y>
-    double_value_type
-    test(double const&);
-
-    template <typename X, typename Y>
-    bool_reference_type
-    test(bool&);
-
-    template <typename X, typename Y>
-    int_reference_type
-    test(int&);
-
-    template <typename X, typename Y>
-    uint_reference_type
-    test(unsigned&);
-
-    template <typename X, typename Y>
-    double_reference_type
-    test(double&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<is_basic<X>, is_const<X> >
-      , x_value_type
-    >::type
-    test(X const&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        is_basic<X>
-      , x_reference_type
-    >::type
-    test(X&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_basic<X>
-          , is_const<X>
-        >
-      , x_const_pointer_type
-    >::type
-    test(X const*);
-
-    template <typename X, typename Y>
-    x_pointer_type
-    test(X*);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_basic<Y>
-          , is_same<Y, asymmetric>
-          , is_const<Y>
-          , is_same<X, Y>
-        >
-      , y_value_type
-    >::type
-    test(Y const&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_basic<Y>
-          , is_same<Y, asymmetric>
-          , is_same<X, Y>
-        >
-      , y_reference_type
-    >::type
-    test(Y&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_same<Y, asymmetric>
-          , is_const<Y>
-          , is_same<X, Y>
-        >
-      , y_const_pointer_type
-    >::type
-    test(Y const*);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_same<Y, asymmetric>
-          , is_same<X, Y>
-        >
-      , y_pointer_type
-    >::type
-    test(Y*);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_basic<typename X::value_type>
-          , is_same<typename add_reference<X>::type, typename X::reference>
-        >
-      , container_reference_type
-    >::type
-    test(typename X::reference);
-
-    template <typename X, typename Y, typename Z>
-    typename enable_if<
-        mpl::and_<
-            mpl::or_<is_array<X>, is_pointer<X> >
-          , mpl::not_<is_basic<Z> >
-          , mpl::not_<is_same<X, Z> >
-        >
-      , container_reference_type
-    >::type
-    test(Z&);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        mpl::or_<
-            is_basic<typename X::value_type>
-          , is_same<typename add_reference<X>::type, typename X::const_reference>
-        >
-      , container_const_reference_type
-    >::type
-    test(typename X::const_reference);
-
-    template <typename X, typename Y>
-    typename disable_if<
-        is_basic<typename X::mapped_type>
-      , container_mapped_type
-    >::type
-    test(typename X::mapped_type);
-
-    template <typename X, typename Y>
-    struct base_result_of
-    {
-        typedef typename phoenix::detail::unwrap_local_reference<X>::type x_type_;
-        typedef typename phoenix::detail::unwrap_local_reference<Y>::type y_type_;
-        typedef typename remove_reference<x_type_>::type x_type;
-        typedef typename remove_reference<y_type_>::type y_type;
-
-        typedef mpl::vector20<
-            mpl::identity<bool>
-          , mpl::identity<int>
-          , mpl::identity<unsigned>
-          , mpl::identity<double>
-          , mpl::identity<bool&>
-          , mpl::identity<int&>
-          , mpl::identity<unsigned&>
-          , mpl::identity<double&>
-          , mpl::identity<x_type>
-          , mpl::identity<x_type&>
-          , mpl::identity<x_type const*>
-          , mpl::identity<x_type*>
-          , mpl::identity<y_type>
-          , mpl::identity<y_type&>
-          , mpl::identity<y_type const*>
-          , mpl::identity<y_type*>
-          , reference_type<x_type>
-          , const_reference_type<x_type>
-          , mapped_type<x_type>
-          , mpl::identity<error_cant_deduce_type>
-        >
-        types;
-    };
-
-}} // namespace boost::type_deduction_detail
-
-#define BOOST_RESULT_OF_COMMON(expr, name, Y, SYMMETRY)                         \
-    struct name                                                                 \
-    {                                                                           \
-        typedef type_deduction_detail::base_result_of<X, Y> base_type;          \
-        static typename base_type::x_type x;                                    \
-        static typename base_type::y_type y;                                    \
-                                                                                \
-        BOOST_STATIC_CONSTANT(int,                                              \
-            size = sizeof(                                                      \
-                type_deduction_detail::test<                                    \
-                    typename base_type::x_type                                  \
-                  , SYMMETRY                                                    \
-                >(expr)                                                         \
-            ));                                                                 \
-                                                                                \
-        BOOST_STATIC_CONSTANT(int, index = (size / sizeof(char)) - 1);          \
-                                                                                \
-        typedef typename mpl::at_c<                                             \
-            typename base_type::types, index>::type id;                         \
-        typedef typename id::type type;                                         \
-    };
-
-#define BOOST_UNARY_RESULT_OF(expr, name)                                       \
-    template <typename X>                                                       \
-    BOOST_RESULT_OF_COMMON(expr, name,                                          \
-        type_deduction_detail::asymmetric, type_deduction_detail::asymmetric)
-
-#define BOOST_BINARY_RESULT_OF(expr, name)                                      \
-    template <typename X, typename Y>                                           \
-    BOOST_RESULT_OF_COMMON(expr, name, Y, typename base_type::y_type)
-
-#define BOOST_ASYMMETRIC_BINARY_RESULT_OF(expr, name)                           \
-    template <typename X, typename Y>                                           \
-    BOOST_RESULT_OF_COMMON(expr, name, Y, type_deduction_detail::asymmetric)
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_FUNCTION_HPP
-#define PHOENIX_FUNCTION_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/function/function.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function/detail/function_call.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_FUNCTION_DETAIL_FUNCTION_CALL_HPP
-#define PHOENIX_FUNCTION_DETAIL_FUNCTION_CALL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT),                              \
-    "boost/spirit/home/phoenix/function/detail/function_call.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <BOOST_PP_ENUM_PARAMS(N, typename A)>
-    actor<typename as_composite<detail::function_eval<N>, F
-      , BOOST_PP_ENUM_PARAMS(N, A)>::type>
-    operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _)) const
-    {
-        return compose<detail::function_eval<N> >(f, BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/function/function.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_FUNCTION_FUNCTION_HPP
-#define PHOENIX_FUNCTION_FUNCTION_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/detail/function_eval.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename F>
-    struct function
-    {
-        function() : f() {}
-        function(F const& f_) : f(f_) {}
-
-        actor<typename as_composite<detail::function_eval<0>, F>::type>
-        operator()() const
-        {
-            return compose<detail::function_eval<0> >(f);
-        }
-
-        template <typename A0>
-        actor<typename as_composite<detail::function_eval<1>, F, A0>::type>
-        operator()(A0 const& _0) const
-        {
-            return compose<detail::function_eval<1> >(f, _0);
-        }
-
-        template <typename A0, typename A1>
-        actor<typename as_composite<detail::function_eval<2>, F, A0, A1>::type>
-        operator()(A0 const& _0, A1 const& _1) const
-        {
-            return compose<detail::function_eval<2> >(f, _0, _1);
-        }
-
-        //  Bring in the rest of the function call operators
-        #include <boost/spirit/home/phoenix/function/detail/function_call.hpp>
-
-        F f;
-    };
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/fusion.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_FUSION_HPP
-#define PHOENIX_FUSION_HPP
-
-#include <boost/spirit/home/phoenix/fusion/at.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/fusion/at.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2008 Hartmut Kaiser
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SEQUENCE_AT_HPP
-#define PHOENIX_SEQUENCE_AT_HPP
-
-#include <boost/fusion/include/at.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <int N>
-    struct at_eval
-    {
-        template <typename Env, typename Tuple>
-        struct result
-        {
-            typedef typename Tuple::template result<Env>::type tuple;
-            typedef typename
-                fusion::result_of::at_c<
-                    typename remove_reference<tuple>::type, N
-                >::type
-            type;
-        };
-
-        template <typename RT, typename Env, typename Tuple>
-        static RT
-        eval(Env const& env, Tuple const& t)
-        {
-            return fusion::at_c<N>(t.eval(env));
-        }
-    };
-
-    template <int N, typename Tuple>
-    inline actor<typename as_composite<at_eval<N>, Tuple>::type>
-    at_c(Tuple const& tup)
-    {
-        return compose<at_eval<N> >(tup);
-    }
-
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_HPP
-#define PHOENIX_OBJECT_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/object/new.hpp>
-#include <boost/spirit/home/phoenix/object/construct.hpp>
-#include <boost/spirit/home/phoenix/object/delete.hpp>
-#include <boost/spirit/home/phoenix/object/static_cast.hpp>
-#include <boost/spirit/home/phoenix/object/const_cast.hpp>
-#include <boost/spirit/home/phoenix/object/dynamic_cast.hpp>
-#include <boost/spirit/home/phoenix/object/reinterpret_cast.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/const_cast.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_CONST_CAST_HPP
-#define PHOENIX_OBJECT_CONST_CAST_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace impl
-    {
-        template <typename T>
-        struct const_cast_eval
-        {
-            template <typename Env, typename U>
-            struct result
-            {
-                typedef T type;
-            };
-
-            template <typename RT, typename Env, typename U>
-            static RT
-            eval(Env const& env, U& obj)
-            {
-                return const_cast<RT>(obj.eval(env));
-            }
-        };
-    }
-
-    template <typename T, typename U>
-    inline actor<typename as_composite<impl::const_cast_eval<T>, U>::type>
-    const_cast_(U const& obj)
-    {
-        return compose<impl::const_cast_eval<T> >(obj);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/construct.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_CONSTRUCT_HPP
-#define PHOENIX_OBJECT_CONSTRUCT_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <typename T>
-        struct construct_eval
-        {
-            template <typename Env,
-                BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-                    PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
-            struct result
-            {
-                typedef T type;
-            };
-
-            template <typename RT, typename Env>
-            static RT
-            eval(Env const& /*env*/)
-            {
-                return RT();
-            }
-
-            template <typename RT, typename Env, typename A0>
-            static RT
-            eval(Env const& env, A0& _0)
-            {
-                return RT(_0.eval(env));
-            }
-
-            template <typename RT
-                , typename Env, typename A0, typename A1>
-            static RT
-            eval(Env const& env, A0& _0, A1& _1)
-            {
-                return RT(_0.eval(env), _1.eval(env));
-            }
-
-            //  Bring in the rest of the evals
-            #include <boost/spirit/home/phoenix/object/detail/construct_eval.hpp>
-        };
-    }
-
-    template <typename T>
-    inline actor<typename as_composite<detail::construct_eval<T> >::type>
-    construct()
-    {
-        return compose<detail::construct_eval<T> >();
-    }
-
-    template <typename T, typename A0>
-    inline actor<typename as_composite<detail::construct_eval<T>, A0>::type>
-    construct(A0 const& _0)
-    {
-        return compose<detail::construct_eval<T> >(_0);
-    }
-
-    template <typename T, typename A0, typename A1>
-    inline actor<typename as_composite<detail::construct_eval<T>, A0, A1>::type>
-    construct(A0 const& _0, A1 const& _1)
-    {
-        return compose<detail::construct_eval<T> >(_0, _1);
-    }
-
-    //  Bring in the rest of the new_ functions
-    #include <boost/spirit/home/phoenix/object/detail/construct.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/delete.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_DELETE_HPP
-#define PHOENIX_OBJECT_DELETE_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace impl
-    {
-        struct delete_eval
-        {
-            template <typename Env, typename P>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename Args, typename Env, typename P>
-            static void
-            eval(Env const& env, P& p)
-            {
-                delete p.eval(env);
-            }
-        };
-    }
-
-    template <typename P>
-    inline actor<typename as_composite<impl::delete_eval, P>::type>
-    delete_(P const& p)
-    {
-        return compose<impl::delete_eval>(p);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/construct.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OBJECT_DETAIL_CONSTRUCT_HPP
-#define PHOENIX_OBJECT_DETAIL_CONSTRUCT_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/object/detail/construct.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename T, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<typename as_composite<detail::construct_eval<T>
-        , BOOST_PP_ENUM_PARAMS(N, A)>::type>
-    construct(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        return compose<detail::construct_eval<T> >(BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/construct_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OBJECT_DETAIL_CONSTRUCT_EVAL_HPP
-#define PHOENIX_OBJECT_DETAIL_CONSTRUCT_EVAL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define PHOENIX_EVAL_ARG(z, n, data)                                            \
-    BOOST_PP_CAT(_, n).eval(env)
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/object/detail/construct_eval.hpp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_EVAL_ARG
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename RT, typename Env, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    static RT
-    eval(Env const& env, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
-    {
-        return RT(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/new.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OBJECT_DETAIL_NEW_HPP
-#define PHOENIX_OBJECT_DETAIL_NEW_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/object/detail/new.hpp"))
-#include BOOST_PP_ITERATE()
-
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename T, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    inline actor<typename as_composite<detail::new_eval<T>
-        , BOOST_PP_ENUM_PARAMS(N, A)>::type>
-    new_(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& _))
-    {
-        return compose<detail::new_eval<T> >(BOOST_PP_ENUM_PARAMS(N, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/detail/new_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OBJECT_DETAIL_NEW_EVAL_HPP
-#define PHOENIX_OBJECT_DETAIL_NEW_EVAL_HPP
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define PHOENIX_EVAL_ARG(z, n, data)                                            \
-    BOOST_PP_CAT(_, n).eval(env)
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_COMPOSITE_LIMIT,                                            \
-    "boost/spirit/home/phoenix/object/detail/new_eval.hpp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_EVAL_ARG
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <typename RT, typename Env, BOOST_PP_ENUM_PARAMS(N, typename A)>
-    static RT
-    eval(Env const& env, BOOST_PP_ENUM_BINARY_PARAMS(N, A, & _))
-    {
-        return new T(BOOST_PP_ENUM(N, PHOENIX_EVAL_ARG, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/dynamic_cast.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_DYNAMIC_CAST_HPP
-#define PHOENIX_OBJECT_DYNAMIC_CAST_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace impl
-    {
-        template <typename T>
-        struct dynamic_cast_eval
-        {
-            template <typename Env, typename U>
-            struct result
-            {
-                typedef T type;
-            };
-
-            template <typename RT, typename Env, typename U>
-            static RT
-            eval(Env const& env, U& obj)
-            {
-                return dynamic_cast<RT>(obj.eval(env));
-            }
-        };
-    }
-
-    template <typename T, typename U>
-    inline actor<typename as_composite<impl::dynamic_cast_eval<T>, U>::type>
-    dynamic_cast_(U const& obj)
-    {
-        return compose<impl::dynamic_cast_eval<T> >(obj);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/new.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_NEW_HPP
-#define PHOENIX_OBJECT_NEW_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <typename T>
-        struct new_eval
-        {
-            template <typename Env,
-                BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-                    PHOENIX_COMPOSITE_LIMIT, typename T, fusion::void_)>
-            struct result
-            {
-                typedef T* type;
-            };
-
-            template <typename RT, typename Env>
-            static RT
-            eval(Env const& /*env*/)
-            {
-                return new T;
-            }
-
-            template <typename RT, typename Env, typename A0>
-            static RT
-            eval(Env const& env, A0& _0)
-            {
-                return new T(_0.eval(env));
-            }
-
-            template <typename RT, typename Env
-              , typename A0, typename A1>
-            static RT
-            eval(Env const& env, A0& _0, A1& _1)
-            {
-                return new T(_0.eval(env), _1.eval(env));
-            }
-
-            //  Bring in the rest of the evals
-            #include <boost/spirit/home/phoenix/object/detail/new_eval.hpp>
-        };
-    }
-
-    template <typename T>
-    inline actor<typename as_composite<detail::new_eval<T> >::type>
-    new_()
-    {
-        return compose<detail::new_eval<T> >();
-    }
-
-    template <typename T, typename A0>
-    inline actor<typename as_composite<detail::new_eval<T>, A0>::type>
-    new_(A0 const& _0)
-    {
-        return compose<detail::new_eval<T> >(_0);
-    }
-
-    template <typename T, typename A0, typename A1>
-    inline actor<typename as_composite<detail::new_eval<T>, A0, A1>::type>
-    new_(A0 const& _0, A1 const& _1)
-    {
-        return compose<detail::new_eval<T> >(_0, _1);
-    }
-
-    //  Bring in the rest of the new_ functions
-    #include <boost/spirit/home/phoenix/object/detail/new.hpp>
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/reinterpret_cast.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_REINTERPRET_CAST_HPP
-#define PHOENIX_OBJECT_REINTERPRET_CAST_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace impl
-    {
-        template <typename T>
-        struct reinterpret_cast_eval
-        {
-            template <typename Env, typename U>
-            struct result
-            {
-                typedef T type;
-            };
-
-            template <typename RT, typename Env, typename U>
-            static RT
-            eval(Env const& env, U& obj)
-            {
-                return reinterpret_cast<RT>(obj.eval(env));
-            }
-        };
-    }
-
-    template <typename T, typename U>
-    inline actor<typename as_composite<impl::reinterpret_cast_eval<T>, U>::type>
-    reinterpret_cast_(U const& obj)
-    {
-        return compose<impl::reinterpret_cast_eval<T> >(obj);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/object/static_cast.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OBJECT_STATIC_CAST_HPP
-#define PHOENIX_OBJECT_STATIC_CAST_HPP
-
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    namespace impl
-    {
-        template <typename T>
-        struct static_cast_eval
-        {
-            template <typename Env, typename U>
-            struct result
-            {
-                typedef T type;
-            };
-
-            template <typename RT, typename Env, typename U>
-            static RT
-            eval(Env const& env, U& obj)
-            {
-                return static_cast<RT>(obj.eval(env));
-            }
-        };
-    }
-
-    template <typename T, typename U>
-    inline actor<typename as_composite<impl::static_cast_eval<T>, U>::type>
-    static_cast_(U const& obj)
-    {
-        return compose<impl::static_cast_eval<T> >(obj);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_HPP
-#define PHOENIX_OPERATOR_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/operator/arithmetic.hpp>
-#include <boost/spirit/home/phoenix/operator/bitwise.hpp>
-#include <boost/spirit/home/phoenix/operator/comparison.hpp>
-#include <boost/spirit/home/phoenix/operator/if_else.hpp>
-#include <boost/spirit/home/phoenix/operator/logical.hpp>
-#include <boost/spirit/home/phoenix/operator/self.hpp>
-#include <boost/spirit/home/phoenix/operator/io.hpp>
-#include <boost/spirit/home/phoenix/operator/member.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/arithmetic.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_ARITHMETIC_HPP
-#define PHOENIX_OPERATOR_ARITHMETIC_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct negate_eval;
-    struct posit_eval;
-    struct pre_increment_eval;
-    struct pre_decrement_eval;
-    struct post_increment_eval;
-    struct post_decrement_eval;
-
-    struct plus_assign_eval;
-    struct minus_assign_eval;
-    struct multiplies_assign_eval;
-    struct divides_assign_eval;
-    struct modulus_assign_eval;
-
-    struct plus_eval;
-    struct minus_eval;
-    struct multiplies_eval;
-    struct divides_eval;
-    struct modulus_eval;
-
-    BOOST_UNARY_RESULT_OF(-x, result_of_negate)
-    BOOST_UNARY_RESULT_OF(+x, result_of_posit)
-    BOOST_UNARY_RESULT_OF(++x, result_of_pre_increment)
-    BOOST_UNARY_RESULT_OF(--x, result_of_pre_decrement)
-    BOOST_UNARY_RESULT_OF(x++, result_of_post_increment)
-    BOOST_UNARY_RESULT_OF(x--, result_of_post_decrement)
-
-    BOOST_BINARY_RESULT_OF(x += y, result_of_plus_assign)
-    BOOST_BINARY_RESULT_OF(x -= y, result_of_minus_assign)
-    BOOST_BINARY_RESULT_OF(x *= y, result_of_multiplies_assign)
-    BOOST_BINARY_RESULT_OF(x /= y, result_of_divides_assign)
-    BOOST_BINARY_RESULT_OF(x %= y, result_of_modulus_assign)
-
-    BOOST_BINARY_RESULT_OF(x + y, result_of_plus)
-    BOOST_BINARY_RESULT_OF(x - y, result_of_minus)
-    BOOST_BINARY_RESULT_OF(x * y, result_of_multiplies)
-    BOOST_BINARY_RESULT_OF(x / y, result_of_divides)
-    BOOST_BINARY_RESULT_OF(x % y, result_of_modulus)
-
-#define x a0.eval(env)
-#define y a1.eval(env)
-
-    PHOENIX_UNARY_EVAL(negate_eval, result_of_negate, -x)
-    PHOENIX_UNARY_EVAL(posit_eval, result_of_posit, +x)
-    PHOENIX_UNARY_EVAL(pre_increment_eval, result_of_pre_increment, ++x)
-    PHOENIX_UNARY_EVAL(pre_decrement_eval, result_of_pre_decrement, --x)
-    PHOENIX_UNARY_EVAL(post_increment_eval, result_of_post_increment, x++)
-    PHOENIX_UNARY_EVAL(post_decrement_eval, result_of_post_decrement, x--)
-
-    PHOENIX_BINARY_EVAL(plus_assign_eval, result_of_plus_assign, x += y)
-    PHOENIX_BINARY_EVAL(minus_assign_eval, result_of_minus_assign, x -= y)
-    PHOENIX_BINARY_EVAL(multiplies_assign_eval, result_of_multiplies_assign, x *= y)
-    PHOENIX_BINARY_EVAL(divides_assign_eval, result_of_divides_assign, x /= y)
-    PHOENIX_BINARY_EVAL(modulus_assign_eval, result_of_modulus_assign, x %= y)
-
-    PHOENIX_BINARY_EVAL(plus_eval, result_of_plus, x + y)
-    PHOENIX_BINARY_EVAL(minus_eval, result_of_minus, x - y)
-    PHOENIX_BINARY_EVAL(multiplies_eval, result_of_multiplies, x * y)
-    PHOENIX_BINARY_EVAL(divides_eval, result_of_divides, x / y)
-    PHOENIX_BINARY_EVAL(modulus_eval, result_of_modulus, x % y)
-
-    PHOENIX_UNARY_COMPOSE(negate_eval, -)
-    PHOENIX_UNARY_COMPOSE(posit_eval, +)
-    PHOENIX_UNARY_COMPOSE(pre_increment_eval, ++)
-    PHOENIX_UNARY_COMPOSE(pre_decrement_eval, --)
-
-    template <typename T0>
-    inline actor<typename as_composite<post_increment_eval, actor<T0> >::type>
-    operator++(actor<T0> const& a0, int) // special case
-    {
-        return compose<post_increment_eval>(a0);
-    }
-
-    template <typename T0>
-    inline actor<typename as_composite<post_decrement_eval, actor<T0> >::type>
-    operator--(actor<T0> const& a0, int) // special case
-    {
-        return compose<post_decrement_eval>(a0);
-    }
-
-    PHOENIX_BINARY_COMPOSE(plus_assign_eval, +=)
-    PHOENIX_BINARY_COMPOSE(minus_assign_eval, -=)
-    PHOENIX_BINARY_COMPOSE(multiplies_assign_eval, *=)
-    PHOENIX_BINARY_COMPOSE(divides_assign_eval, /=)
-    PHOENIX_BINARY_COMPOSE(modulus_assign_eval, %=)
-
-    PHOENIX_BINARY_COMPOSE(plus_eval, +)
-    PHOENIX_BINARY_COMPOSE(minus_eval, -)
-    PHOENIX_BINARY_COMPOSE(multiplies_eval, *)
-    PHOENIX_BINARY_COMPOSE(divides_eval, /)
-    PHOENIX_BINARY_COMPOSE(modulus_eval, %)
-
-#undef x
-#undef y
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/bitwise.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_BITWISE_HPP
-#define PHOENIX_OPERATOR_BITWISE_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable : 4800)
-#endif
-
-namespace boost { namespace phoenix
-{
-    struct invert_eval;
-
-    struct and_assign_eval;
-    struct or_assign_eval;
-    struct xor_assign_eval;
-    struct shift_left_assign_eval;
-    struct shift_right_assign_eval;
-
-    struct and_eval;
-    struct or_eval;
-    struct xor_eval;
-    struct shift_left_eval;
-    struct shift_right_eval;
-
-    BOOST_UNARY_RESULT_OF(~x, result_of_invert)
-
-    BOOST_BINARY_RESULT_OF(x &= y, result_of_and_assign)
-    BOOST_BINARY_RESULT_OF(x |= y, result_of_or_assign)
-    BOOST_BINARY_RESULT_OF(x ^= y, result_of_xor_assign)
-    BOOST_BINARY_RESULT_OF(x <<= y, result_of_shift_left_assign)
-    BOOST_BINARY_RESULT_OF(x >>= y, result_of_shift_right_assign)
-
-    BOOST_BINARY_RESULT_OF(x & y, result_of_and)
-    BOOST_BINARY_RESULT_OF(x | y, result_of_or)
-    BOOST_BINARY_RESULT_OF(x ^ y, result_of_xor)
-    BOOST_BINARY_RESULT_OF(x << y, result_of_shift_left)
-    BOOST_BINARY_RESULT_OF(x >> y, result_of_shift_right)
-
-#define x a0.eval(env)
-#define y a1.eval(env)
-
-    PHOENIX_UNARY_EVAL(invert_eval, result_of_invert, ~x)
-    PHOENIX_UNARY_COMPOSE(invert_eval, ~)
-
-    PHOENIX_BINARY_EVAL(and_assign_eval, result_of_and_assign, x &= y)
-    PHOENIX_BINARY_EVAL(or_assign_eval, result_of_or_assign, x |= y)
-    PHOENIX_BINARY_EVAL(xor_assign_eval, result_of_xor_assign, x ^= y)
-    PHOENIX_BINARY_EVAL(shift_left_assign_eval, result_of_shift_left_assign, x <<= y)
-    PHOENIX_BINARY_EVAL(shift_right_assign_eval, result_of_shift_right_assign, x >>= y)
-
-    PHOENIX_BINARY_EVAL(and_eval, result_of_and, x & y)
-    PHOENIX_BINARY_EVAL(or_eval, result_of_or, x | y)
-    PHOENIX_BINARY_EVAL(xor_eval, result_of_xor, x ^ y)
-    PHOENIX_BINARY_EVAL(shift_left_eval, result_of_shift_left, x << y)
-    PHOENIX_BINARY_EVAL(shift_right_eval, result_of_shift_right, x >> y)
-
-    PHOENIX_BINARY_COMPOSE(and_assign_eval, &=)
-    PHOENIX_BINARY_COMPOSE(or_assign_eval, |=)
-    PHOENIX_BINARY_COMPOSE(xor_assign_eval, ^=)
-    PHOENIX_BINARY_COMPOSE(shift_left_assign_eval, <<=)
-    PHOENIX_BINARY_COMPOSE(shift_right_assign_eval, >>=)
-
-    PHOENIX_BINARY_COMPOSE(and_eval, &)
-    PHOENIX_BINARY_COMPOSE(or_eval, |)
-    PHOENIX_BINARY_COMPOSE(xor_eval, ^)
-    PHOENIX_BINARY_COMPOSE(shift_left_eval, <<)
-    PHOENIX_BINARY_COMPOSE(shift_right_eval, >>)
-
-#undef x
-#undef y
-}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/comparison.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_COMPARISON_HPP
-#define PHOENIX_OPERATOR_COMPARISON_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct equal_to_eval;
-    struct not_equal_to_eval;
-    struct less_eval;
-    struct less_equal_eval;
-    struct greater_eval;
-    struct greater_equal_eval;
-
-    BOOST_BINARY_RESULT_OF(x == y, result_of_equal_to)
-    BOOST_BINARY_RESULT_OF(x != y, result_of_not_equal_to)
-    BOOST_BINARY_RESULT_OF(x < y, result_of_less)
-    BOOST_BINARY_RESULT_OF(x <= y, result_of_less_equal)
-    BOOST_BINARY_RESULT_OF(x > y, result_of_greater)
-    BOOST_BINARY_RESULT_OF(x >= y, result_of_greater_equal)
-
-#define x a0.eval(env)
-#define y a1.eval(env)
-
-    PHOENIX_BINARY_EVAL(equal_to_eval, result_of_equal_to, x == y)
-    PHOENIX_BINARY_EVAL(not_equal_to_eval, result_of_not_equal_to, x != y)
-    PHOENIX_BINARY_EVAL(less_eval, result_of_less, x < y)
-    PHOENIX_BINARY_EVAL(less_equal_eval, result_of_less_equal, x <= y)
-    PHOENIX_BINARY_EVAL(greater_eval, result_of_greater, x > y)
-    PHOENIX_BINARY_EVAL(greater_equal_eval, result_of_greater_equal, x >= y)
-
-    PHOENIX_BINARY_COMPOSE(equal_to_eval, ==)
-    PHOENIX_BINARY_COMPOSE(not_equal_to_eval, !=)
-    PHOENIX_BINARY_COMPOSE(less_eval, <)
-    PHOENIX_BINARY_COMPOSE(less_equal_eval, <=)
-    PHOENIX_BINARY_COMPOSE(greater_eval, >)
-    PHOENIX_BINARY_COMPOSE(greater_equal_eval, >=)
-
-#undef x
-#undef y
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/binary_compose.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_DETAIL_BINARY_COMPOSE_HPP
-#define PHOENIX_OPERATOR_DETAIL_BINARY_COMPOSE_HPP
-
-#define PHOENIX_BINARY_COMPOSE(eval_name, op)                                   \
-    template <typename T0, typename T1>                                         \
-    inline actor<typename as_composite<eval_name, actor<T0>, actor<T1> >::type> \
-    operator op (actor<T0> const& a0, actor<T1> const& a1)                      \
-    {                                                                           \
-        return compose<eval_name>(a0, a1);                                      \
-    }                                                                           \
-                                                                                \
-    template <typename T0, typename T1>                                         \
-    inline actor<typename as_composite<eval_name, actor<T0>, T1>::type>         \
-    operator op (actor<T0> const& a0, T1 const& a1)                             \
-    {                                                                           \
-        return compose<eval_name>(a0, a1);                                      \
-    }                                                                           \
-                                                                                \
-    template <typename T0, typename T1>                                         \
-    inline actor<typename as_composite<eval_name, T0, actor<T1> >::type>        \
-    operator op (T0 const& a0, actor<T1> const& a1)                             \
-    {                                                                           \
-        return compose<eval_name>(a0, a1);                                      \
-    }
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/binary_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_DETAIL_BINARY_EVAL_HPP
-#define PHOENIX_OPERATOR_DETAIL_BINARY_EVAL_HPP
-
-#include <boost/mpl/or.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-#define PHOENIX_BINARY_EVAL(eval_name, op_result, expr)                         \
-    struct eval_name                                                            \
-    {                                                                           \
-        template <typename Env, typename A0, typename A1>                       \
-        struct result                                                            \
-        {                                                                       \
-            typedef typename A0::template result<Env>::type x_type;              \
-            typedef typename A1::template result<Env>::type y_type;              \
-                                                                                \
-            typedef typename                                                    \
-                mpl::eval_if<                                                   \
-                    mpl::or_<is_actor<x_type>, is_actor<y_type> >               \
-                  , re_curry<eval_name, x_type, y_type>                         \
-                  , op_result<x_type, y_type>                                   \
-                >::type                                                         \
-            type;                                                               \
-        };                                                                      \
-                                                                                \
-        template <typename RT, typename Env, typename A0, typename A1>          \
-        static RT                                                               \
-        eval(Env const& env, A0& a0, A1& a1)                                    \
-        {                                                                       \
-            return expr;                                                        \
-        }                                                                       \
-    };
-
-#undef x
-#undef y
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/io.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_DETAIL_IO_HPP
-#define PHOENIX_OPERATOR_DETAIL_IO_HPP
-
-#include <boost/spirit/home/phoenix/operator/bitwise.hpp>
-#include <boost/spirit/home/phoenix/core/reference.hpp>
-#include <boost/utility/addressof.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <iostream>
-
-namespace boost { namespace phoenix { namespace detail
-{
-    typedef char(&no)[1];
-    typedef char(&yes)[2];
-
-    template <typename CharType, typename CharTrait>
-    yes ostream_test(std::basic_ostream<CharType, CharTrait>*);
-    no ostream_test(...);
-
-    template <typename CharType, typename CharTrait>
-    yes istream_test(std::basic_istream<CharType, CharTrait>*);
-    no istream_test(...);
-
-    template <typename T>
-    struct is_ostream
-    {
-        static T x;
-        BOOST_STATIC_CONSTANT(bool,
-            value = sizeof(detail::ostream_test(boost::addressof(x))) == sizeof(yes));
-    };
-
-    template <typename T>
-    struct is_istream
-    {
-        static T x;
-        BOOST_STATIC_CONSTANT(bool,
-            value = sizeof(detail::istream_test(boost::addressof(x))) == sizeof(yes));
-    };
-
-    template <typename T0, typename T1>
-    struct enable_if_ostream :
-        enable_if<
-            detail::is_ostream<T0>
-          , actor<
-                typename as_composite<
-                    shift_left_eval
-                  , actor<reference<T0> >
-                  , actor<T1>
-                >::type
-            >
-        >
-    {};
-
-    template <typename T0, typename T1>
-    struct enable_if_istream :
-        enable_if<
-            detail::is_istream<T0>
-          , actor<
-                typename as_composite<
-                    shift_right_eval
-                  , actor<reference<T0> >
-                  , actor<T1>
-                >::type
-            >
-        >
-    {};
-
-    typedef std::ios_base&  (*iomanip_type)(std::ios_base&);
-    typedef std::istream&   (*imanip_type)(std::istream&);
-    typedef std::ostream&   (*omanip_type)(std::ostream&);
-}}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
-#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_EVAL_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-
-#include <boost/mpl/void.hpp>
-
-#include <boost/type_traits/function_traits.hpp>
-
-#include <boost/get_pointer.hpp>
-
-#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp>
-
-namespace boost { namespace phoenix {
-
-    struct mem_fun_ptr_eval
-    {
-        template<typename Env, typename PtrActor, typename MemFunPtrActor,
-                 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PP_SUB(PHOENIX_MEMBER_LIMIT, 2), typename Arg, mpl::void_)>
-
-        struct result
-            : detail::mem_fun_ptr_return<typename eval_result<MemFunPtrActor, Env>::type> { };
-
-        template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor>
-        static typename result<Env,PtrActor,MemFunPtrActor>::type
-        eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor)
-        {
-            return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))();
-        }
-
-#define BOOST_PP_ITERATION_PARAMS_1                                                                                 \
-        (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_MEMBER_LIMIT)), "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-    };
-}}
-
-#endif
-
-#else
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-#define PHOENIX_EVAL_ARG(z,n,_) arg ## n.eval(env)        
-
-        template<typename Rt, typename Env, typename PtrActor, typename MemFunPtrActor,
-                 BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename Arg)> 
-        static typename result<Env,PtrActor,MemFunPtrActor, BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION,Arg)>::type
-        eval(const Env& env, PtrActor& ptrActor, MemFunPtrActor& memFunPtrActor,
-             BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, Arg, & arg))
-        {
-            return (get_pointer(ptrActor.eval(env))->*memFunPtrActor.eval(env))(
-                BOOST_PP_ENUM(PHOENIX_ITERATION,PHOENIX_EVAL_ARG,_));
-        }
-
-#undef PHOENIX_EVAL_ARG
-#undef PHOENIX_ITERATION
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_GEN_HPP
-#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_GEN_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/as_actor.hpp>
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-
-#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp>
-
-namespace boost { namespace phoenix {
-    template<typename Actor, typename MemFunPtr>
-    struct mem_fun_ptr_gen
-    {
-        mem_fun_ptr_gen(
-            const Actor& actor, MemFunPtr memFunPtr)
-            : mActor(actor), mMemFunPtr(memFunPtr) { }
-
-        actor<typename as_composite<mem_fun_ptr_eval, Actor, typename as_actor<MemFunPtr>::type>::type>
-        operator()() const
-        {
-            return compose<mem_fun_ptr_eval>(
-                mActor, as_actor<MemFunPtr>::convert(mMemFunPtr));
-        }
-
-#define BOOST_PP_ITERATION_PARAMS_1                                                        \
-        (3, (1, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_MEMBER_LIMIT)), "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-        Actor mActor;
-        MemFunPtr mMemFunPtr;
-    };
-}}
-
-#endif
-#else
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-        template<BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename Arg)>
-        actor<typename as_composite<
-            mem_fun_ptr_eval, Actor, typename as_actor<MemFunPtr>::type,
-            BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, Arg)>::type>
-        operator()(
-            BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, const Arg, &arg)) const
-        {
-            return compose<mem_fun_ptr_eval>(
-                mActor, as_actor<MemFunPtr>::convert(mMemFunPtr),
-                BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, arg));
-        }
-
-#undef PHOENIX_ITERATION
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_RETURN_HPP
-#define PHOENIX_OPERATOR_DETAIL_MEM_FUN_PTR_RETURN_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-
-namespace boost { namespace phoenix {
-namespace detail
-{
-    template<typename MemFunPtr>
-    struct mem_fun_ptr_return;
-
-    template<typename Ret, typename Class>
-    struct mem_fun_ptr_return<Ret (Class::*)()>
-    {
-        typedef Ret type;
-    };
-    
-    template<typename Ret, typename Class>
-    struct mem_fun_ptr_return<Ret (Class::*)() const>
-    {
-        typedef Ret type;
-    };
-
-#define BOOST_PP_ITERATION_PARAMS_1                                                           \
-        (3, (1, PHOENIX_MEMBER_LIMIT, "boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-}
-}}
-
-#endif
-
-#else
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-    template<typename Ret, typename Class,
-             BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename T)>
-    struct mem_fun_ptr_return<Ret (Class::*)(BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, T))>
-    {
-        typedef Ret type;
-    };
-
-    template<typename Ret, typename Class,
-             BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename T)>
-    struct mem_fun_ptr_return<Ret (Class::*)(BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, T)) const>
-    {
-        typedef Ret type;
-    };
-
-#undef PHOENIX_ITERATION
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/unary_compose.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_DETAIL_UNARY_COMPOSE_HPP
-#define PHOENIX_OPERATOR_DETAIL_UNARY_COMPOSE_HPP
-
-#define PHOENIX_UNARY_COMPOSE(eval_name, op)                                    \
-    template <typename T0>                                                      \
-    inline actor<typename as_composite<eval_name, actor<T0> >::type>            \
-    operator op (actor<T0> const& a0)                                           \
-    {                                                                           \
-        return compose<eval_name>(a0);                                          \
-    }
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/detail/unary_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_DETAIL_UNARY_EVAL_HPP
-#define PHOENIX_OPERATOR_DETAIL_UNARY_EVAL_HPP
-
-#include <boost/mpl/eval_if.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-#define PHOENIX_UNARY_EVAL(eval_name, op_result, expr)                          \
-    struct eval_name                                                            \
-    {                                                                           \
-        template <typename Env, typename A0>                                    \
-        struct result                                                            \
-        {                                                                       \
-            typedef typename A0::template result<Env>::type x_type;              \
-                                                                                \
-            typedef typename                                                    \
-                mpl::eval_if<                                                   \
-                    is_actor<x_type>                                            \
-                  , re_curry<eval_name, x_type>                                 \
-                  , op_result<x_type>                                           \
-                >::type                                                         \
-            type;                                                               \
-        };                                                                      \
-                                                                                \
-        template <typename RT, typename Env, typename A0>                       \
-        static RT                                                               \
-        eval(Env const& env, A0& a0)                                            \
-        {                                                                       \
-            return expr;                                                        \
-        }                                                                       \
-    };
-
-#endif
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/if_else.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_IF_ELSE_HPP
-#define PHOENIX_OPERATOR_IF_ELSE_HPP
-
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-
-namespace boost { namespace phoenix
-{
-    BOOST_BINARY_RESULT_OF(true ? x : y, result_of_if_else)
-
-    struct if_else_op_eval
-    {
-        template <
-            typename Env
-          , typename Cond
-          , typename Then
-          , typename Else
-        >
-        struct result
-        {
-            typedef typename Then::template result<Env>::type then_type;
-            typedef typename Else::template result<Env>::type else_type;
-
-            typedef typename
-                result_of_if_else<then_type, else_type>::type
-            ite_result;
-
-            // Note: c ? x : y can return an lvalue! Allow if_else_op_eval
-            // to return an lvalue IFF then_type and else_type are both lvalues
-            // with the same type.
-
-            typedef typename
-                mpl::if_<
-                    mpl::and_<
-                        is_same<then_type, else_type>
-                      , is_reference<then_type>
-                    >
-                  , ite_result
-                  , typename remove_reference<ite_result>::type
-                >::type
-            type;
-        };
-
-        template <
-            typename RT
-          , typename Env
-          , typename Cond
-          , typename Then
-          , typename Else
-        >
-        static RT
-        eval(Env const& env, Cond& cond, Then& then, Else& else_)
-        {
-            return cond.eval(env) ? then.eval(env) : else_.eval(env);
-        }
-    };
-
-    template <typename Cond, typename Then, typename Else>
-    inline actor<typename as_composite<if_else_op_eval, Cond, Then, Else>::type>
-    if_else(Cond const& cond, Then const& then, Else const& else_)
-    {
-        return compose<if_else_op_eval>(cond, then, else_);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/io.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_IO_HPP
-#define PHOENIX_OPERATOR_IO_HPP
-
-#include <boost/spirit/home/phoenix/operator/detail/io.hpp>
-
-namespace boost { namespace phoenix
-{
-///////////////////////////////////////////////////////////////////////////////
-//
-//  overloads for std::basic_ostream and std::basic_istream
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <typename T0, typename T1>
-    inline typename detail::enable_if_ostream<T0, T1>::type
-    operator<<(T0& a0, actor<T1> const& a1)
-    {
-        return compose<shift_left_eval>(phoenix::ref(a0), a1);
-    }
-
-    template <typename T0, typename T1>
-    inline typename detail::enable_if_istream<T0, T1>::type
-    operator>>(T0& a0, actor<T1> const& a1)
-    {
-        return compose<shift_right_eval>(phoenix::ref(a0), a1);
-    }
-
-    // resolve ambiguities with fusion.
-    template <typename T1>
-    inline typename detail::enable_if_ostream<std::ostream, T1>::type
-    operator<<(std::ostream& a0, actor<T1> const& a1)
-    {
-        return compose<shift_left_eval>(phoenix::ref(a0), a1);
-    }
-
-    template <typename T1>
-    inline typename detail::enable_if_istream<std::istream, T1>::type
-        operator>>(std::istream& a0, actor<T1> const& a1)
-    {
-        return compose<shift_right_eval>(phoenix::ref(a0), a1);
-    }
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  overloads for I/O manipulators.
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <typename T0>
-    inline actor<typename as_composite<
-        shift_left_eval, actor<T0>, detail::omanip_type>::type>
-    operator<<(actor<T0> const& a0, detail::omanip_type a1)
-    {
-        return compose<shift_left_eval>(a0, a1);
-    }
-
-    template <typename T0>
-    inline actor<typename as_composite<
-        shift_left_eval, actor<T0>, detail::iomanip_type>::type>
-    operator<<(actor<T0> const& a0, detail::iomanip_type a1)
-    {
-        return compose<shift_left_eval>(a0, a1);
-    }
-
-    template <typename T0>
-    inline actor<typename as_composite<
-        shift_right_eval, actor<T0>, detail::imanip_type>::type>
-    operator>>(actor<T0> const& a0, detail::imanip_type a1)
-    {
-        return compose<shift_right_eval>(a0, a1);
-    }
-
-    template <typename T0>
-    inline actor<typename as_composite<
-        shift_right_eval, actor<T0>, detail::iomanip_type>::type>
-    operator>>(actor<T0> const& a0, detail::iomanip_type a1)
-    {
-        return compose<shift_right_eval>(a0, a1);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/logical.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_LOGICAL_HPP
-#define PHOENIX_OPERATOR_LOGICAL_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct logical_not_eval;
-    struct logical_and_eval;
-    struct logical_or_eval;
-
-    BOOST_UNARY_RESULT_OF(!x, result_of_logical_not)
-    BOOST_BINARY_RESULT_OF(x && y, result_of_logical_and)
-    BOOST_BINARY_RESULT_OF(x || y, result_of_logical_or)
-
-#define x a0.eval(env)
-#define y a1.eval(env)
-
-    PHOENIX_UNARY_EVAL(logical_not_eval, result_of_logical_not, !x)
-    PHOENIX_BINARY_EVAL(logical_and_eval, result_of_logical_and, x && y)
-    PHOENIX_BINARY_EVAL(logical_or_eval, result_of_logical_or, x || y)
-
-    PHOENIX_UNARY_COMPOSE(logical_not_eval, !)
-    PHOENIX_BINARY_COMPOSE(logical_and_eval, &&)
-    PHOENIX_BINARY_COMPOSE(logical_or_eval, ||)
-
-#undef x
-#undef y
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/member.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef PHOENIX_OPERATOR_MEMBER_HPP
-#define PHOENIX_OPERATOR_MEMBER_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/add_const.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/type_traits/is_member_pointer.hpp>
-#include <boost/type_traits/is_member_function_pointer.hpp>
-
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-
-#include <boost/utility/enable_if.hpp>
-
-#include <boost/get_pointer.hpp>
-
-#include <boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>
-
-#include <memory>
-
-namespace boost { 
-    template<typename T> class shared_ptr;
-    template<typename T> class scoped_ptr;
-
-namespace phoenix {
-    namespace detail
-    {
-        template<typename T>
-        struct member_type;
-        
-        template<typename Class, typename MemberType>
-        struct member_type<MemberType (Class::*)>
-        {
-            typedef MemberType type;
-        };
-    }
-
-    namespace meta
-    {
-        template<typename T> 
-        struct pointed_type;
-
-        template<typename T>
-        struct pointed_type<T*>
-        {
-            typedef T type;
-        };
-
-        template<typename T>
-        struct pointed_type<shared_ptr<T> >
-        {
-            typedef T type;
-        };
-        
-        template<typename T>
-        struct pointed_type<scoped_ptr<T> >
-        {
-            typedef T type;
-        };
-
-        template<typename T>
-        struct pointed_type<std::auto_ptr<T> >
-        {
-            typedef T type;
-        };
-    }
-
-    struct member_object_eval
-    {
-        template<typename Env, typename PtrActor, typename MemPtrActor>
-        struct result
-        {
-            typedef typename detail::member_type<
-                typename eval_result<MemPtrActor, Env>::type>::type member_type;
-
-            typedef typename meta::pointed_type<
-                typename remove_reference<
-                typename eval_result<PtrActor, Env>::type>::type>::type object_type;
-
-            typedef typename add_reference<
-                typename mpl::eval_if<
-                is_const<object_type>,
-                add_const<member_type>,
-                mpl::identity<member_type> >::type>::type type;
-        };
-
-        template<typename Rt, typename Env, typename PtrActor, typename MemPtrActor>
-        static typename result<Env,PtrActor,MemPtrActor>::type
-        eval(const Env& env, PtrActor& ptrActor, MemPtrActor& memPtrActor)
-        {
-            return get_pointer(ptrActor.eval(env))->*memPtrActor.eval(env);
-        }
-    };
-
-    namespace member_object
-    {
-        template<typename T0, typename MemObjPtr>
-        typename enable_if<
-            mpl::and_<is_member_pointer<MemObjPtr>, mpl::not_<is_member_function_pointer<MemObjPtr> > >,
-            actor<typename as_composite<
-            member_object_eval, actor<T0>,
-            typename as_actor<MemObjPtr>::type>::type> >::type
-        operator->*(
-            const actor<T0>& ptrActor, 
-            MemObjPtr memObjPtr)
-        {
-            return compose<member_object_eval>(
-                ptrActor,
-                as_actor<MemObjPtr>::convert(memObjPtr));
-        }
-    }
-
-    namespace member_function
-    {
-        template<typename T0, typename MemFunPtr>
-        typename enable_if<
-            is_member_function_pointer<MemFunPtr>,
-            mem_fun_ptr_gen<actor<T0>, MemFunPtr> >::type
-        operator->*(const actor<T0>& ptrActor, MemFunPtr memFunPtr)
-        {
-            return mem_fun_ptr_gen<actor<T0>, MemFunPtr>(
-                ptrActor, memFunPtr);
-        }
-    }
-
-    using member_object::operator->*;
-    using member_function::operator->*;
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/operator/self.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_OPERATOR_SELF_HPP
-#define PHOENIX_OPERATOR_SELF_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>
-#include <boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct reference_eval;
-    struct dereference_eval;
-    struct assign_eval;
-    struct index_eval;
-
-    BOOST_UNARY_RESULT_OF(&x, result_of_reference)
-    BOOST_UNARY_RESULT_OF(*x, result_of_dereference)
-    BOOST_BINARY_RESULT_OF(x = y, result_of_assign)
-    BOOST_ASYMMETRIC_BINARY_RESULT_OF(x[y], result_of_index)
-
-    namespace detail
-    {
-        template <typename T0, typename T1>
-        struct make_assign_composite
-        {
-            typedef actor<typename as_composite<assign_eval, T0, T1>::type> type;
-        };
-
-        template <typename T0, typename T1>
-        struct make_index_composite
-        {
-            typedef actor<typename as_composite<index_eval, T0, T1>::type> type;
-        };
-    }
-
-    template <typename Base>
-    template <typename T1>
-    typename detail::make_assign_composite<actor<Base>, T1>::type
-    actor<Base>::operator=(T1 const& a1) const
-    {
-        return compose<assign_eval>(*this, a1);
-    }
-
-    template <typename Base>
-    template <typename T1>
-    typename detail::make_index_composite<actor<Base>, T1>::type
-    actor<Base>::operator[](T1 const& a1) const
-    {
-        return compose<index_eval>(*this, a1);
-    }
-
-#define x a0.eval(env)
-#define y a1.eval(env)
-
-    PHOENIX_UNARY_EVAL(reference_eval, result_of_reference, &x)
-    PHOENIX_UNARY_EVAL(dereference_eval, result_of_dereference, *x)
-    PHOENIX_UNARY_COMPOSE(reference_eval, &)
-    PHOENIX_UNARY_COMPOSE(dereference_eval, *)
-
-    PHOENIX_BINARY_EVAL(assign_eval, result_of_assign, x = y)
-    PHOENIX_BINARY_EVAL(index_eval, result_of_index, x[y])
-}}
-
-#undef x
-#undef y
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_HPP
-#define PHOENIX_SCOPE_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
-#include <boost/spirit/home/phoenix/scope/lambda.hpp>
-#include <boost/spirit/home/phoenix/scope/let.hpp>
-#include <boost/spirit/home/phoenix/scope/local_variable.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/detail/local_gen.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-// Allow multiple inclusion. let.hpp and lambda.hpp will have the guards
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-
-#define PHOENIX_LOCAL_GEN_PARAM(z, n, data)                                     \
-    actor<composite<assign_eval                                                 \
-  , fusion::vector<local_variable<K##n>, V##n> > > const& a##n
-
-#define PHOENIX_LOCAL_GEN_ACTOR(z, n, data)                                     \
-    fusion::at_c<1>(a##n)
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, PHOENIX_LOCAL_LIMIT,                                                \
-    "boost/spirit/home/phoenix/scope/detail/local_gen.hpp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_LOCAL_GEN_PARAM
-#undef PHOENIX_LOCAL_GEN_ACTOR
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <
-        BOOST_PP_ENUM_PARAMS(N, typename K)
-      , BOOST_PP_ENUM_PARAMS(N, typename V)
-    >
-    PHOENIX_LOCAL_GEN_NAME<
-        fusion::vector<BOOST_PP_ENUM_PARAMS(N, V)>
-      , detail::map_local_index_to_tuple<BOOST_PP_ENUM_PARAMS(N, K)>
-    >
-    operator()(
-        BOOST_PP_ENUM(N, PHOENIX_LOCAL_GEN_PARAM, _)
-    ) const
-    {
-        return fusion::vector<BOOST_PP_ENUM_PARAMS(N, V)>(
-            BOOST_PP_ENUM(N, PHOENIX_LOCAL_GEN_ACTOR, _));
-    }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/detail/local_variable.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP
-#define PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP
-
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/equal_to.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/less.hpp>
-#include <boost/mpl/size.hpp>
-#include <boost/fusion/include/at.hpp>
-#include <boost/fusion/include/value_at.hpp>
-#include <boost/preprocessor/enum.hpp>
-#include <boost/preprocessor/repeat.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/type_traits/is_reference.hpp>
-
-#define PHOENIX_MAP_LOCAL_TEMPLATE_PARAM(z, n, data) \
-    typename T##n = unused<n>
-
-#define PHOENIX_MAP_LOCAL_DISPATCH(z, n, data)  \
-    typedef char(&result##n)[n+2];              \
-    static result##n get(T##n*);
-
-namespace boost { namespace phoenix
-{
-    template <typename Env, typename OuterEnv, typename Locals, typename Map>
-    struct scoped_environment;
-
-    namespace detail
-    {
-        template <typename Env>
-        struct initialize_local
-        {
-            template <class F>
-            struct result;
-
-            template <class F, class Actor>
-            struct result<F(Actor)>
-            {
-                typedef typename remove_reference<Actor>::type actor_type;
-                typedef typename actor_type::template result<Env>::type type;
-            };
-
-            initialize_local(Env const& env)
-                : env(env) {}
-
-            template <typename Actor>
-            typename result<initialize_local(Actor)>::type
-            operator()(Actor const& actor) const
-            {
-                return actor.eval(env);
-            }
-
-            Env const& env;
-
-        private:
-            // silence MSVC warning C4512: assignment operator could not be generated
-            initialize_local& operator= (initialize_local const&);
-        };
-
-        template <typename T>
-        struct is_scoped_environment : mpl::false_ {};
-
-        template <typename Env, typename OuterEnv, typename Locals, typename Map>
-        struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals, Map> >
-            : mpl::true_ {};
-
-        template <int N>
-        struct unused;
-
-        template <BOOST_PP_ENUM(
-            PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_TEMPLATE_PARAM, _)>
-        struct map_local_index_to_tuple
-        {
-            typedef char(&not_found)[1];
-            static not_found get(...);
-
-            BOOST_PP_REPEAT(PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_DISPATCH, _)
-        };
-
-        template<typename T>
-        T* generate_pointer();
-
-        template <typename Map, typename Tag>
-        struct get_index
-        {
-            BOOST_STATIC_CONSTANT(int,
-                value = (
-                    static_cast<int>((sizeof(Map::get(generate_pointer<Tag>()))) / sizeof(char)) - 2
-                ));
-
-            // if value == -1, Tag is not found
-            typedef mpl::int_<value> type;
-        };
-
-        template <typename Local, typename Env>
-        struct apply_local;
-
-        template <typename Local, typename Env>
-        struct outer_local
-        {
-            typedef typename
-                apply_local<Local, typename Env::outer_env_type>::type
-            type;
-        };
-
-        template <typename Locals, typename Index>
-        struct get_local_or_void
-        {
-            typedef typename
-                mpl::eval_if<
-                    mpl::less<Index, mpl::size<Locals> >
-                  , fusion::result_of::at<Locals, Index>
-                  , mpl::identity<fusion::void_>
-                >::type
-            type;
-        };
-
-        template <typename Local, typename Env, typename Index>
-        struct get_local_from_index
-        {
-            typedef typename
-                mpl::eval_if<
-                    mpl::equal_to<Index, mpl::int_<-1> >
-                  , outer_local<Local, Env>
-                  , get_local_or_void<typename Env::locals_type, Index>
-                >::type
-            type;
-        };
-
-        template <typename Local, typename Env>
-        struct get_local
-        {
-            typedef typename
-                get_index<
-                    typename Env::map_type, typename Local::key_type>::type
-            index_type;
-
-            typedef typename
-                get_local_from_index<Local, Env, index_type>::type
-            type;
-        };
-
-        template <typename Local, typename Env>
-        struct apply_local
-        {
-            // $$$ TODO: static assert that Env is a scoped_environment $$$
-            typedef typename get_local<Local, Env>::type type;
-        };
-
-        template <typename Key>
-        struct eval_local
-        {
-            template <typename RT, typename Env, typename Index>
-            static RT
-            get(Env const& env, Index, mpl::false_)
-            {
-                return RT(fusion::at<Index>(env.locals));
-            }
-
-            template <typename RT, typename Env, typename Index>
-            static RT
-            get(Env const& env, Index index, mpl::true_)
-            {
-                typedef typename
-                    get_index<typename Env::outer_env_type::map_type, Key>::type
-                index_type;
-
-                return get<RT>(
-                    env.outer_env
-                  , index_type()
-                  , mpl::equal_to<index_type, mpl::int_<-1> >());
-            }
-
-            template <typename RT, typename Env, typename Index>
-            static RT
-            get(Env const& env, Index index)
-            {
-                return get<RT>(
-                    env
-                  , index
-                  , mpl::equal_to<Index, mpl::int_<-1> >());
-            }
-        };
-    }
-}}
-
-#undef PHOENIX_MAP_LOCAL_TEMPLATE_PARAM
-#undef PHOENIX_MAP_LOCAL_DISPATCH
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/dynamic.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_DYNAMIC_HPP
-#define PHOENIX_SCOPE_DYNAMIC_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/fusion/include/at.hpp>
-#include <boost/fusion/include/vector.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/seq/for_each_i.hpp>
-#include <boost/preprocessor/tuple/elem.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/inc.hpp>
-
-#include <boost/noncopyable.hpp>
-#include <boost/assert.hpp>
-
-#define PHOENIX_DYNAMIC_MEMBER(z, n, data)                                      \
-    typedef actor<dynamic_member<n, self_type> >                                \
-        BOOST_PP_CAT(member, BOOST_PP_INC(n));
-
-namespace boost { namespace phoenix
-{
-    template <typename DynamicScope>
-    struct dynamic_frame : noncopyable
-    {
-        typedef typename DynamicScope::tuple_type tuple_type;
-
-        dynamic_frame(DynamicScope const& scope)
-            : tuple()
-            , save(scope.frame)
-            , scope(scope)
-        {
-            scope.frame = this;
-        }
-
-        template <typename Tuple>
-        dynamic_frame(DynamicScope const& scope, Tuple const& init)
-            : tuple(init)
-            , save(scope.frame)
-            , scope(scope)
-        {
-            scope.frame = this;
-        }
-
-        ~dynamic_frame()
-        {
-            scope.frame = save;
-        }
-
-        tuple_type& data() { return tuple; }
-        tuple_type const& data() const { return tuple; }
-
-    private:
-
-        tuple_type tuple;
-        dynamic_frame* save;
-        DynamicScope const& scope;
-    };
-
-    template <int N, typename DynamicScope>
-    struct dynamic_member
-    {
-        typedef mpl::false_ no_nullary;
-        typedef typename DynamicScope::tuple_type tuple_type;
-
-        dynamic_member(DynamicScope const& scope)
-            : scope(scope) {}
-
-        template <typename Env>
-        struct result
-        {
-            typedef typename
-                fusion::result_of::at_c<tuple_type, N>::type
-            type;
-        };
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& /*env*/) const
-        {
-            BOOST_ASSERT(scope.frame != 0);
-            return fusion::at_c<N>(scope.frame->data());
-        }
-
-    private:
-
-        DynamicScope const& scope;
-    };
-
-    template <BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_DYNAMIC_LIMIT, typename T, void_)>
-    struct dynamic : noncopyable
-    {
-        typedef fusion::vector<BOOST_PP_ENUM_PARAMS(PHOENIX_DYNAMIC_LIMIT, T)> tuple_type;
-        typedef dynamic<BOOST_PP_ENUM_PARAMS(PHOENIX_DYNAMIC_LIMIT, T)> self_type;
-        typedef dynamic_frame<self_type> dynamic_frame_type;
-
-        dynamic()
-            : frame(0) {}
-
-        BOOST_PP_REPEAT(PHOENIX_DYNAMIC_LIMIT, PHOENIX_DYNAMIC_MEMBER, _)
-
-    private:
-
-        template <int N, typename DynamicScope>
-        friend struct dynamic_member;
-
-        template <typename DynamicScope>
-        friend struct dynamic_frame;
-
-        mutable dynamic_frame_type* frame;
-    };
-}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable:4355)
-#endif
-
-/*
-    PHOENIX_DYNAMIC macro(name, type-name sequence)
-    Example:
-
-    PHOENIX_DYNAMIC(
-        my_dynamic,
-            (int, num)
-            (std::string, message)
-            (double, real)
-    );
-
-    which expands to:
-
-    struct my_dynamic : ::boost::phoenix::dynamic<int, std::string, double>
-    {
-        my_dynamic() : num(*this), message(*this), real(*this) {}
-
-        member1 num;
-        member2 message;
-        member3 real;
-    };
-
-    PHOENIX_DYNAMIC takes the input (containing a binary sequence)
-    and converts that sequence to a unary sequence of
-    binary tuples and passes it on to PHOENIX_DYNAMIC_I.
-
-    Thanks to Paul Mensonides for the PP macro help
-*/
-
-#define PHOENIX_DYNAMIC(name, bseq)                                             \
-    PHOENIX_DYNAMIC_I(name, BOOST_PP_CAT(PHOENIX_DYNAMIC_X bseq, 0))            \
-
-#define PHOENIX_DYNAMIC_X(x, y) ((x, y)) PHOENIX_DYNAMIC_Y
-#define PHOENIX_DYNAMIC_Y(x, y) ((x, y)) PHOENIX_DYNAMIC_X
-#define PHOENIX_DYNAMIC_X0
-#define PHOENIX_DYNAMIC_Y0
-
-// PHOENIX_DYNAMIC_I generates the overarching structure and uses
-// SEQ_FOR_EACH_I to generate the "linear" substructures.
-
-#define PHOENIX_DYNAMIC_I(name, seq)                                            \
-    struct name :                                                               \
-        ::boost::phoenix::dynamic<                                              \
-            BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_A, ~, seq)> {               \
-        name() : BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_B, ~, seq) {}          \
-        BOOST_PP_SEQ_FOR_EACH_I(PHOENIX_DYNAMIC_C, ~, seq)                      \
-    }                                                                           \
-
-#define PHOENIX_DYNAMIC_A(r, _, i, xy)                                          \
-    BOOST_PP_COMMA_IF(i) BOOST_PP_TUPLE_ELEM(2, 0, xy)                          \
-
-#define PHOENIX_DYNAMIC_B(r, _, i, xy)                                          \
-    BOOST_PP_COMMA_IF(i) BOOST_PP_TUPLE_ELEM(2, 1, xy)(*this)                   \
-
-#define PHOENIX_DYNAMIC_C(r, _, i, xy)                                          \
-    BOOST_PP_CAT(member, BOOST_PP_INC(i)) BOOST_PP_TUPLE_ELEM(2, 1, xy);        \
-
-#undef PHOENIX_DYNAMIC_MEMBER
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/lambda.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_LAMBDA_HPP
-#define PHOENIX_SCOPE_LAMBDA_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
-#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
-#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/fusion/include/transform.hpp>
-#include <boost/fusion/include/as_vector.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename Base, typename OuterEnv, typename Locals, typename Map>
-    struct lambda_eval : Base
-    {
-        template <typename Env>
-        struct result
-        {
-            typedef typename Base::template
-                result<scoped_environment<Env, OuterEnv, Locals, Map> >::type
-            result_type;
-
-            typedef typename 
-                detail::unwrap_local_reference<result_type>::type 
-            type;
-        };
-
-        lambda_eval(
-            Base const& base
-          , OuterEnv const& outer_env
-          , Locals const& locals)
-            : Base(base)
-            , outer_env(outer_env)
-            , locals(locals) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            typedef typename result<Env>::type RT;
-            return RT(Base::eval(
-                scoped_environment<Env, OuterEnv, Locals, Map>(
-                    env, outer_env, locals)));
-        }
-
-        OuterEnv outer_env;
-        mutable Locals locals;
-    };
-    
-    template <typename Base, typename Vars, typename Map>
-    struct lambda_actor
-    {
-        typedef typename
-            mpl::fold<
-                Vars
-              , mpl::false_
-              , detail::compute_no_nullary
-            >::type
-        no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef typename 
-                fusion::result_of::as_vector<
-                    typename fusion::result_of::transform<
-                        Vars
-                      , detail::initialize_local<Env>
-                    >::type
-                >::type 
-            locals_type;
-
-            typedef actor<lambda_eval<Base, Env, locals_type, Map> > type;
-        };
-
-        lambda_actor(Base const& f, Vars const& vars)
-            : f(f), vars(vars) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            typedef typename result<Env>::type result_type;
-            
-            return result_type(
-                f, env, fusion::as_vector(
-                    fusion::transform(
-                        vars
-                      , detail::initialize_local<Env>(env)
-                    )));
-        }
-
-        Base f;
-        Vars vars;
-    };
-    
-    template <typename Vars, typename Map>
-    struct lambda_actor_gen
-    {
-        template <typename Base>
-        actor<lambda_actor<Base, Vars, Map> > const
-        operator[](actor<Base> const& f) const
-        {
-            return lambda_actor<Base, Vars, Map>(f, vars);
-        }
-
-        lambda_actor_gen(Vars const& vars)
-            : vars(vars) {}
-
-        Vars vars;
-    };
-
-    template <typename Key>
-    struct local_variable; // forward
-    struct assign_eval; // forward
-
-    struct lambda_gen 
-        : lambda_actor_gen<
-            fusion::vector<>
-          , detail::map_local_index_to_tuple<> >
-    {
-        typedef 
-            lambda_actor_gen<
-                fusion::vector<>
-              , detail::map_local_index_to_tuple<> >
-        base_type;
-
-        lambda_gen()
-            : base_type(fusion::vector<>())
-        {
-        }
-
-        template <typename K0, typename V0>
-        lambda_actor_gen<
-            fusion::vector<V0>
-          , detail::map_local_index_to_tuple<K0>
-        >
-        operator()(
-            actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
-        ) const
-        {
-            return fusion::vector<V0>(fusion::at_c<1>(a0));
-        }
-    
-        template <typename K0, typename K1, typename V0, typename V1>
-        lambda_actor_gen<
-            fusion::vector<V0, V1>
-          , detail::map_local_index_to_tuple<K0, K1>
-        >
-        operator()(
-            actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
-          , actor<composite<assign_eval, fusion::vector<local_variable<K1>, V1> > > const& a1
-        ) const
-        {
-            return fusion::vector<V0, V1>(fusion::at_c<1>(a0), fusion::at_c<1>(a1));
-        }
-        
-        // Bring in the rest...
-        #define PHOENIX_LOCAL_GEN_NAME lambda_actor_gen
-        #include <boost/spirit/home/phoenix/scope/detail/local_gen.hpp>
-        #undef PHOENIX_LOCAL_GEN_NAME
-    };
-
-    lambda_gen const lambda = lambda_gen();
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/let.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_LET_HPP
-#define PHOENIX_SCOPE_LET_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
-#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
-#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/fusion/include/transform.hpp>
-#include <boost/fusion/include/as_vector.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename Base, typename Vars, typename Map>
-    struct let_actor : Base
-    {
-        typedef typename
-            mpl::fold<
-                Vars
-              , mpl::false_
-              , detail::compute_no_nullary
-            >::type
-        no_nullary;
-        
-        template <typename Env>
-        struct result
-        {
-            typedef typename 
-                fusion::result_of::as_vector<
-                    typename fusion::result_of::transform<
-                        Vars
-                      , detail::initialize_local<Env>
-                    >::type
-                >::type 
-            locals_type;
-
-            typedef typename Base::template
-                result<scoped_environment<Env, Env, locals_type, Map> >::type
-            result_type;
-            
-            typedef typename 
-                detail::unwrap_local_reference<result_type>::type 
-            type;
-        };
-
-        let_actor(Base const& base, Vars const& vars)
-            : Base(base), vars(vars) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            typedef typename 
-                fusion::result_of::as_vector<
-                    typename fusion::result_of::transform<
-                        Vars
-                      , detail::initialize_local<Env>
-                    >::type
-                >::type 
-            locals_type;
-
-            locals_type locals = 
-                fusion::as_vector(
-                    fusion::transform(
-                        vars
-                      , detail::initialize_local<Env>(env)));
-            
-            typedef typename result<Env>::type RT;
-            return RT(Base::eval(
-                scoped_environment<Env, Env, locals_type, Map>(
-                    env
-                  , env
-                  , locals)));
-        }
-
-        Vars vars;
-    };
-    
-    template <typename Vars, typename Map>
-    struct let_actor_gen
-    {
-        template <typename Base>
-        actor<let_actor<Base, Vars, Map> > const
-        operator[](actor<Base> const& base) const
-        {
-            return let_actor<Base, Vars, Map>(base, vars);
-        }
-
-        let_actor_gen(Vars const& vars)
-            : vars(vars) {}
-
-        Vars vars;
-    };
-
-    template <typename Key>
-    struct local_variable; // forward
-    struct assign_eval; // forward
-
-    struct let_gen
-    {
-        template <typename K0, typename V0>
-        let_actor_gen<
-            fusion::vector<V0>
-          , detail::map_local_index_to_tuple<K0>
-        >
-        operator()(
-            actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
-        ) const
-        {
-            return fusion::vector<V0>(fusion::at_c<1>(a0));
-        }
-    
-        template <typename K0, typename K1, typename V0, typename V1>
-        let_actor_gen<
-            fusion::vector<V0, V1>
-          , detail::map_local_index_to_tuple<K0, K1>
-        >
-        operator()(
-            actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
-          , actor<composite<assign_eval, fusion::vector<local_variable<K1>, V1> > > const& a1
-        ) const
-        {
-            return fusion::vector<V0, V1>(fusion::at_c<1>(a0), fusion::at_c<1>(a1));
-        }
-        
-        // Bring in the rest...
-        #define PHOENIX_LOCAL_GEN_NAME let_actor_gen
-        #include <boost/spirit/home/phoenix/scope/detail/local_gen.hpp>
-        #undef PHOENIX_LOCAL_GEN_NAME
-    };
-
-    let_gen const let = let_gen();
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/local_variable.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_LOCAL_VARIABLE_HPP
-#define PHOENIX_SCOPE_LOCAL_VARIABLE_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/spirit/home/phoenix/detail/local_reference.hpp>
-#include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename Key>
-    struct local_variable
-    {
-        typedef Key key_type;
-
-        // This will prevent actor::operator()() from kicking in.
-        // Actually, we do not need all actor::operator()s for
-        // all arities, but this will suffice. The nullary 
-        // actor::operator() is particularly troublesome because 
-        // it is always eagerly evaluated by the compiler.
-        typedef mpl::true_ no_nullary; 
-
-        template <typename Env>
-        struct result : detail::apply_local<local_variable<Key>, Env> {};
-
-        template <typename Env>
-        typename result<Env>::type 
-        eval(Env const& env) const
-        {
-            typedef typename result<Env>::type return_type;
-            typedef typename 
-                detail::get_index<typename Env::map_type, Key>::type 
-            index_type;
-            typedef detail::eval_local<Key> eval_local;
-
-            return eval_local::template get<return_type>(
-                env
-              , index_type());
-        }
-
-    private:
-        // silence MSVC warning C4512: assignment operator could not be generated
-        local_variable& operator= (local_variable const&);
-    };
-
-    namespace local_names
-    {
-        actor<local_variable<struct _a_key> > const _a 
-            = local_variable<struct _a_key>();
-        actor<local_variable<struct _b_key> > const _b 
-            = local_variable<struct _b_key>();
-        actor<local_variable<struct _c_key> > const _c 
-            = local_variable<struct _c_key>();
-        actor<local_variable<struct _d_key> > const _d 
-            = local_variable<struct _d_key>();
-        actor<local_variable<struct _e_key> > const _e 
-            = local_variable<struct _e_key>();
-        actor<local_variable<struct _f_key> > const _f 
-            = local_variable<struct _f_key>();
-        actor<local_variable<struct _g_key> > const _g 
-            = local_variable<struct _g_key>();
-        actor<local_variable<struct _h_key> > const _h 
-            = local_variable<struct _h_key>();
-        actor<local_variable<struct _i_key> > const _i 
-            = local_variable<struct _i_key>();
-        actor<local_variable<struct _j_key> > const _j 
-            = local_variable<struct _j_key>();
-        actor<local_variable<struct _k_key> > const _k 
-            = local_variable<struct _k_key>();
-        actor<local_variable<struct _l_key> > const _l 
-            = local_variable<struct _l_key>();
-        actor<local_variable<struct _m_key> > const _m 
-            = local_variable<struct _m_key>();
-        actor<local_variable<struct _n_key> > const _n 
-            = local_variable<struct _n_key>();
-        actor<local_variable<struct _o_key> > const _o 
-            = local_variable<struct _o_key>();
-        actor<local_variable<struct _p_key> > const _p 
-            = local_variable<struct _p_key>();
-        actor<local_variable<struct _q_key> > const _q 
-            = local_variable<struct _q_key>();
-        actor<local_variable<struct _r_key> > const _r 
-            = local_variable<struct _r_key>();
-        actor<local_variable<struct _s_key> > const _s 
-            = local_variable<struct _s_key>();
-        actor<local_variable<struct _t_key> > const _t 
-            = local_variable<struct _t_key>();
-        actor<local_variable<struct _u_key> > const _u 
-            = local_variable<struct _u_key>();
-        actor<local_variable<struct _v_key> > const _v 
-            = local_variable<struct _v_key>();
-        actor<local_variable<struct _w_key> > const _w 
-            = local_variable<struct _w_key>();
-        actor<local_variable<struct _x_key> > const _x 
-            = local_variable<struct _x_key>();
-        actor<local_variable<struct _y_key> > const _y 
-            = local_variable<struct _y_key>();
-        actor<local_variable<struct _z_key> > const _z 
-            = local_variable<struct _z_key>();
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/scoped_environment.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2004 Daniel Wallin
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP
-#define PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP
-
-namespace boost { namespace phoenix
-{
-    template <typename Env, typename OuterEnv, typename Locals, typename Map>
-    struct scoped_environment
-    {
-        typedef Env env_type;
-        typedef OuterEnv outer_env_type;
-        typedef Locals locals_type;
-        typedef Map map_type;
-        typedef typename Env::args_type args_type;
-        typedef typename Env::tie_type tie_type;
-
-        scoped_environment(
-            Env const& env
-          , OuterEnv const& outer_env
-          , Locals& locals)
-            : env(env)
-            , outer_env(outer_env)
-            , locals(locals) {}
-
-        tie_type const& 
-        args() const
-        {
-            return env.args();
-        }
-
-        Env const& env;
-        OuterEnv const& outer_env;
-        Locals& locals;
-
-    private:
-        // silence MSVC warning C4512: assignment operator could not be generated
-        scoped_environment& operator= (scoped_environment const&);
-    };
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_HPP
-#define PHOENIX_STATEMENT_HPP
-
-#include <boost/spirit/home/phoenix/version.hpp>
-#include <boost/spirit/home/phoenix/statement/do_while.hpp>
-#include <boost/spirit/home/phoenix/statement/for.hpp>
-#include <boost/spirit/home/phoenix/statement/if.hpp>
-#include <boost/spirit/home/phoenix/statement/sequence.hpp>
-#include <boost/spirit/home/phoenix/statement/switch.hpp>
-#include <boost/spirit/home/phoenix/statement/while.hpp>
-#include <boost/spirit/home/phoenix/statement/throw.hpp>
-#include <boost/spirit/home/phoenix/statement/try_catch.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
-#define PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/mpl/void.hpp>
-
-namespace boost { namespace phoenix {
-    class catch_all_eval
-    {
-    public:
-        template<typename Env, typename TryBody, 
-                 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_CATCH_LIMIT, typename CatchBody, mpl::void_),
-                 typename CatchAllBody = mpl::void_>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<typename Rt, typename Env, typename TryBody,
-                 typename CatchAllBody>
-        static void eval(
-            const Env& env, TryBody& tryBody, CatchAllBody& catchAllBody)
-        {
-            try
-            {
-                tryBody.eval(env);
-            }
-            catch(...)
-            {
-                catchAllBody.eval(env);
-            }
-        }
-
-#define BOOST_PP_ITERATION_PARAMS_1                                                        \
-        (3, (1, PHOENIX_CATCH_LIMIT, "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-    };
-}}
-
-#endif
-
-#elif BOOST_PP_ITERATION_DEPTH() == 1
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-        template<typename Rt, typename Env, typename TryBody,
-                 BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename CatchBody),
-                 typename CatchAllBody>
-        static void eval(
-            const Env& env, TryBody& tryBody,
-            BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, CatchBody, catchBody),
-            CatchAllBody& catchAllBody)
-        {
-            try
-            {
-                tryBody.eval(env);
-            }
-
-#define BOOST_PP_ITERATION_PARAMS_2                                                                             \
-        (3, (0, BOOST_PP_DEC(PHOENIX_ITERATION), "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-            catch(...)
-            {
-                catchAllBody.eval(env);
-            }
-        }
-
-#undef PHOENIX_ITERATION
-
-#elif BOOST_PP_ITERATION_DEPTH() == 2
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-        catch(typename BOOST_PP_CAT(CatchBody, PHOENIX_ITERATION)::exception_type&)
-        {
-            BOOST_PP_CAT(catchBody, PHOENIX_ITERATION).eval(env);
-        }
-
-#undef PHOENIX_ITERATION
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_composite.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef PHOENIX_STATEMENT_DETAIL_CATCH_COMPOSITE_HPP
-#define PHOENIX_STATEMENT_DETAIL_CATCH_COMPOSITE_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix {
-namespace detail
-{
-    struct catch_composite_eval
-    {
-        template<typename Env, typename Actor>
-        struct result :
-            eval_result<typename Actor::eval_type, Env> {};
-
-        template<typename Rt, typename Env, typename Actor>
-        static typename result<Env,Actor>::type
-        eval(const Env& env, Actor& actor)
-        {
-            return actor.eval(env);
-        }
-    };
-
-    template<typename Exception, typename Actor>
-    struct catch_composite :
-        composite<catch_composite_eval, fusion::vector<Actor> >
-    {
-        catch_composite(const Actor& actor)
-            : composite<catch_composite_eval, fusion::vector<Actor> >(actor) { }
-
-        typedef Exception exception_type;
-    };
-
-    template<typename Exception, typename Actor>
-    struct as_catch_actor
-    {
-        typedef catch_composite<
-            Exception,
-            Actor> comp;
-
-        typedef actor<comp> type;
-    };
-
-    template<typename Exception, typename Actor>
-    inline typename as_catch_actor<Exception, Actor>::type
-    catch_actor(const Actor& actor)
-    {
-        return catch_composite<Exception,Actor>(actor);
-    }
-}
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/catch_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_STATEMENT_DETAIL_CATCH_EVAL_HPP
-#define PHOENIX_STATEMENT_DETAIL_CATCH_EVAL_HPP
-
-#include <boost/spirit/home/phoenix/core/limits.hpp>
-#include <boost/preprocessor/iteration/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/mpl/void.hpp>
-
-namespace boost { namespace phoenix {
-    class catch_eval
-    {
-    public:
-        template<typename Env, typename TryBody, 
-                 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_CATCH_LIMIT, typename CatchBody, mpl::void_)>
-        struct result
-        {
-            typedef void type;
-        };
-
-#define BOOST_PP_ITERATION_PARAMS_1                                                        \
-        (3, (1, PHOENIX_CATCH_LIMIT, "boost/spirit/home/phoenix/statement/detail/catch_eval.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-    };
-}}
-
-#endif
-
-#elif BOOST_PP_ITERATION_DEPTH() == 1
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-        template<typename Rt, typename Env, typename TryBody,
-                 BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename CatchBody)>
-        static void eval(
-            const Env& env, TryBody& tryBody,
-            BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, CatchBody, catchBody))
-        {
-            try
-            {
-                tryBody.eval(env);
-            }
-
-#define BOOST_PP_ITERATION_PARAMS_2                                                                         \
-        (3, (0, BOOST_PP_DEC(PHOENIX_ITERATION), "boost/spirit/home/phoenix/statement/detail/catch_eval.hpp"))
-
-#include BOOST_PP_ITERATE()
-
-        }
-
-#undef PHOENIX_ITERATION
-
-#elif BOOST_PP_ITERATION_DEPTH() == 2
-
-#define PHOENIX_ITERATION BOOST_PP_ITERATION()
-
-        catch(typename BOOST_PP_CAT(CatchBody, PHOENIX_ITERATION)::exception_type&)
-        {                                                         
-            BOOST_PP_CAT(catchBody, PHOENIX_ITERATION).eval(env);
-        }
-
-#undef PHOENIX_ITERATION
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_DETAIL_SWITCH_HPP
-#define PHOENIX_STATEMENT_DETAIL_SWITCH_HPP
-
-#include <boost/spirit/home/phoenix/core/nothing.hpp>
-#include <boost/fusion/include/vector.hpp>
-#include <boost/fusion/include/as_vector.hpp>
-#include <boost/fusion/include/push_back.hpp>
-#include <boost/fusion/include/push_front.hpp>
-#include <boost/fusion/include/begin.hpp>
-#include <boost/fusion/include/size.hpp>
-#include <boost/fusion/include/value_of.hpp>
-#include <boost/fusion/include/is_sequence.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace boost { namespace phoenix
-{
-
-    template <typename Actor, typename K, K Value>
-    struct switch_case;
-
-    template <typename Actor>
-    struct default_case;
-
-    namespace detail
-    {
-        template <typename T>
-        struct is_default_case : mpl::bool_<T::is_default> {};
-
-        template <typename A0, typename A1>
-        struct compose_case_a
-        {
-            // here, A0 and A1 are both switch cases
-            typedef typename
-                mpl::if_<
-                    is_default_case<A1>
-                  , fusion::vector<actor<A1>, actor<A0> >
-                  , fusion::vector<actor<A0>, actor<A1> >
-                >::type
-            type;
-
-            static type
-            eval(A0 const& _0, A1 const& _1, mpl::false_)
-            {
-                return type(_0, _1);
-            }
-
-            static type
-            eval(A0 const& _0, A1 const& _1, mpl::true_)
-            {
-                return type(_1, _0);
-            }
-
-            static type
-            eval(A0 const& _0, A1 const& _1)
-            {
-                return eval(_0, _1, is_default_case<A1>());
-            }
-        };
-
-        template <typename Seq, typename Case>
-        struct compose_case_b
-        {
-            typedef typename fusion::result_of::as_vector<
-                typename mpl::eval_if<
-                    is_default_case<Case>
-                  , fusion::result_of::push_front<Seq const, actor<Case> >
-                  , fusion::result_of::push_back<Seq const, actor<Case> >
-            >::type>::type
-            type;
-
-            static type
-            eval(Seq const& seq, Case const& case_, mpl::false_)
-            {
-                return fusion::as_vector(
-                    fusion::push_back(seq, actor<Case>(case_)));
-            }
-
-            static type
-            eval(Seq const& seq, Case const& case_, mpl::true_)
-            {
-                return fusion::as_vector(
-                    fusion::push_front(seq, actor<Case>(case_)));
-            }
-
-            static type
-            eval(Seq const& seq, Case const& case_)
-            {
-                return eval(seq, case_, is_default_case<Case>());
-            }
-        };
-
-        template <typename Cases>
-        struct ensure_default
-        {
-            typedef
-                is_default_case<
-                    typename fusion::result_of::value_of<
-                        typename fusion::result_of::begin<Cases>::type
-                    >::type
-                >
-            is_default_case_;
-
-            typedef typename
-                mpl::eval_if<
-                    is_default_case_
-                  , mpl::identity<Cases>
-                  , fusion::result_of::push_front<
-                        Cases const, actor<default_case<actor<null_actor> > > >
-                >::type
-            type;
-
-            static type
-            eval(Cases const& cases, mpl::false_);
-
-            static type
-            eval(Cases const& cases, mpl::true_)
-            {
-                return cases;
-            }
-
-            static type
-            eval(Cases const& cases)
-            {
-                return eval(cases, is_default_case_());
-            }
-        };
-
-        template <typename Cond, typename Cases>
-        struct switch_composite
-        {
-            BOOST_STATIC_ASSERT(fusion::traits::is_sequence<Cases>::value);
-            typedef ensure_default<Cases> ensure_default_;
-
-            typedef typename
-                fusion::result_of::as_vector<
-                    typename fusion::result_of::push_front<
-                        typename ensure_default_::type, Cond>::type
-                    >::type
-            tuple_type;
-
-            typedef
-                composite<
-                    detail::switch_eval<fusion::result_of::size<tuple_type>::value-2>
-                  , tuple_type>
-            type;
-
-            static type
-            eval(Cond const& cond, Cases const& cases)
-            {
-                return fusion::as_vector(
-                    fusion::push_front(ensure_default_::eval(cases), cond));
-            }
-        };
-
-        template <typename Cond, typename Cases>
-        struct switch_composite_actor
-        {
-            typedef actor<typename switch_composite<Cond, Cases>::type> type;
-        };
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch_eval.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_HPP
-#define PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_HPP
-
-namespace boost { namespace phoenix { namespace detail
-{
-    template <int N>
-    struct switch_eval;
-
-    template <>
-    struct switch_eval<0>
-    {
-        template <
-            typename Env, typename Cond, typename Default
-        >
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env, typename Cond, typename Default
-        >
-        static void
-        eval(
-            Env const& env, Cond& cond, Default& default_
-        )
-        {
-            default_.eval(env);
-        }
-    };
-
-    template <>
-    struct switch_eval<1>
-    {
-        template <
-            typename Env, typename Cond, typename Default
-          , typename Case0
-        >
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env, typename Cond, typename Default
-          , typename Case0
-        >
-        static void
-        eval(
-            Env const& env, Cond& cond, Default& default_
-          , Case0& _0
-        )
-        {
-            switch (cond.eval(env))
-            {
-                case Case0::value:
-                    _0.eval(env);
-                    break;
-                default:
-                    default_.eval(env);
-            }
-        }
-    };
-
-    template <>
-    struct switch_eval<2>
-    {
-        template <
-            typename Env, typename Cond, typename Default
-          , typename Case0, typename Case1
-        >
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env, typename Cond, typename Default
-          , typename Case0, typename Case1
-        >
-        static void
-        eval(
-            Env const& env, Cond& cond, Default& default_
-          , Case0& _0, Case1& _1
-        )
-        {
-            switch (cond.eval(env))
-            {
-                case Case0::value:
-                    _0.eval(env);
-                    break;
-                case Case1::value:
-                    _1.eval(env);
-                    break;
-                default:
-                    default_.eval(env);
-            }
-        }
-    };
-
-    //  Bring in the rest of the switch_evals
-    #include <boost/spirit/home/phoenix/statement/detail/switch_eval.ipp>
-}}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/detail/switch_eval.ipp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2006 Joel de Guzman
-
-    Use, modification and distribution is subject to the Boost Software
-    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-    http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef BOOST_PP_IS_ITERATING
-#ifndef PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_IPP
-#define PHOENIX_STATEMENT_DETAIL_SWITCH_EVAL_IPP
-
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/dec.hpp>
-#include <boost/preprocessor/repeat.hpp>
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#define PHOENIX_CASE_ITEM(z, n, prefix)                                         \
-    case BOOST_PP_CAT(Case, n)::value:                                          \
-        BOOST_PP_CAT(_, n).eval(env);                                           \
-        break;
-
-#define BOOST_PP_ITERATION_PARAMS_1                                             \
-    (3, (3, BOOST_PP_DEC(BOOST_PP_DEC(PHOENIX_COMPOSITE_LIMIT)),                \
-    "boost/spirit/home/phoenix/statement/detail/switch_eval.ipp"))
-#include BOOST_PP_ITERATE()
-
-#undef PHOENIX_CASE_ITEM
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-#else // defined(BOOST_PP_IS_ITERATING)
-
-#define N BOOST_PP_ITERATION()
-
-    template <>
-    struct switch_eval<N>
-    {
-        template <
-            typename Env, typename Cond, typename Default
-          , BOOST_PP_ENUM_PARAMS(N, typename Case)
-        >
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env, typename Cond, typename Default
-          , BOOST_PP_ENUM_PARAMS(N, typename Case)
-        >
-        static void
-        eval(Env const& env, Cond& cond, Default& default_
-          , BOOST_PP_ENUM_BINARY_PARAMS(N, Case, & _)
-        )
-        {
-            switch (cond.eval(env))
-            {
-                BOOST_PP_REPEAT(N, PHOENIX_CASE_ITEM, _)
-                default:
-                    default_.eval(env);
-            }
-        }
-    };
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
-
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/do_while.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_DO_WHILE_HPP
-#define PHOENIX_STATEMENT_DO_WHILE_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct do_while_eval
-    {
-        template <typename Env, typename Cond, typename Do>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename RT, typename Env, typename Cond, typename Do>
-        static void
-        eval(Env const& env, Cond& cond, Do& do_)
-        {
-            do
-                do_.eval(env);
-            while (cond.eval(env));
-        }
-    };
-
-    template <typename Do>
-    struct do_while_gen
-    {
-        do_while_gen(Do const& do_)
-            : do_(do_) {}
-
-        template <typename Cond>
-        actor<typename as_composite<do_while_eval, Cond, Do>::type>
-        while_(Cond const& cond) const
-        {
-            return compose<do_while_eval>(cond, do_);
-        }
-
-        Do do_;
-    };
-
-    struct do_gen
-    {
-        template <typename Do>
-        do_while_gen<Do>
-        operator[](Do const& do_) const
-        {
-            return do_while_gen<Do>(do_);
-        }
-    };
-
-    do_gen const do_ = do_gen();
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/for.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_FOR_HPP
-#define PHOENIX_STATEMENT_FOR_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct for_eval
-    {
-        template <
-            typename Env
-          , typename Init, typename Cond, typename Step, typename Do>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env
-          , typename Init, typename Cond, typename Step, typename Do>
-        static void
-        eval(
-            Env const& env
-          , Init& init, Cond& cond, Step& step, Do& do_)
-        {
-            for (init.eval(env); cond.eval(env); step.eval(env))
-                do_.eval(env);
-        }
-    };
-
-    template <typename Init, typename Cond, typename Step>
-    struct for_gen
-    {
-        for_gen(Init const& init, Cond const& cond, Step const& step)
-            : init(init), cond(cond), step(step) {}
-
-        template <typename Do>
-        actor<typename as_composite<for_eval, Init, Cond, Step, Do>::type>
-        operator[](Do const& do_) const
-        {
-            return compose<for_eval>(init, cond, step, do_);
-        }
-
-        Init init;
-        Cond cond;
-        Step step;
-    };
-
-    template <typename Init, typename Cond, typename Step>
-    inline for_gen<Init, Cond, Step>
-    for_(Init const& init, Cond const& cond, Step const& step)
-    {
-        return for_gen<Init, Cond, Step>(init, cond, step);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/if.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_IF_HPP
-#define PHOENIX_STATEMENT_IF_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/as_actor.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable:4355)
-#endif
-
-namespace boost { namespace phoenix
-{
-    struct if_else_eval
-    {
-        template <typename Env, typename Cond, typename Then, typename Else>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <
-            typename RT, typename Env
-          , typename Cond, typename Then, typename Else>
-        static void
-        eval(Env const& env, Cond& cond, Then& then, Else& else_)
-        {
-            if (cond.eval(env))
-                then.eval(env);
-            else
-                else_.eval(env);
-        }
-    };
-
-    struct if_eval
-    {
-        template <typename Env, typename Cond, typename Then>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename RT, typename Env, typename Cond, typename Then>
-        static void
-        eval(Env const& env, Cond& cond, Then& then)
-        {
-            if (cond.eval(env))
-                then.eval(env);
-        }
-    };
-
-    template <typename Cond, typename Then>
-    struct if_composite;
-
-    template <typename Cond, typename Then>
-    struct else_gen
-    {
-        else_gen(if_composite<Cond, Then> const& source)
-            : source(source) {}
-
-        template <typename Else>
-        actor<typename as_composite<if_else_eval, Cond, Then, Else>::type>
-        operator[](Else const& else_) const
-        {
-            return compose<if_else_eval>(
-                fusion::at_c<0>(source) // cond
-              , fusion::at_c<1>(source) // then
-              , else_ // else
-            );
-        }
-
-        if_composite<Cond, Then> const& source;
-
-    private:
-        // silence MSVC warning C4512: assignment operator could not be generated
-        else_gen& operator= (else_gen const&);
-    };
-
-    template <typename Cond, typename Then>
-    struct if_composite : composite<if_eval, fusion::vector<Cond, Then> >
-    {
-        if_composite(Cond const& cond, Then const& then)
-            : composite<if_eval, fusion::vector<Cond, Then> >(cond, then)
-            , else_(*this) {}
-
-        else_gen<Cond, Then> else_;
-
-    private:
-        // silence MSVC warning C4512: assignment operator could not be generated
-        if_composite& operator= (if_composite const&);
-    };
-
-    template <typename Cond>
-    struct if_gen
-    {
-        if_gen(Cond const& cond)
-            : cond(cond) {}
-
-        template <typename Then>
-        actor<if_composite<Cond, typename as_actor<Then>::type> >
-        operator[](Then const& then) const
-        {
-            return actor<if_composite<Cond, typename as_actor<Then>::type> >(
-                cond, as_actor<Then>::convert(then));
-        }
-
-        Cond cond;
-    };
-
-    template <typename Cond>
-    inline if_gen<typename as_actor<Cond>::type>
-    if_(Cond const& cond)
-    {
-        return if_gen<typename as_actor<Cond>::type>(
-            as_actor<Cond>::convert(cond));
-    }
-}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/sequence.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_SEQUENCE_HPP
-#define PHOENIX_STATEMENT_SEQUENCE_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct sequence_eval
-    {
-        template <typename Env, typename A0, typename A1>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename RT, typename Env, typename A0, typename A1>
-        static void
-        eval(Env const& env, A0& a0, A1& a1)
-        {
-            a0.eval(env);
-            a1.eval(env);
-        }
-    };
-    
-    namespace detail
-    {
-        template <typename BaseT0, typename BaseT1>
-        struct comma_result
-        {
-            typedef actor<
-                typename as_composite<
-                    sequence_eval
-                  , actor<BaseT0>
-                  , actor<BaseT1>
-                >::type
-            > type;
-        };
-    }
-
-    template <typename BaseT0, typename BaseT1>
-    inline typename detail::comma_result<BaseT0, BaseT1>::type
-    operator,(actor<BaseT0> const& a0, actor<BaseT1> const& a1)
-    {
-        return compose<sequence_eval>(a0, a1);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/switch.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_SWITCH_HPP
-#define PHOENIX_STATEMENT_SWITCH_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-#include <boost/spirit/home/phoenix/core/nothing.hpp>
-#include <boost/spirit/home/phoenix/statement/detail/switch_eval.hpp>
-#include <boost/spirit/home/phoenix/statement/detail/switch.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/mpl/not.hpp>
-
-namespace boost { namespace phoenix
-{
-    template <typename Derived, typename Actor>
-    struct switch_case_base 
-    {
-        typedef Derived derived_t;
-        typedef Actor actor_t;
-        typedef typename Actor::no_nullary no_nullary;
-
-        template <typename Env>
-        struct result
-        {
-            typedef typename Actor::eval_type::template result<Env>::type type;
-        };
-
-        switch_case_base(Actor const& actor)
-            : actor(actor) {}
-
-        template <typename Env>
-        typename result<Env>::type
-        eval(Env const& env) const
-        {
-            return actor.eval(env);
-        }
-
-        Actor actor;
-    };
-
-    template <typename Actor, typename K, K Value>
-    struct switch_case : switch_case_base<switch_case<Actor, K, Value>, Actor>
-    {
-        typedef switch_case_base<switch_case<Actor, K, Value>, Actor> base_t;
-        static K const value = Value;
-        static bool const is_default = false;
-
-        switch_case(Actor const& actor)
-            : base_t(actor) {}
-    };
-
-    template <typename Actor>
-    struct default_case : switch_case_base<default_case<Actor>, Actor>
-    {
-        typedef switch_case_base<default_case<Actor>, Actor> base_t;
-        static bool const is_default = true;
-
-        default_case(Actor const& actor)
-            : base_t(actor) {}
-    };
-
-    template <typename Cond>
-    struct switch_gen
-    {
-        switch_gen(Cond const& cond)
-            : cond(cond) {}
-
-        template <typename Cases>
-        typename lazy_enable_if<
-            fusion::traits::is_sequence<Cases>
-          , detail::switch_composite_actor<Cond, Cases>
-        >::type
-        operator[](Cases const& cases) const
-        {
-            typedef typename
-                detail::switch_composite<Cond, Cases>
-            switch_composite;
-            return switch_composite::eval(cond, cases);
-        }
-
-        template <typename D, typename A>
-        actor<typename detail::
-            switch_composite<Cond, fusion::vector<actor<D> > >::type>
-        operator[](switch_case_base<D, A> const& case_) const
-        {
-            typedef typename
-                detail::switch_composite<Cond, fusion::vector<actor<D> > >
-            switch_composite;
-            return switch_composite::eval(cond,
-                fusion::vector<actor<D> >(static_cast<D const&>(case_)));
-        }
-
-        Cond cond;
-    };
-
-    template <typename Cond>
-    inline switch_gen<typename as_actor<Cond>::type>
-    switch_(Cond const& cond)
-    {
-        return switch_gen<typename as_actor<Cond>::type>(
-            as_actor<Cond>::convert(cond));
-    }
-
-    template <int N, typename A0>
-    switch_case<typename as_actor<A0>::type, int, N>
-    case_(A0 const& _0)
-    {
-        return switch_case<typename as_actor<A0>::type, int, N>
-            (as_actor<A0>::convert(_0));
-    }
-
-    template <typename A0>
-    default_case<typename as_actor<A0>::type>
-    default_(A0 const& _0)
-    {
-        return default_case<typename as_actor<A0>::type>
-            (as_actor<A0>::convert(_0));
-    }
-
-    template <typename D0, typename A0, typename D1, typename A1>
-    inline typename detail::compose_case_a<D0, D1>::type
-    operator,(
-        switch_case_base<D0, A0> const& _0
-      , switch_case_base<D1, A1> const& _1
-    )
-    {
-        return detail::compose_case_a<D0, D1>::eval(
-            static_cast<D0 const&>(_0)
-          , static_cast<D1 const&>(_1)
-        );
-    }
-
-    template <typename Seq, typename D, typename A>
-    inline typename
-        lazy_enable_if<
-            fusion::traits::is_sequence<Seq>
-          , detail::compose_case_b<Seq, D>
-        >::type
-    operator,(Seq const& seq, switch_case_base<D, A> const& case_)
-    {
-        return detail::compose_case_b<Seq, D>::eval(
-            seq, static_cast<D const&>(case_));
-    }
-
-    // Implementation of routines in detail/switch.hpp that depend on
-    // the completeness of default_case.
-    namespace detail {
-        template <typename Cases>
-        typename ensure_default<Cases>::type
-        ensure_default<Cases>::eval(Cases const& cases, mpl::false_)
-        {
-            actor<default_case<actor<null_actor> > > default_
-              = default_case<actor<null_actor> >(nothing);
-            return fusion::push_front(cases, default_);
-        }
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/throw.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef PHOENIX_STATEMENT_THROW_HPP
-#define PHOENIX_STATEMENT_THROW_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace phoenix {
-
-    struct throw_new_eval
-    {
-        template<typename Env, typename ThrowExpr>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<typename Rt, typename Env, typename ThrowExpr>
-        static void 
-        eval(const Env& env, ThrowExpr& throwExpr)
-        {
-            throw throwExpr.eval(env);
-        }
-    };
-
-    struct throw_again_eval
-    {
-        typedef mpl::false_ no_nullary;
-
-        template<typename Env>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<typename Env>
-        void eval(const Env&) const
-        {
-            throw;
-        }
-    };
-
-    inline actor<throw_again_eval> throw_()
-    {
-        return throw_again_eval();
-    }
-
-    template<typename Actor>
-    actor<typename as_composite<throw_new_eval, Actor>::type>
-    throw_(const Actor& a)
-    {
-        return compose<throw_new_eval>(a);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/try_catch.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2007 Dan Marsden
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-
-#ifndef PHOENIX_STATEMENT_TRY_CATCH_HPP
-#define PHOENIX_STATEMENT_TRY_CATCH_HPP
-
-#include <boost/spirit/home/phoenix/core/actor.hpp>
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-
-#include <boost/fusion/include/push_back.hpp>
-#include <boost/fusion/include/as_vector.hpp>
-
-#include <boost/spirit/home/phoenix/statement/detail/catch_composite.hpp>
-#include <boost/spirit/home/phoenix/statement/detail/catch_eval.hpp>
-#include <boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp>
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable:4355)
-#endif
-
-namespace boost { namespace phoenix {
-
-    template<typename Tuple> struct try_catch_composite;
-
-    namespace meta
-    {
-        template<typename Composite, typename Actor>
-        struct try_catch_composite_push_back
-        {
-            typedef typename Composite::base_type actor_tuple;
-            typedef try_catch_composite<
-                typename fusion::result_of::as_vector<
-                typename fusion::result_of::push_back<
-                actor_tuple, Actor>::type>::type> type;
-        };
-
-        template<typename Composite, typename Actor>
-        struct catch_all_composite_push_back
-        {
-            typedef typename Composite::base_type actor_tuple;
-
-            typedef composite<
-                catch_all_eval,
-                typename fusion::result_of::as_vector<
-                typename fusion::result_of::push_back<
-                actor_tuple, Actor>::type>::type> type;
-        };
-    }
-
-    namespace detail
-    {
-        struct try_catch_composite_push_back
-        {
-            template<typename Composite, typename Actor>
-            struct result
-                : meta::try_catch_composite_push_back<Composite, Actor>
-            {};
-
-            template<typename Composite, typename Actor>
-            typename result<Composite, Actor>::type
-            operator()(
-                const Composite& composite, const Actor& actor) const
-            {
-                typedef typename result<Composite, Actor>::type result;
-                return result(
-                    fusion::as_vector(
-                        fusion::push_back(composite, actor)));
-            }
-        };
-
-        struct catch_all_composite_push_back
-        {
-            template<typename Composite, typename Actor>
-            struct result
-                : meta::catch_all_composite_push_back<Composite, Actor>
-            {};
-
-            template<typename Composite, typename Actor>
-            typename result<Composite, Actor>::type
-            operator()(
-                const Composite& composite, const Actor& actor) const
-            {
-                typedef typename result<Composite, Actor>::type result;
-                return result(
-                    fusion::as_vector(
-                        fusion::push_back(composite, actor)));
-            }
-        };
-
-    }
-
-    detail::try_catch_composite_push_back const try_catch_composite_push_back
-        = detail::try_catch_composite_push_back();
-    detail::catch_all_composite_push_back const catch_all_composite_push_back
-        = detail::catch_all_composite_push_back();
-
-    template<typename Exception, typename SourceComposite>
-    struct catch_gen
-    {
-        explicit catch_gen(
-            const SourceComposite& sourceComposite)
-            : mSourceComposite(sourceComposite) { }
-
-        template<typename Actor>
-        actor<typename meta::try_catch_composite_push_back<
-            SourceComposite,
-            detail::catch_composite<Exception, Actor> >::type>
-        operator[](const Actor& actor) const
-        {
-            return try_catch_composite_push_back(
-                mSourceComposite, detail::catch_composite<Exception, Actor>(actor));
-        }
-
-        const SourceComposite& mSourceComposite;
-    };
-
-    template<typename SourceComposite>
-    struct catch_all_gen
-    {
-        explicit catch_all_gen(
-            const SourceComposite& sourceComposite)
-            : mSourceComposite(sourceComposite) { }
-
-        template<typename Actor>
-        actor<typename meta::catch_all_composite_push_back<SourceComposite, Actor>::type>
-        operator[](const Actor& actor) const
-        {
-            return catch_all_composite_push_back(
-                mSourceComposite, actor);
-        }
-
-        const SourceComposite& mSourceComposite;
-    };
-
-    template<typename Tuple>
-    struct try_catch_composite
-        : composite<catch_eval, Tuple>
-    {
-        explicit try_catch_composite(
-            const Tuple& t)
-            :
-            composite<catch_eval, Tuple>(t),
-            catch_all(*this) { }
-
-        try_catch_composite(
-            const try_catch_composite& rhs)
-            : composite<catch_eval, Tuple>(rhs),
-              catch_all(*this) { }
-
-        template<typename Exception>
-        catch_gen<Exception, try_catch_composite> catch_() const
-        {
-            return catch_gen<Exception, try_catch_composite>(
-                *this);
-        }
-
-        const catch_all_gen<try_catch_composite> catch_all;
-
-    private:
-        try_catch_composite& operator=(const try_catch_composite&);
-    };
-
-    struct try_gen
-    {
-        template<typename Try>
-        try_catch_composite<fusion::vector<Try> > operator[](
-            const Try& try_) const
-        {
-            typedef fusion::vector<Try> tuple_type;
-            return try_catch_composite<tuple_type>(
-                tuple_type(try_));
-        }
-    };
-
-    try_gen const try_ = try_gen();
-}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/statement/while.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STATEMENT_WHILE_HPP
-#define PHOENIX_STATEMENT_WHILE_HPP
-
-#include <boost/spirit/home/phoenix/core/composite.hpp>
-#include <boost/spirit/home/phoenix/core/compose.hpp>
-
-namespace boost { namespace phoenix
-{
-    struct while_eval
-    {
-        template <typename Env, typename Cond, typename Do>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename RT, typename Env, typename Cond, typename Do>
-        static void
-        eval(Env const& env, Cond& cond, Do& do_)
-        {
-            while (cond.eval(env))
-                do_.eval(env);
-        }
-    };
-
-    template <typename Cond>
-    struct while_gen
-    {
-        while_gen(Cond const& cond)
-            : cond(cond) {}
-
-        template <typename Do>
-        actor<typename as_composite<while_eval, Cond, Do>::type>
-        operator[](Do const& do_) const
-        {
-            return compose<while_eval>(cond, do_);
-        }
-
-        Cond cond;
-    };
-
-    template <typename Cond>
-    inline while_gen<Cond>
-    while_(Cond const& cond)
-    {
-        return while_gen<Cond>(cond);
-    }
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2006 Daniel Wallin
-    Copyright (c) 2005 Dan Marsden
-    Copyright (c) 2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STL_HPP
-#define PHOENIX_STL_HPP
-
-#include <boost/spirit/home/phoenix/stl/algorithm.hpp>
-#include <boost/spirit/home/phoenix/stl/container.hpp>
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2004 Angus Leeming
-    Copyright (c) 2006 Daniel Wallin
-    Copyright (c) 2005 Dan Marsden
-    Copyright (c) 2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STL_ALGORITHM_HPP
-#define PHOENIX_STL_ALGORITHM_HPP
-
-#include <boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>
-
-#endif // PHOENIX_STL_ALGORITHM_HPP
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
-#define PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
-
-#include <boost/range/result_iterator.hpp>
-#include <boost/range/begin.hpp>
-
-namespace boost { namespace phoenix {
-namespace detail
-{
-  template<class R>
-  typename range_result_iterator<R>::type
-  begin_(R& r)
-  {
-      return boost::begin(r);
-  }
-}
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
-#define PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
-
-namespace boost { namespace phoenix {
-namespace detail
-{
-  template<typename T>
-  struct decay_array
-  {
-      typedef T type;
-  };
-
-  template<typename T, int N>
-  struct decay_array<T[N]>
-  {
-      typedef T* type;
-  };
-}
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_DETAIL_END_HPP
-#define PHOENIX_ALGORITHM_DETAIL_END_HPP
-
-#include <boost/range/result_iterator.hpp>
-#include <boost/range/end.hpp>
-
-namespace boost { namespace phoenix {
-namespace detail
-{ 
-  template<class R>
-  typename range_result_iterator<R>::type
-  end_(R& r)
-  {
-      return boost::end(r);
-  }
-}
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_equal_range.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_EQUAL_RANGE_EN_14_12_2004
-#define HAS_EQUAL_RANGE_EN_14_12_2004
-
-#include <boost/mpl/or.hpp>
-#include "./is_std_map.hpp"
-#include "./is_std_set.hpp"
-#include "./is_std_hash_map.hpp"
-#include "./is_std_hash_set.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_equal_range
-        : boost::mpl::or_<
-            boost::mpl::or_<
-                is_std_map<T>
-              , is_std_multimap<T>
-              , is_std_set<T>
-              , is_std_multiset<T>
-            >
-          , boost::mpl::or_<
-                is_std_hash_map<T>
-              , is_std_hash_multimap<T>
-              , is_std_hash_set<T>
-              , is_std_hash_multiset<T>
-          >
-        >
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_find.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_FIND_EN_14_12_2004
-#define HAS_FIND_EN_14_12_2004
-
-#include <boost/mpl/or.hpp>
-#include "./is_std_map.hpp"
-#include "./is_std_set.hpp"
-#include "./is_std_hash_map.hpp"
-#include "./is_std_hash_set.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_find
-        : boost::mpl::or_<
-            boost::mpl::or_<
-                is_std_map<T>
-              , is_std_multimap<T>
-              , is_std_set<T>
-              , is_std_multiset<T>
-            >
-          , boost::mpl::or_<
-                is_std_hash_map<T>
-              , is_std_hash_multimap<T>
-              , is_std_hash_set<T>
-              , is_std_hash_multiset<T>
-          >
-        >
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_lower_bound.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_LOWER_BOUND_EN_14_12_2004
-#define HAS_LOWER_BOUND_EN_14_12_2004
-
-#include <boost/mpl/or.hpp>
-#include "./is_std_map.hpp"
-#include "./is_std_set.hpp"
-#include "./is_std_hash_map.hpp"
-#include "./is_std_hash_set.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_lower_bound
-        : boost::mpl::or_<
-            boost::mpl::or_<
-                is_std_map<T>
-              , is_std_multimap<T>
-              , is_std_set<T>
-              , is_std_multiset<T>
-            >
-          , boost::mpl::or_<
-                is_std_hash_map<T>
-              , is_std_hash_multimap<T>
-              , is_std_hash_set<T>
-              , is_std_hash_multiset<T>
-          >
-        >
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_remove.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_REMOVE_EN_14_12_2004
-#define HAS_REMOVE_EN_14_12_2004
-
-#include "./is_std_list.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_remove
-        : is_std_list<T>
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_remove_if.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_REMOVE_IF_EN_14_12_2004
-#define HAS_REMOVE_IF_EN_14_12_2004
-
-#include "./is_std_list.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_remove_if
-        : is_std_list<T>
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_reverse.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_REVERSE_EN_14_12_2004
-#define HAS_REVERSE_EN_14_12_2004
-
-#include "./is_std_list.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_reverse
-        : is_std_list<T>
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_sort.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_SORT_EN_14_12_2004
-#define HAS_SORT_EN_14_12_2004
-
-#include "./is_std_list.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_sort
-        : is_std_list<T>
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_unique.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_UNIQUE_EN_14_12_2004
-#define HAS_UNIQUE_EN_14_12_2004
-
-#include "./is_std_list.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_unique
-        : is_std_list<T>
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// has_upper_bound.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-#pragma once
-#endif
-
-#ifndef HAS_UPPER_BOUND_EN_14_12_2004
-#define HAS_UPPER_BOUND_EN_14_12_2004
-
-#include <boost/mpl/or.hpp>
-#include "./is_std_map.hpp"
-#include "./is_std_set.hpp"
-#include "./is_std_hash_map.hpp"
-#include "./is_std_hash_set.hpp"
-
-namespace boost
-{
-    // Specialize this for user-defined types
-    template<typename T>
-    struct has_upper_bound
-        : boost::mpl::or_<
-            boost::mpl::or_<
-                is_std_map<T>
-              , is_std_multimap<T>
-              , is_std_set<T>
-              , is_std_multiset<T>
-            >
-          , boost::mpl::or_<
-                is_std_hash_map<T>
-              , is_std_hash_multimap<T>
-              , is_std_hash_set<T>
-              , is_std_hash_multiset<T>
-          >
-        >
-    {
-    };
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_map.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// is_std_hash_map.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef IS_STD_HASH_MAP_EN_16_12_2004
-#define IS_STD_HASH_MAP_EN_16_12_2004
-
-#include <boost/mpl/bool.hpp>
-#include "./std_hash_map_fwd.hpp"
-
-namespace boost
-{
-    template<class T>
-    struct is_std_hash_map
-        : boost::mpl::false_
-    {};
-
-    template<class T>
-    struct is_std_hash_multimap
-        : boost::mpl::false_
-    {};
-
-#ifdef BOOST_HAS_HASH
-
-    template<
-        class Kty
-      , class Ty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    struct is_std_hash_map< ::BOOST_STD_EXTENSION_NAMESPACE::hash_map<Kty,Ty,Hash,Cmp,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<
-        class Kty
-      , class Ty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    struct is_std_hash_multimap< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<Kty,Ty,Hash,Cmp,Alloc> >
-        : boost::mpl::true_
-    {};
-
-#elif defined(BOOST_DINKUMWARE_STDLIB)
-
-    template<
-        class Kty
-      , class Ty
-      , class Tr
-      , class Alloc
-    >
-    struct is_std_hash_map< ::BOOST_STD_EXTENSION_NAMESPACE::hash_map<Kty,Ty,Tr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<
-        class Kty
-      , class Ty
-      , class Tr
-      , class Alloc
-    >
-    struct is_std_hash_multimap< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<Kty,Ty,Tr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-#endif
-
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_hash_set.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// is_std_hash_set.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef IS_STD_HASH_SET_EN_16_12_2004
-#define IS_STD_HASH_SET_EN_16_12_2004
-
-#include <boost/mpl/bool.hpp>
-#include "./std_hash_set_fwd.hpp"
-
-namespace boost
-{
-    template<class T>
-    struct is_std_hash_set
-        : boost::mpl::false_
-    {};
-
-    template<class T>
-    struct is_std_hash_multiset
-        : boost::mpl::false_
-    {};
-
-#if defined(BOOST_HAS_HASH)
-
-    template<
-        class Kty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    struct is_std_hash_set< ::BOOST_STD_EXTENSION_NAMESPACE::hash_set<Kty,Hash,Cmp,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<
-        class Kty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    struct is_std_hash_multiset< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<Kty,Hash,Cmp,Alloc> >
-        : boost::mpl::true_
-    {};
-
-#elif defined(BOOST_DINKUMWARE_STDLIB)
-
-    template<
-        class Kty
-      , class Tr
-      , class Alloc
-    >
-    struct is_std_hash_set< ::BOOST_STD_EXTENSION_NAMESPACE::hash_set<Kty,Tr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<
-        class Kty
-      , class Tr
-      , class Alloc
-    >
-    struct is_std_hash_multiset< ::BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<Kty,Tr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-#endif
-
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// is_std_list.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef IS_STD_LIST_EN_16_12_2004
-#define IS_STD_LIST_EN_16_12_2004
-
-#include <boost/mpl/bool.hpp>
-#include <boost/detail/container_fwd.hpp>
-
-namespace boost
-{
-    template<class T>
-    struct is_std_list
-        : boost::mpl::false_
-    {};
-
-    template<
-        class Ty
-      , class Alloc
-    >
-    struct is_std_list< ::std::list<Ty,Alloc> >
-        : boost::mpl::true_
-    {};
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// is_std_map.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef IS_STD_MAP_EN_16_12_2004
-#define IS_STD_MAP_EN_16_12_2004
-
-#include <boost/mpl/bool.hpp>
-#include <boost/detail/container_fwd.hpp>
-
-namespace boost
-{
-    template<class T>
-    struct is_std_map
-        : boost::mpl::false_
-    {};
-
-    template<
-        class Kty
-      , class Ty
-      , class Pr
-      , class Alloc
-    >
-    struct is_std_map< ::std::map<Kty,Ty,Pr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<class T>
-    struct is_std_multimap
-        : boost::mpl::false_
-    {};
-
-    template<
-        class Kty
-      , class Ty
-      , class Pr
-      , class Alloc
-    >
-    struct is_std_multimap< ::std::multimap<Kty,Ty,Pr,Alloc> >
-        : boost::mpl::true_
-    {};
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// is_std_set.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef IS_STD_SET_EN_16_12_2004
-#define IS_STD_SET_EN_16_12_2004
-
-#include <boost/mpl/bool.hpp>
-#include <boost/detail/container_fwd.hpp>
-
-namespace boost
-{
-    template<class T>
-    struct is_std_set
-        : boost::mpl::false_
-    {};
-
-    template<
-        class Kty
-      , class Pr
-      , class Alloc
-    >
-    struct is_std_set< ::std::set<Kty,Pr,Alloc> >
-        : boost::mpl::true_
-    {};
-
-    template<class T>
-    struct is_std_multiset
-        : boost::mpl::false_
-    {};
-
-    template<
-        class Kty
-      , class Pr
-      , class Alloc
-    >
-    struct is_std_multiset< ::std::multiset<Kty,Pr,Alloc> >
-        : boost::mpl::true_
-    {};
-}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_map_fwd.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// std_hash_map_fwd.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef STD_HASH_MAP_FWD_EN_16_12_2004
-#define STD_HASH_MAP_FWD_EN_16_12_2004
-
-#include <boost/config.hpp>
-
-#if defined(BOOST_HAS_HASH)
-
-namespace BOOST_STD_EXTENSION_NAMESPACE
-{
-    template<
-        class Kty
-      , class Ty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    class hash_map;
-
-    template<
-        class Kty
-      , class Ty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    class hash_multimap;
-}
-
-#elif defined(BOOST_DINKUMWARE_STDLIB)
-
-namespace BOOST_STD_EXTENSION_NAMESPACE
-{
-    template<
-        class Kty
-      , class Ty
-      , class Tr
-      , class Alloc
-    >
-    class hash_map;
-
-    template<
-        class Kty
-      , class Ty
-      , class Tr
-      , class Alloc
-    >
-    class hash_multimap;
-}
-
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/detail/std_hash_set_fwd.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-// Copyright 2005 Daniel Wallin.
-// Copyright 2005 Joel de Guzman.
-//
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-///////////////////////////////////////////////////////////////////////////////
-//
-// std_hash_set_fwd.hpp
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(_MSC_VER) && _MSC_VER >= 1000
-# pragma once
-#endif
-
-#ifndef STD_HASH_SET_FWD_EN_16_12_2004
-#define STD_HASH_SET_FWD_EN_16_12_2004
-
-#include <boost/config.hpp>
-
-#if defined(BOOST_HAS_HASH)
-
-namespace BOOST_STD_EXTENSION_NAMESPACE
-{
-    template<
-        class Kty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    class hash_set;
-
-    template<
-        class Kty
-      , class Hash
-      , class Cmp
-      , class Alloc
-    >
-    class hash_multiset;
-}
-
-#elif defined(BOOST_DINKUMWARE_STDLIB)
-
-namespace BOOST_STD_EXTENSION_NAMESPACE
-{
-    template<
-        class Kty
-      , class Tr
-      , class Alloc
-    >
-    class hash_set;
-
-    template<
-        class Kty
-      , class Tr
-      , class Alloc
-    >
-    class hash_multiset;
-}
-
-#endif
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/iteration.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-// Copyright 2005 Dan Marsden. 
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_ITERATION_HPP
-#define PHOENIX_ALGORITHM_ITERATION_HPP
-
-#include <algorithm>
-#include <numeric>
-
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
-
-#include <boost/spirit/home/phoenix/function/function.hpp>
-
-namespace boost { namespace phoenix {
-namespace impl
-{
-    struct for_each
-    {
-        template<class R, class F>
-        struct result
-        {
-            typedef F type;
-        };
-
-        template<class R, class F>
-        F operator()(R& r, F fn) const
-        {        
-            return std::for_each(detail::begin_(r), detail::end_(r), fn);
-        }
-    };
-
-    struct accumulate
-    {
-        template<class R, class I, class C = void>
-        struct result
-        {
-            typedef I type;
-        };
-
-        template<class R, class I>
-        typename result<R,I>::type
-        operator()(R& r, I i) const
-        {
-            return std::accumulate(detail::begin_(r), detail::end_(r), i);
-        }
-
-        template<class R, class I, class C>
-        typename result<R,I,C>::type
-        operator()(R& r, I i, C c) const
-        {
-            return std::accumulate(detail::begin_(r), detail::end_(r), i, c);
-        }
-    };
-}
-
-function<impl::for_each> const for_each = impl::for_each();
-function<impl::accumulate> const accumulate = impl::accumulate();
-
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/querying.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,502 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-// Copyright 2005 Dan Marsden. 
-// Copyright 2008 Hartmut Kaiser. 
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_QUERYING_HPP
-#define PHOENIX_ALGORITHM_QUERYING_HPP
-
-#include <algorithm>
-
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp>
-
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>
-
-#include <boost/spirit/home/phoenix/function/function.hpp>
-
-#include <boost/range/result_iterator.hpp>
-#include <boost/range/difference_type.hpp>
-
-namespace boost { namespace phoenix {
-namespace impl
-{
-    struct find
-    {
-        template<class R, class T>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& x, mpl::true_) const
-        {
-            return r.find(x);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& x, mpl::false_) const
-        {
-            return std::find(detail::begin_(r), detail::end_(r), x);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& x) const
-        {
-            return execute(r, x, has_find<R>());
-        }
-    };
-
-    struct find_if
-    {
-        template<class R, class P>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::find_if(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct find_end
-    {
-        template<class R, class R2, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class R2>
-        typename result<R, R2>::type operator()(R& r, R2& r2) const
-        {
-            return std::find_end(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                );
-        }
-
-        template<class R, class R2, class P>
-        typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
-        {
-            return std::find_end(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                , p
-                );
-        }
-    };
-
-    struct find_first_of
-    {
-        template<class R, class R2, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class R2>
-        typename result<R, R2>::type operator()(R& r, R2& r2) const
-        {
-            return std::find_first_of(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                );
-        }
-
-        template<class R, class R2, class P>
-        typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
-        {
-            return std::find_first_of(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                , p
-                );
-        }
-    };
-
-    struct adjacent_find
-    {
-        template<class R, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R>
-        typename result<R>::type operator()(R& r) const
-        {
-            return std::adjacent_find(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::adjacent_find(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct count
-    {
-        template<class R, class T>
-        struct result : range_difference<R>
-        {};
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& x) const
-        {
-            return std::count(detail::begin_(r), detail::end_(r), x);
-        }
-    };
-
-    struct count_if
-    {
-        template<class R, class P>
-        struct result : range_difference<R>
-        {};
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::count_if(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct distance
-    {
-        template<class R>
-        struct result : range_difference<R>
-        {};
-
-        template<class R>
-        typename result<R>::type operator()(R& r) const
-        {
-            return std::distance(detail::begin_(r), detail::end_(r));
-        }
-    };
-
-    struct equal
-    {
-        template<class R, class I, class P = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R, class I>
-        bool operator()(R& r, I i) const
-        {
-            return std::equal(detail::begin_(r), detail::end_(r), i);
-        }
-
-        template<class R, class I, class P>
-        bool operator()(R& r, I i, P p) const
-        {
-            return std::equal(detail::begin_(r), detail::end_(r), i, p);
-        }
-    };
-
-    struct search
-    {
-        template<class R, class R2, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class R2>
-        typename result<R, R2>::type operator()(R& r, R2& r2) const
-        {
-            return std::search(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                );
-        }
-
-        template<class R, class R2, class P>
-        typename result<R, R2, P>::type operator()(R& r, R2& r2, P p) const
-        {
-            return std::search(
-                detail::begin_(r)
-                , detail::end_(r)
-                , detail::begin_(r2)
-                , detail::end_(r2)
-                , p
-                );
-        }
-    };
-
-    struct lower_bound 
-    {
-        template<class R, class T, class C = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
-        {
-            return r.lower_bound(val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
-        {
-            return std::lower_bound(detail::begin_(r), detail::end_(r), val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& val) const
-        {
-            return execute(r, val, has_lower_bound<R>());
-        }
-
-        template<class R, class T, class C>
-        typename result<R, T>::type operator()(R& r, T const& val, C c) const
-        {
-            return std::lower_bound(detail::begin_(r), detail::end_(r), val, c);
-        }
-    };
-
-    struct upper_bound 
-    {
-        template<class R, class T, class C = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
-        {
-            return r.upper_bound(val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
-        {
-            return std::upper_bound(detail::begin_(r), detail::end_(r), val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& val) const
-        {
-            return execute(r, val, has_upper_bound<R>());
-        }
-
-        template<class R, class T, class C>
-        typename result<R, T>::type operator()(R& r, T const& val, C c) const
-        {
-            return std::upper_bound(detail::begin_(r), detail::end_(r), val, c);
-        }
-    };
-
-    struct equal_range 
-    {
-        template<class R, class T, class C = void>
-        struct result
-        {
-            typedef std::pair<
-                typename range_result_iterator<R>::type
-                , typename range_result_iterator<R>::type
-            > type;
-        };
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::true_) const
-        {
-            return r.equal_range(val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& val, mpl::false_) const
-        {
-            return std::equal_range(detail::begin_(r), detail::end_(r), val);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& val) const
-        {
-            return execute(r, val, has_equal_range<R>());
-        }
-
-        template<class R, class T, class C>
-        typename result<R, T>::type operator()(R& r, T const& val, C c) const
-        {
-            return std::equal_range(detail::begin_(r), detail::end_(r), val, c);
-        }
-    };
-
-    struct mismatch
-    {
-        template<class R, class I, class P = void>
-        struct result
-        {
-            typedef std::pair<
-                typename range_result_iterator<R>::type
-                , typename detail::decay_array<I>::type
-            > type;
-        };
-
-        template<class R, class I>
-        typename result<R, I>::type operator()(R& r, I i) const
-        {
-            return std::mismatch(detail::begin_(r), detail::end_(r), i);
-        }
-
-        template<class R, class I, class P>
-        typename result<R, I, P>::type operator()(R& r, I i, P p) const
-        {
-            return std::mismatch(detail::begin_(r), detail::end_(r), i, p);
-        }
-    };
-
-    struct binary_search 
-    {
-        template<class R, class T, class C = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R, class T>
-        bool operator()(R& r, T const& val) const
-        {
-            return std::binary_search(detail::begin_(r), detail::end_(r), val);
-        }
-
-        template<class R, class T, class C>
-        bool operator()(R& r, T const& val, C c) const
-        {
-            return std::binary_search(detail::begin_(r), detail::end_(r), val, c);
-        }
-    };
-
-    struct includes 
-    {
-        template<class R1, class R2, class C = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R1, class R2>
-        bool operator()(R1& r1, R2& r2) const
-        {
-            return std::includes(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                );
-        }
-
-        template<class R1, class R2, class C>
-        bool operator()(R1& r1, R2& r2, C c) const
-        {
-            return std::includes(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , c
-                );
-        }
-    };
-
-    struct min_element
-    {
-        template<class R, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R>
-        typename result<R>::type operator()(R& r) const
-        {
-            return std::min_element(detail::begin_(r), detail::end_(r));
-        }
-    
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::min_element(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct max_element
-    {
-        template<class R, class P = void>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R>
-        typename result<R>::type operator()(R& r) const
-        {
-            return std::max_element(detail::begin_(r), detail::end_(r));
-        }
-    
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::max_element(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct lexicographical_compare
-    {
-        template<class R1, class R2, class P = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R1, class R2>
-        typename result<R1, R2>::type operator()(R1& r1, R2& r2) const
-        {
-            return std::lexicographical_compare(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                );
-        }
-    
-        template<class R1, class R2, class P>
-        typename result<R1, R2>::type operator()(R1& r1, R2& r2, P p) const
-        {
-            return std::lexicographical_compare(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , p
-                );
-        }
-    };
-
-}
-
-function<impl::find> const find = impl::find();
-function<impl::find_if> const find_if = impl::find_if();
-function<impl::find_end> const find_end = impl::find_end();
-function<impl::find_first_of> const find_first_of = impl::find_first_of();
-function<impl::adjacent_find> const adjacent_find = impl::adjacent_find();
-function<impl::count> const count = impl::count();
-function<impl::count_if> const count_if = impl::count_if();
-function<impl::distance> const distance = impl::distance();
-function<impl::equal> const equal = impl::equal();
-function<impl::search> const search = impl::search();
-function<impl::lower_bound> const lower_bound = impl::lower_bound();
-function<impl::upper_bound> const upper_bound = impl::upper_bound();
-function<impl::equal_range> const equal_range = impl::equal_range();
-function<impl::mismatch> const mismatch = impl::mismatch();
-function<impl::binary_search> const binary_search = impl::binary_search();
-function<impl::includes> const includes = impl::includes();
-function<impl::min_element> const min_element = impl::min_element();
-function<impl::max_element> const max_element = impl::max_element();
-function<impl::lexicographical_compare> const lexicographical_compare = impl::lexicographical_compare();
-
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/algorithm/transformation.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1071 +0,0 @@
-// Copyright 2005 Daniel Wallin. 
-// Copyright 2005 Joel de Guzman.
-// Copyright 2005 Dan Marsden. 
-//
-// Use, modification and distribution is subject to the Boost Software 
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// Modeled after range_ex, Copyright 2004 Eric Niebler
-
-#ifndef PHOENIX_ALGORITHM_TRANSFORMATION_HPP
-#define PHOENIX_ALGORITHM_TRANSFORMATION_HPP
-
-#include <algorithm>
-#include <numeric>
-
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp>
-
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>
-#include <boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>
-
-#include <boost/spirit/home/phoenix/function/function.hpp>
-
-#include <boost/range/result_iterator.hpp>
-#include <boost/range/difference_type.hpp>
-
-#include <boost/mpl/if.hpp>
-
-#include <boost/type_traits/is_void.hpp>
-
-namespace boost { namespace phoenix { namespace impl
-{
-    struct swap
-    {
-        template <class A, class B>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <class A, class B>
-        void operator()(A& a, B& b) const
-        {
-            using std::swap;
-            swap(a, b);
-        }
-    };
-
-    struct copy
-    {
-        template<class R, class I>
-        struct result
-            : detail::decay_array<I>
-        {};
-
-        template<class R, class I>
-        typename result<R,I>::type
-        operator()(R& r, I i) const
-        {
-            return std::copy(detail::begin_(r), detail::end_(r), i);
-        }
-    };
-
-    struct copy_backward
-    {
-        template<class R, class I>
-        struct result
-        {
-            typedef I type;
-        };
-
-        template<class R, class I>
-        I operator()(R& r, I i) const
-        {
-            return std::copy_backward(detail::begin_(r), detail::end_(r), i);
-        }
-    };
-
-    struct transform
-    {
-        template<class R, class OutorI1, class ForOut, class BinF = void>
-        struct result
-            : detail::decay_array<
-            typename mpl::if_<is_void<BinF>, OutorI1, ForOut>::type>
-        {
-        };
-
-        template<class R, class O, class F>
-        typename result<R,O,F>::type
-        operator()(R& r, O o, F f) const
-        {
-            return std::transform(detail::begin_(r), detail::end_(r), o, f);
-        }
-
-        template<class R, class I, class O, class F>
-        typename result<R,I,O,F>::type
-        operator()(R& r, I i, O o, F f) const
-        {
-            return std::transform(detail::begin_(r), detail::end_(r), i, o, f);
-        }
-    };
-
-    struct replace
-    {
-        template<class R, class T, class T2>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class T>
-        void operator()(R& r, T const& what, T const& with) const
-        {
-            std::replace(detail::begin_(r), detail::end_(r), what, with);
-        }
-    };
-
-    struct replace_if
-    {
-        template<class R, class P, class T>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class P, class T>
-        void operator()(R& r, P p, T const& with) const
-        {
-            std::replace_if(detail::begin_(r), detail::end_(r), p, with);
-        }
-    };
-
-    struct replace_copy
-    {
-        template<class R, class O, class T, class T2>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O, class T>
-        typename result<R,O,T,T>::type 
-        operator()(R& r, O o, T const& what, T const& with) const
-        {
-            return std::replace_copy(detail::begin_(r), detail::end_(r), o, what, with);
-        }
-    };
-
-    struct replace_copy_if
-    {
-        template<class R, class O, class P, class T>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O, class P, class T>
-        typename result<R,O,P,T>::type
-        operator()(R& r, O o, P p, T const& with) const
-        {
-            return std::replace_copy_if(detail::begin_(r), detail::end_(r), o, p, with);
-        }
-    };
-
-    struct fill
-    {
-        template<class R, class T>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class T>
-        void operator()(R& r, T const& x) const
-        {
-            std::fill(detail::begin_(r), detail::end_(r), x);
-        }
-    };
-
-    struct fill_n
-    {
-        template<class R, class N, class T>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class N, class T>
-        void operator()(R& r, N n, T const& x) const
-        {
-            std::fill_n(detail::begin_(r), n, x);
-        }
-    };
-
-    struct generate
-    {
-        template<class R, class G>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class G>
-        void operator()(R& r, G g) const
-        {
-            std::generate(detail::begin_(r), detail::end_(r), g);
-        }
-    };
-
-    struct generate_n
-    {
-        template<class R, class N, class G>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class N, class G>
-        void operator()(R& r, N n, G g) const
-        {
-            std::generate_n(detail::begin_(r), n, g);
-        }
-    };
-
-    struct remove
-    {
-        template<class R, class T>
-        struct result : range_result_iterator<R>
-        {
-        };
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& x, mpl::true_) const
-        {
-            r.remove(x);
-            return detail::end_(r);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type execute(R& r, T const& x, mpl::false_) const
-        {
-            return std::remove(detail::begin_(r), detail::end_(r), x);
-        }
-
-        template<class R, class T>
-        typename result<R, T>::type operator()(R& r, T const& x) const
-        {
-            return execute(r, x, has_remove<R>());
-        }
-    };
-
-    struct remove_if
-    {
-        template<class R, class P>
-        struct result : range_result_iterator<R>
-        {
-        };
-
-        template<class R, class P>
-        typename result<R, P>::type execute(R& r, P p, mpl::true_) const
-        {
-            r.remove_if(p);
-            return detail::end_(r);
-        }
-
-        template<class R, class P>
-        typename result<R, P>::type execute(R& r, P p, mpl::false_) const
-        {
-            return std::remove_if(detail::begin_(r), detail::end_(r), p);
-        }
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return execute(r, p, has_remove_if<R>());
-        }
-    };
-
-    struct remove_copy
-    {
-        template<class R, class O, class T>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O, class T>
-        typename result<R,O,T>::type
-        operator()(R& r, O o, T const& x) const
-        {
-            return std::remove_copy(detail::begin_(r), detail::end_(r), o, x);
-        }
-    };
-
-    struct remove_copy_if
-    {
-        template<class R, class O, class P>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O, class P>
-        typename result<R,O,P>::type
-        operator()(R& r, O o, P p) const
-        {
-            return std::remove_copy_if(detail::begin_(r), detail::end_(r), o, p);
-        }
-    };
-
-    struct unique
-    {
-        template<class R, class P = void>
-        struct result : range_result_iterator<R>
-        {
-        };
-
-        template<class R>
-        typename result<R>::type execute(R& r, mpl::true_) const
-        {
-            r.unique();
-            return detail::end_(r);
-        }
-
-        template<class R>
-        typename result<R>::type execute(R& r, mpl::false_) const
-        {
-            return std::unique(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R>
-        typename result<R>::type operator()(R& r) const
-        {
-            return execute(r, has_unique<R>());
-        }
-
-
-        template<class R, class P>
-        typename result<R>::type execute(R& r, P p, mpl::true_) const
-        {
-            r.unique(p);
-            return detail::end_(r);
-        }
-
-        template<class R, class P>
-        typename result<R, P>::type execute(R& r, P p, mpl::false_) const
-        {
-            return std::unique(detail::begin_(r), detail::end_(r), p);
-        }
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return execute(r, p, has_unique<R>());
-        }
-    };
-
-    struct unique_copy
-    {
-        template<class R, class O, class P = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O>
-        typename result<R, O>::type operator()(R& r, O o) const
-        {
-            return std::unique_copy(
-                detail::begin_(r)
-                , detail::end_(r)
-                , o
-                );
-        }
-
-        template<class R, class O, class P>
-        typename result<R, O, P>::type operator()(R& r, O o, P p) const
-        {
-            return std::unique_copy(
-                detail::begin_(r)
-                , detail::end_(r)
-                , o
-                , p
-                );
-        }
-    };
-
-    struct reverse
-    {
-        template<class R>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void execute(R& r, mpl::true_) const
-        {
-            r.reverse();
-        }
-
-        template<class R>
-        void execute(R& r, mpl::false_) const
-        {
-            std::reverse(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            execute(r, has_reverse<R>());
-        }
-    };
-
-    struct reverse_copy
-    {
-        template<class R, class O>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class O>
-        typename result<R, O>::type operator()(R& r, O o) const
-        {
-            return std::reverse_copy(
-                detail::begin_(r)
-                , detail::end_(r)
-                , o
-                );
-        }
-    };
-
-    struct rotate
-    {
-        template<class R, class M>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class M>
-        void operator()(R& r, M m) const
-        {
-            std::rotate(
-                detail::begin_(r)
-                , m
-                , detail::end_(r)
-                );
-        }
-    };
-
-    struct rotate_copy
-    {
-        template<class R, class M, class O>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R, class M, class O>
-        typename result<R, M, O>::type operator()(R& r, M m, O o) const
-        {
-            return std::rotate_copy(
-                detail::begin_(r)
-                , m
-                , detail::end_(r)
-                , o
-                );
-        }
-    };
-
-    struct random_shuffle
-    {
-        template<class R, class G = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            return std::random_shuffle(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class G>
-        void operator()(R& r, G g) const
-        {
-            return std::random_shuffle(detail::begin_(r), detail::end_(r), g);
-        }
-    };
-
-    struct partition
-    {
-        template<class R, class P>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::partition(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct stable_partition
-    {
-        template<class R, class P>
-        struct result : range_result_iterator<R>
-        {};
-
-        template<class R, class P>
-        typename result<R, P>::type operator()(R& r, P p) const
-        {
-            return std::stable_partition(detail::begin_(r), detail::end_(r), p);
-        }
-    };
-
-    struct sort
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void execute(R& r, mpl::true_) const
-        {
-            r.sort();
-        }
-
-        template<class R>
-        void execute(R& r, mpl::false_) const
-        {
-            std::sort(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            execute(r, has_sort<R>());
-        }
-
-        template<class R, class C>
-        void execute(R& r, C c, mpl::true_) const
-        {
-            r.sort(c);
-        }
-
-        template<class R, class C>
-        void execute(R& r, C c, mpl::false_) const
-        {
-            std::sort(detail::begin_(r), detail::end_(r), c);
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            execute(r, c, has_sort<R>());
-        }
-    };
-
-    struct stable_sort
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            std::stable_sort(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            std::stable_sort(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct partial_sort
-    {
-        template<class R, class M, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class M>
-        void operator()(R& r, M m) const
-        {
-            std::partial_sort(detail::begin_(r), m, detail::end_(r));
-        }
-
-        template<class R, class M, class C>
-        void operator()(R& r, M m, C c) const
-        {
-            std::partial_sort(detail::begin_(r), m, detail::end_(r), c);
-        }
-    };
-
-    struct partial_sort_copy
-    {
-        template<class R1, class R2, class C = void>
-        struct result : range_result_iterator<R2>
-        {};
-
-        template<class R1, class R2>
-        typename result<R1, R2>::type operator()(R1& r1, R2& r2) const
-        {
-            return std::partial_sort_copy(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                );
-        }
-
-        template<class R1, class R2, class C>
-        typename result<R1, R2>::type operator()(R1& r1, R2& r2, C c) const
-        {
-            return std::partial_sort_copy(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , c
-                );
-        }
-    };
-
-    struct nth_element
-    {
-        template<class R, class N, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class N>
-        void operator()(R& r, N n) const
-        {
-            return std::nth_element(detail::begin_(r), n, detail::end_(r));
-        }
-
-        template<class R, class N, class C>
-        void operator()(R& r, N n, C c) const
-        {
-            return std::nth_element(detail::begin_(r), n, detail::end_(r), c);
-        }
-    };
-
-    struct merge 
-    {
-        template<class R1, class R2, class O, class C = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R1, class R2, class O>
-        typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
-        {
-            return std::merge(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                );
-        }
-
-        template<class R1, class R2, class O, class C>
-        typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
-        {
-            return std::merge(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                , c
-                );
-        }
-    };
-
-    struct inplace_merge 
-    {
-        template<class R, class M, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R, class M>
-        void operator()(R& r, M m) const
-        {
-            return std::inplace_merge(detail::begin_(r), m, detail::end_(r));
-        }
-
-        template<class R, class M, class C>
-        void operator()(R& r, M m, C c) const
-        {
-            return std::inplace_merge(detail::begin_(r), m, detail::end_(r), c);
-        }
-    };
-
-    struct next_permutation
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R>
-        bool operator()(R& r) const
-        {
-            return std::next_permutation(detail::begin_(r), detail::end_(r));
-        }
-    
-        template<class R, class C>
-        bool operator()(R& r, C c) const
-        {
-            return std::next_permutation(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct prev_permutation
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef bool type;
-        };
-
-        template<class R>
-        bool operator()(R& r) const
-        {
-            return std::prev_permutation(detail::begin_(r), detail::end_(r));
-        }
-    
-        template<class R, class C>
-        bool operator()(R& r, C c) const
-        {
-            return std::prev_permutation(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-
-    struct inner_product
-    {
-        template<class R, class I, class T, class C1 = void, class C2 = void>
-        struct result
-        {
-            typedef T type;
-        };
-
-        template<class R, class I, class T>
-        typename result<R,I,T>::type
-        operator()(R& r, I i, T t) const
-        {
-            return std::inner_product(
-                detail::begin_(r), detail::end_(r), i, t);
-        }
-
-        template<class R, class I, class T, class C1, class C2>
-        typename result<R,I,T,C1,C2>::type
-        operator()(R& r, I i, T t, C1 c1, C2 c2) const
-        {
-            return std::inner_product(
-                detail::begin_(r), detail::end_(r), i, 
-                t, c1, c2);
-        }
-    };
-
-    struct partial_sum
-    {
-        template<class R, class I, class C = void>
-        struct result
-            : detail::decay_array<I>
-        {};
-
-        template<class R, class I>
-        typename result<R,I>::type
-        operator()(R& r, I i) const
-        {
-            return std::partial_sum(
-                detail::begin_(r), detail::end_(r), i);
-        }
-
-        template<class R, class I, class C>
-        typename result<R,I,C>::type
-        operator()(R& r, I i, C c) const
-        {
-            return std::partial_sum(
-                detail::begin_(r), detail::end_(r), i, c);
-        }
-    };
-
-    struct adjacent_difference
-    {
-        template<class R, class I, class C = void>
-        struct result
-            : detail::decay_array<I>
-        {};
-
-        template<class R, class I>
-        typename result<R,I>::type
-        operator()(R& r, I i) const
-        {
-            return std::adjacent_difference(
-                detail::begin_(r), detail::end_(r), i);
-        }
-
-        template<class R, class I, class C>
-        typename result<R,I,C>::type
-        operator()(R& r, I i, C c) const
-        {
-            return std::adjacent_difference(
-                detail::begin_(r), detail::end_(r), i, c);
-        }    
-    };
-
-    struct push_heap
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            std::push_heap(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            std::push_heap(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct pop_heap
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            std::pop_heap(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            std::pop_heap(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct make_heap
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            std::make_heap(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            std::make_heap(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct sort_heap
-    {
-        template<class R, class C = void>
-        struct result
-        {
-            typedef void type;
-        };
-
-        template<class R>
-        void operator()(R& r) const
-        {
-            std::sort_heap(detail::begin_(r), detail::end_(r));
-        }
-
-        template<class R, class C>
-        void operator()(R& r, C c) const
-        {
-            std::sort_heap(detail::begin_(r), detail::end_(r), c);
-        }
-    };
-
-    struct set_union
-    {
-        template<class R1, class R2, class O, class C = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R1, class R2, class O>
-        typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
-        {
-            return std::set_union(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                );
-        }
-
-        template<class R1, class R2, class O, class C>
-        typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
-        {
-            return std::set_union(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                , c
-                );
-        }
-    };
-
-    struct set_intersection
-    {
-        template<class R1, class R2, class O, class C = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R1, class R2, class O>
-        typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
-        {
-            return std::set_intersection(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                );
-        }
-
-        template<class R1, class R2, class O, class C>
-        typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
-        {
-            return std::set_intersection(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                , c
-                );
-        }
-    };
-
-    struct set_difference
-    {
-        template<class R1, class R2, class O, class C = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R1, class R2, class O>
-        typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
-        {
-            return std::set_difference(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                );
-        }
-
-        template<class R1, class R2, class O, class C>
-        typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
-        {
-            return std::set_difference(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                , c
-                );
-        }
-    };
-
-    struct set_symmetric_difference
-    {
-        template<class R1, class R2, class O, class C = void>
-        struct result
-            : detail::decay_array<O>
-        {};
-
-        template<class R1, class R2, class O>
-        typename result<R1, R2, O>::type operator()(R1& r1, R2& r2, O o) const
-        {
-            return std::set_symmetric_difference(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                );
-        }
-
-        template<class R1, class R2, class O, class C>
-        typename result<R1, R2, O, C>::type operator()(R1& r1, R2& r2, O o, C c) const
-        {
-            return std::set_symmetric_difference(
-                detail::begin_(r1), detail::end_(r1)
-                , detail::begin_(r2), detail::end_(r2)
-                , o
-                , c
-                );
-        }
-    };
-
-}}} // boost::phoenix::impl
-
-namespace boost { namespace phoenix
-{
-    function<impl::swap> const swap = impl::swap();
-    function<impl::copy> const copy = impl::copy();
-    function<impl::copy_backward> const copy_backward = impl::copy_backward();
-    function<impl::transform> const transform = impl::transform();
-    function<impl::replace> const replace = impl::replace();
-    function<impl::replace_if> const replace_if = impl::replace_if();
-    function<impl::replace_copy> const replace_copy = impl::replace_copy();
-    function<impl::replace_copy_if> const replace_copy_if = impl::replace_copy_if();
-    function<impl::fill> const fill = impl::fill();
-    function<impl::fill_n> const fill_n = impl::fill_n();
-    function<impl::generate> const generate = impl::generate();
-    function<impl::generate_n> const generate_n = impl::generate_n();
-    function<impl::remove> const remove = impl::remove();
-    function<impl::remove_if> const remove_if = impl::remove_if();
-    function<impl::remove_copy> const remove_copy = impl::remove_copy();
-    function<impl::remove_copy_if> const remove_copy_if = impl::remove_copy_if();
-    function<impl::unique> const unique = impl::unique();
-    function<impl::unique_copy> const unique_copy = impl::unique_copy();
-    function<impl::reverse> const reverse = impl::reverse();
-    function<impl::reverse_copy> const reverse_copy = impl::reverse_copy();
-    function<impl::rotate> const rotate = impl::rotate();
-    function<impl::rotate_copy> const rotate_copy = impl::rotate_copy();
-    function<impl::random_shuffle> const random_shuffle = impl::random_shuffle();
-    function<impl::partition> const partition = impl::partition();
-    function<impl::stable_partition> const stable_partition = impl::stable_partition();
-    function<impl::sort> const sort = impl::sort();
-    function<impl::stable_sort> const stable_sort = impl::stable_sort();
-    function<impl::partial_sort> const partial_sort = impl::partial_sort();
-    function<impl::partial_sort_copy> const partial_sort_copy = impl::partial_sort_copy();
-    function<impl::nth_element> const nth_element = impl::nth_element();
-    function<impl::merge> const merge = impl::merge();
-    function<impl::inplace_merge> const inplace_merge = impl::inplace_merge();
-    function<impl::next_permutation> const next_permutation = impl::next_permutation();
-    function<impl::prev_permutation> const prev_permutation = impl::prev_permutation();
-    function<impl::inner_product> const inner_product = impl::inner_product();
-    function<impl::partial_sum> const partial_sum = impl::partial_sum();
-    function<impl::adjacent_difference> const adjacent_difference = impl::adjacent_difference();
-    function<impl::push_heap> const push_heap = impl::push_heap();
-    function<impl::pop_heap> const pop_heap = impl::pop_heap();
-    function<impl::make_heap> const make_heap = impl::make_heap();
-    function<impl::sort_heap> const sort_heap = impl::sort_heap();
-    function<impl::set_union> const set_union = impl::set_union();
-    function<impl::set_intersection> const set_intersection = impl::set_intersection();
-    function<impl::set_difference> const set_difference = impl::set_difference();
-    function<impl::set_symmetric_difference> const set_symmetric_difference = impl::set_symmetric_difference();
-}}
-
-#endif
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2004 Angus Leeming
-    Copyright (c) 2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STL_CONTAINER_HPP
-#define PHOENIX_STL_CONTAINER_HPP
-
-#include <boost/spirit/home/phoenix/stl/container/container.hpp>
-
-#endif // PHOENIX_STL_CONTAINER_HPP
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container/container.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,706 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2004 Angus Leeming
-    Copyright (c) 2004 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_STL_CONTAINER_CONTAINER_HPP
-#define PHOENIX_STL_CONTAINER_CONTAINER_HPP
-
-#include <boost/spirit/home/phoenix/stl/container/detail/container.hpp>
-#include <boost/spirit/home/phoenix/function/function.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/type_traits/is_const.hpp>
-
-namespace boost { namespace phoenix
-{
-///////////////////////////////////////////////////////////////////////////////
-//
-//  STL container member functions
-//
-//      Lazy functions for STL container member functions
-//
-//      These functions provide a mechanism for the lazy evaluation of the
-//      public member functions of the STL containers. For an overview of
-//      what is meant by 'lazy evaluation', see the comments in operators.hpp
-//      and functions.hpp.
-//
-//      Lazy functions are provided for all of the member functions of the
-//      following containers:
-//
-//      deque - list - map - multimap - vector.
-//
-//      Indeed, should *your* class have member functions with the same names
-//      and signatures as those listed below, then it will automatically be
-//      supported. To summarize, lazy functions are provided for member
-//      functions:
-//
-//          assign - at - back - begin - capacity - clear - empty - end -
-//          erase - front - get_allocator - insert - key_comp - max_size -
-//          pop_back - pop_front - push_back - push_front - rbegin - rend -
-//          reserve - resize . size - splice - value_comp.
-//
-//      The lazy functions' names are the same as the corresponding member
-//      function. Sample usage:
-//
-//      "Normal" version                 "Lazy" version
-//      ----------------                 --------------
-//      my_vector.at(5)                  phoenix::at(arg1, 5)
-//      my_list.size()                   phoenix::size(arg1)
-//      my_vector1.swap(my_vector2)      phoenix::swap(arg1, arg2)
-//
-//      Notice that member functions with names that clash with a
-//      function in stl algorithms are absent. This will be provided
-//      in Phoenix's algorithm module.
-//
-//      No support is provided here for lazy versions of operator+=,
-//      operator[] etc. Such operators are not specific to STL containers and
-//      lazy versions can therefore be found in operators.hpp.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Lazy member function implementaions.
-//
-//      The structs below provide the guts of the implementation. Thereafter,
-//      the corresponding lazy function itself is simply:
-//
-//          function<stl::assign> const assign = stl::assign();
-//
-//      The structs provide a nested "result" class template whose
-//      "type" typedef enables the lazy function to ascertain the type
-//      to be returned when it is invoked.
-//
-//      They also provide operator() member functions with signatures
-//      corresponding to those of the underlying member function of
-//      the STL container.
-//
-///////////////////////////////////////////////////////////////////////////////
-    namespace stl
-    {
-        struct assign
-        {
-            template <
-                typename C
-              , typename Arg1 = fusion::void_
-              , typename Arg2 = fusion::void_
-              , typename Arg3 = fusion::void_
-            >
-            struct result
-            {
-                typedef typename add_reference<C>::type type;
-            };
-
-            template <typename C, typename Arg1>
-            C& operator()(C& c, Arg1 const& arg1) const
-            {
-                c.assign(arg1);
-                return c;
-            }
-
-            template <typename C, typename Arg1, typename Arg2>
-            C& operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
-            {
-                c.assign(arg1, arg2);
-                return c;
-            }
-
-            template <typename C, typename Arg1, typename Arg2, typename Arg3>
-            C& operator()(
-                C& c
-              , Arg1 const& arg1
-              , Arg2 const& arg2
-              , Arg3 const& arg3) const
-            {
-                return c.assign(arg1, arg2, arg3);
-            }
-        };
-
-        struct at
-        {
-            template <typename C, typename Index>
-            struct result
-            {
-                typedef typename const_qualified_reference_of<C>::type type;
-            };
-
-            template <typename C, typename Index>
-            typename result<C, Index>::type
-            operator()(C& c, Index const& i) const
-            {
-                return c.at(i);
-            }
-        };
-
-        struct back
-        {
-            template <typename C>
-            struct result
-            {
-                typedef 
-                    typename const_qualified_reference_of<C>::type
-                type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.back();
-            }
-        };
-
-        struct begin
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename const_qualified_iterator_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.begin();
-            }
-        };
-
-        struct capacity
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename size_type_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C const& c) const
-            {
-                return c.capacity();
-            }
-        };
-
-        struct clear
-        {
-            template <typename C>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C>
-            void operator()(C& c) const
-            {
-                return c.clear();
-            }
-        };
-
-        struct empty
-        {
-            template <typename C>
-            struct result
-            {
-                typedef bool type;
-            };
-
-            template <typename C>
-            bool operator()(C const& c) const
-            {
-                return c.empty();
-            }
-        };
-
-        struct end
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename const_qualified_iterator_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.end();
-            }
-        };
-
-        struct erase
-        {
-            //  This mouthful can differentiate between the generic erase
-            //  functions (Container == std::deque, std::list, std::vector) and
-            //  that specific to the two map-types, std::map and std::multimap.
-            //
-            //  where C is a std::deque, std::list, std::vector:
-            //
-            //      1) iterator C::erase(iterator where);
-            //      2) iterator C::erase(iterator first, iterator last);
-            //
-            //  where M is a std::map or std::multimap:
-            //
-            //      3) size_type M::erase(const Key& keyval);
-            //      4) void M::erase(iterator where);
-            //      5) void M::erase(iterator first, iterator last);
-
-            template <typename C, typename Arg1, typename Arg2 = fusion::void_>
-            struct result
-            {
-                //  BOOST_MSVC #if branch here in map_erase_result non-
-                //  standard behavior. The return type should be void but
-                //  VC7.1 prefers to return iterator_of<C>. As a result,
-                //  VC7.1 complains of error C2562:
-                //  boost::phoenix::stl::erase::operator() 'void' function
-                //  returning a value. Oh well... :*
-
-                typedef
-                    boost::mpl::eval_if<
-                        boost::is_same<Arg1, typename iterator_of<C>::type>
-#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1500)
-                      , iterator_of<C>
-#else
-                      , boost::mpl::identity<void>
-#endif
-                      , size_type_of<C>
-                    >
-                map_erase_result;
-
-                typedef typename
-                    boost::mpl::eval_if<
-                        has_mapped_type<C>
-                      , map_erase_result
-                      , iterator_of<C>
-                    >::type
-                type;
-            };
-
-            template <typename C, typename Arg1>
-            typename result<C, Arg1>::type
-            operator()(C& c, Arg1 const& arg1) const
-            {
-                return c.erase(arg1);
-            }
-
-            template <typename C, typename Arg1, typename Arg2>
-            typename result<C, Arg1, Arg2>::type
-            operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
-            {
-                return c.erase(arg1, arg2);
-            }
-        };
-
-        struct front
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename const_qualified_reference_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.front();
-            }
-        };
-
-        struct get_allocator
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename allocator_type_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C const& c) const
-            {
-                return c.get_allocator();
-            }
-        };
-
-        struct insert
-        {
-            //  This mouthful can differentiate between the generic insert
-            //  functions (Container == deque, list, vector) and those
-            //  specific to the two map-types, std::map and std::multimap.
-            //
-            //  where C is a std::deque, std::list, std::vector:
-            //
-            //      1) iterator C::insert(iterator where, value_type value);
-            //      2) void C::insert(
-            //          iterator where, size_type count, value_type value);
-            //      3) template <typename Iter>
-            //         void C::insert(iterator where, Iter first, Iter last);
-            //
-            //  where M is a std::map and MM is a std::multimap:
-            //
-            //      4) pair<iterator, bool> M::insert(value_type const&);
-            //      5) iterator MM::insert(value_type const&);
-            //
-            //  where M is a std::map or std::multimap:
-            //
-            //      6) template <typename Iter>
-            //         void M::insert(Iter first, Iter last);
-
-            template <
-                typename C
-              , typename Arg1
-              , typename Arg2 = fusion::void_
-              , typename Arg3 = fusion::void_
-            >
-            class result
-            {
-                struct pair_iterator_bool
-                {
-                    typedef typename std::pair<typename C::iterator, bool> type;
-                };
-
-                typedef
-                    boost::mpl::eval_if<
-                        map_insert_returns_pair<C>
-                      , pair_iterator_bool
-                      , iterator_of<C>
-                    >
-                choice_1;
-
-                typedef
-                    boost::mpl::eval_if<
-                        boost::mpl::and_<
-                            boost::is_same<Arg3, fusion::void_>
-                          , boost::mpl::not_<boost::is_same<Arg1, Arg2> > >
-                      , iterator_of<C>
-                      , boost::mpl::identity<void>
-                    >
-                choice_2;
-
-            public:
-
-                typedef typename
-                    boost::mpl::eval_if<
-                        boost::is_same<Arg2, fusion::void_>
-                      , choice_1
-                      , choice_2
-                    >::type
-                type;
-            };
-
-            template <typename C, typename Arg1>
-            typename result<C, Arg1>::type
-            operator()(C& c, Arg1 const& arg1) const
-            {
-                return c.insert(arg1);
-            }
-
-            template <typename C, typename Arg1, typename Arg2>
-            typename result<C, Arg1, Arg2>::type
-            operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
-            {
-                return c.insert(arg1, arg2);
-            }
-
-            template <typename C, typename Arg1, typename Arg2, typename Arg3>
-            typename result<C, Arg1, Arg2, Arg3>::type
-            operator()(
-                C& c, Arg1 const& arg1, Arg2 const& arg2, Arg3 const& arg3) const
-            {
-                return c.insert(arg1, arg2, arg3);
-            }
-        };
-
-        struct key_comp
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename key_compare_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C const& c) const
-            {
-                return c.key_comp();
-            }
-        };
-
-        struct max_size
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename size_type_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C const& c) const
-            {
-                return c.max_size();
-            }
-        };
-
-        struct pop_back
-        {
-            template <typename C>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C>
-            void operator()(C& c) const
-            {
-                return c.pop_back();
-            }
-        };
-
-        struct pop_front
-        {
-            template <typename C>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C>
-            void operator()(C& c) const
-            {
-                return c.pop_front();
-            }
-        };
-
-        struct push_back
-        {
-            template <typename C, typename Arg>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C, typename Arg>
-            void operator()(C& c, Arg const& data) const
-            {
-                return c.push_back(data);
-            }
-        };
-
-        struct push_front
-        {
-            template <typename C, typename Arg>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C, typename Arg>
-            void operator()(C& c, Arg const& data) const
-            {
-                return c.push_front(data);
-            }
-        };
-
-        struct rbegin
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename
-                    const_qualified_reverse_iterator_of<C>::type
-                type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.rbegin();
-            }
-        };
-
-        struct rend
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename
-                    const_qualified_reverse_iterator_of<C>::type
-                type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C& c) const
-            {
-                return c.rend();
-            }
-        };
-
-        struct reserve
-        {
-
-            template <typename C, typename Arg>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C, typename Arg>
-            void operator()(C& c, Arg const& count) const
-            {
-                return c.reserve(count);
-            }
-        };
-
-        struct resize
-        {
-            template <typename C, typename Arg1, typename Arg2 = fusion::void_>
-            struct result
-            {
-                typedef void type;
-            };
-
-            template <typename C, typename Arg1>
-            void operator()(C& c, Arg1 const& arg1) const
-            {
-                return c.resize(arg1);
-            }
-
-            template <typename C, typename Arg1, typename Arg2>
-            void operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
-            {
-                return c.resize(arg1, arg2);
-            }
-        };
-
-        struct size
-        {
-            template <typename C>
-            struct result
-            {
-                typedef typename size_type_of<C>::type type;
-            };
-
-            template <typename C>
-            typename result<C>::type
-            operator()(C const& c) const
-            {
-                return c.size();
-            }
-        };
-
-    struct splice
-    {
-        template <
-            typename C
-          , typename Arg1
-          , typename Arg2
-          , typename Arg3 = fusion::void_
-          , typename Arg4 = fusion::void_
-        >
-        struct result
-        {
-            typedef void type;
-        };
-
-        template <typename C, typename Arg1, typename Arg2>
-        void operator()(C& c, Arg1 const& arg1, Arg2& arg2) const
-        {
-            c.splice(arg1, arg2);
-        }
-
-        template <
-            typename C
-          , typename Arg1
-          , typename Arg2
-          , typename Arg3
-        >
-        void operator()(
-            C& c
-          , Arg1 const& arg1
-          , Arg2& arg2
-          , Arg3 const& arg3
-        ) const
-        {
-            c.splice(arg1, arg2, arg3);
-        }
-
-        template <
-            typename C
-          , typename Arg1
-          , typename Arg2
-          , typename Arg3
-          , typename Arg4
-        >
-        void operator()(
-            C& c
-          , Arg1 const& arg1
-          , Arg2& arg2
-          , Arg3 const& arg3
-          , Arg4 const& arg4
-        ) const
-        {
-            c.splice(arg1, arg2, arg3, arg4);
-        }
-    };
-
-    struct value_comp
-    {
-        template <typename C>
-        struct result
-        {
-            typedef typename value_compare_of<C>::type type;
-        };
-
-        template <typename C>
-        typename result<C>::type
-        operator()(C const& c) const
-        {
-            return c.value_comp();
-        }
-    };
-
-} // namespace stl
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  The lazy functions themselves.
-//
-///////////////////////////////////////////////////////////////////////////////
-function<stl::assign> const         assign = stl::assign();
-function<stl::at> const             at = stl::at();
-function<stl::back> const           back = stl::back();
-function<stl::begin> const          begin = stl::begin();
-function<stl::capacity> const       capacity = stl::capacity();
-function<stl::clear> const          clear = stl::clear();
-function<stl::empty> const          empty = stl::empty();
-function<stl::end> const            end = stl::end();
-function<stl::erase> const          erase = stl::erase();
-function<stl::front> const          front = stl::front();
-function<stl::get_allocator> const  get_allocator = stl::get_allocator();
-function<stl::insert> const         insert = stl::insert();
-function<stl::key_comp> const       key_comp = stl::key_comp();
-function<stl::max_size> const       max_size = stl::max_size();
-function<stl::pop_back> const       pop_back  = stl::pop_back();
-function<stl::pop_front> const      pop_front = stl::pop_front();
-function<stl::push_back> const      push_back  = stl::push_back();
-function<stl::push_front> const     push_front = stl::push_front();
-function<stl::rbegin> const         rbegin = stl::rbegin();
-function<stl::rend> const           rend = stl::rend();
-function<stl::reserve> const        reserve = stl::reserve();
-function<stl::resize> const         resize = stl::resize();
-function<stl::size> const           size = stl::size();
-function<stl::splice> const         splice = stl::splice();
-function<stl::value_comp> const     value_comp = stl::value_comp();
-
-}} // namespace boost::phoenix
-
-#endif // PHOENIX_STL_CONTAINERS_HPP
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/stl/container/detail/container.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2004 Angus Leeming
-    Copyright (c) 2004 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_CONTAINER_DETAIL_CONTAINER_HPP
-#define PHOENIX_CONTAINER_DETAIL_CONTAINER_HPP
-
-#include <utility>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/type_traits/is_const.hpp>
-
-namespace boost { namespace phoenix { namespace stl
-{
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Metafunctions "value_type_of", "key_type_of" etc.
-//
-//      These metafunctions define a typedef "type" that returns the nested
-//      type if it exists. If not then the typedef returns void.
-//
-//      For example, "value_type_of<std::vector<int> >::type" is "int" whilst
-//      "value_type_of<double>::type" is "void".
-//
-//      I use a macro to define structs "value_type_of" etc simply to cut
-//      down on the amount of code. The macro is #undef-ed immediately after
-//      its final use.
-//
-/////////////////////////////////////////////////////////////////c//////////////
-#define MEMBER_TYPE_OF(MEMBER_TYPE)                                             \
-    template <typename C>                                                       \
-    struct BOOST_PP_CAT(MEMBER_TYPE, _of)                                       \
-    {                                                                           \
-        typedef typename C::MEMBER_TYPE type;                                   \
-    }
-
-    MEMBER_TYPE_OF(allocator_type);
-    MEMBER_TYPE_OF(const_iterator);
-    MEMBER_TYPE_OF(const_reference);
-    MEMBER_TYPE_OF(const_reverse_iterator);
-    MEMBER_TYPE_OF(container_type);
-    MEMBER_TYPE_OF(data_type);
-    MEMBER_TYPE_OF(iterator);
-    MEMBER_TYPE_OF(key_compare);
-    MEMBER_TYPE_OF(key_type);
-    MEMBER_TYPE_OF(reference);
-    MEMBER_TYPE_OF(reverse_iterator);
-    MEMBER_TYPE_OF(size_type);
-    MEMBER_TYPE_OF(value_compare);
-    MEMBER_TYPE_OF(value_type);
-
-#undef MEMBER_TYPE_OF
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  Const-Qualified types.
-//
-//      Many of the stl member functions have const and non-const
-//      overloaded versions that return distinct types. For example:
-//
-//          iterator begin();
-//          const_iterator begin() const;
-//
-//      The three class templates defined below,
-//      const_qualified_reference_of, const_qualified_iterator_of
-//      and const_qualified_reverse_iterator_of provide a means to extract
-//      this return type automatically.
-//
-///////////////////////////////////////////////////////////////////////////////
-    template <typename C>
-    struct const_qualified_reference_of
-    {
-        typedef typename
-            boost::mpl::eval_if<
-                boost::is_const<C>
-              , const_reference_of<C>
-              , reference_of<C>
-            >::type
-        type;
-    };
-
-    template <typename C>
-    struct const_qualified_iterator_of
-    {
-        typedef typename
-            boost::mpl::eval_if<
-                boost::is_const<C>
-              , const_iterator_of<C>
-              , iterator_of<C>
-            >::type
-        type;
-    };
-
-    template <typename C>
-    struct const_qualified_reverse_iterator_of
-    {
-        typedef typename
-            boost::mpl::eval_if<
-                boost::is_const<C>
-              , const_reverse_iterator_of<C>
-              , reverse_iterator_of<C>
-            >::type
-        type;
-    };
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  has_mapped_type<C>
-//
-//      Given a container C, determine if it is a map or multimap
-//      by checking if it has a member type named "mapped_type".
-//
-///////////////////////////////////////////////////////////////////////////////
-    namespace stl_impl
-    {
-        struct one { char a[1]; };
-        struct two { char a[2]; };
-
-        template <typename C>
-        one has_mapped_type(typename C::mapped_type(*)());
-
-        template <typename C>
-        two has_mapped_type(...);
-    }
-
-    template <typename C>
-    struct has_mapped_type
-        : boost::mpl::bool_<
-            sizeof(stl_impl::has_mapped_type<C>(0)) == sizeof(stl_impl::one)
-        >
-    {};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  map_insert_returns_pair<C>
-//
-//      Distinguish a map from a multimap by checking the return type
-//      of its "insert" member function. A map returns a pair while
-//      a multimap returns an iterator.
-//
-///////////////////////////////////////////////////////////////////////////////
-    namespace stl_impl
-    {
-        //  Cool implementation of map_insert_returns_pair by Daniel Wallin.
-        //  Thanks Daniel!!! I owe you a Pizza!
-
-        template<class A, class B>
-        one map_insert_returns_pair_check(std::pair<A,B> const&);
-
-        template <typename T>
-        two map_insert_returns_pair_check(T const&);
-
-        template <typename C>
-        struct map_insert_returns_pair
-        {
-            static typename C::value_type const& get;
-            BOOST_STATIC_CONSTANT(int,
-                value = sizeof(
-                    map_insert_returns_pair_check(((C*)0)->insert(get))));
-            typedef boost::mpl::bool_<value == sizeof(one)> type;
-        };
-    }
-
-    template <typename C>
-    struct map_insert_returns_pair
-        : stl_impl::map_insert_returns_pair<C>::type {};
-
-}}} // namespace boost::phoenix::stl
-
-#endif // PHOENIX_STL_CONTAINER_TRAITS_HPP
--- a/DEPENDENCIES/generic/include/boost/spirit/home/phoenix/version.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2005-2008 Hartmut Kaiser
-    Copyright (c) 2005-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#ifndef PHOENIX_VERSION_HPP
-#define PHOENIX_VERSION_HPP
-
-///////////////////////////////////////////////////////////////////////////////
-//
-//  This is the version of the library
-//
-///////////////////////////////////////////////////////////////////////////////
-#define BOOST_PHOENIX_VERSION   0x2000    // 2.0.0
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/qi/copy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+/*=============================================================================
+    Copyright (c) 2001-2012 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_COPY_FEBRUARY_7_2012_0159PM)
+#define BOOST_SPIRIT_COPY_FEBRUARY_7_2012_0159PM
+
+#include <boost/config.hpp>
+#include <boost/proto/proto.hpp>
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#if !defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
+
+namespace boost { namespace spirit { namespace qi
+{
+    template <typename Expr>
+    typename boost::proto::result_of::deep_copy<Expr>::type
+    copy(Expr const& expr)
+    {
+        BOOST_SPIRIT_ASSERT_MATCH(boost::spirit::qi::domain, Expr);
+        return boost::proto::deep_copy(expr);
+    }
+}}}
+
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/support/auto.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+/*=============================================================================
+    Copyright (c) 2001-2012 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_AUTO_FEBRUARY_7_2012_0159PM)
+#define BOOST_SPIRIT_AUTO_FEBRUARY_7_2012_0159PM
+
+#include <boost/config.hpp>
+#include <boost/typeof/typeof.hpp>
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+
+// Support for c++11 auto. See:
+// http://boost-spirit.com/home/articles/qi-example/zero-to-60-mph-in-2-seconds/
+// for more info
+
+#if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
+
+#define BOOST_SPIRIT_AUTO(domain_, name, expr)                                  \
+    typedef boost::proto::result_of::                                           \
+        deep_copy<BOOST_TYPEOF(expr)>::type name##_expr_type;                   \
+    BOOST_SPIRIT_ASSERT_MATCH(                                                  \
+        boost::spirit::domain_::domain, name##_expr_type);                      \
+    BOOST_AUTO(name, boost::proto::deep_copy(expr));                            \
+    /****/
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,27 @@
+/*=============================================================================
+    Copyright (c) 2001-2013 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_MARCH_04_2007_0852PM)
+#define BOOST_SPIRIT_X3_MARCH_04_2007_0852PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+//~ #include <boost/spirit/home/x3/action.hpp>
+//~ #include <boost/spirit/home/x3/auto.hpp>
+#include <boost/spirit/home/x3/auxiliary.hpp>
+#include <boost/spirit/home/x3/char.hpp>
+//~ #include <boost/spirit/home/x3/binary.hpp>
+#include <boost/spirit/home/x3/directive.hpp>
+#include <boost/spirit/home/x3/nonterminal.hpp>
+#include <boost/spirit/home/x3/numeric.hpp>
+#include <boost/spirit/home/x3/operator.hpp>
+#include <boost/spirit/home/x3/core.hpp>
+#include <boost/spirit/home/x3/string.hpp>
+//~ #include <boost/spirit/home/x3/stream.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_AUXILIARY_FEBRUARY_03_2007_0355PM)
+#define BOOST_SPIRIT_X3_AUXILIARY_FEBRUARY_03_2007_0355PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/auxiliary/any_parser.hpp>
+#include <boost/spirit/home/x3/auxiliary/eps.hpp>
+#include <boost/spirit/home/x3/auxiliary/guard.hpp>
+//~ #include <boost/spirit/home/x3/auxiliary/lazy.hpp>
+#include <boost/spirit/home/x3/auxiliary/eol.hpp>
+#include <boost/spirit/home/x3/auxiliary/eoi.hpp>
+#include <boost/spirit/home/x3/auxiliary/attr.hpp>
+//~ #include <boost/spirit/home/x3/auxiliary/attr_cast.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/any_parser.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,155 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013-2014 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_AUXILIARY_ANY_PARSER_APR_09_2014_1145PM)
+#define BOOST_SPIRIT_X3_AUXILIARY_ANY_PARSER_APR_09_2014_1145PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/subcontext.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/spirit/home/x3/support/traits/is_parser.hpp>
+#include <memory>
+#include <string>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <
+        typename Iterator
+      , typename Attribute = unused_type
+      , typename Context = subcontext<>>
+    struct any_parser : parser<any_parser<Iterator, Attribute, Context>>
+    {
+        typedef Attribute attribute_type;
+
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+        static bool const handles_container =
+            traits::is_container<Attribute>::value;
+
+    public:
+        any_parser()
+          : _content(nullptr) {}
+
+        template <typename Expr,
+            typename Enable = typename enable_if<traits::is_parser<Expr>>::type>
+        any_parser(Expr const& expr)
+          : _content(new holder<Expr>(expr)) {}
+
+        any_parser(any_parser const& other)
+          : _content(other._content ? other._content->clone() : nullptr) {}
+
+        any_parser(any_parser&& other) = default;
+
+        any_parser& operator=(any_parser const& other)
+        {
+            _content.reset(other._content ? other._content->clone() : nullptr);
+            return *this;
+        }
+
+        any_parser& operator=(any_parser&& other) = default;
+
+        template <typename Iterator_, typename Context_>
+        bool parse(Iterator_& first, Iterator_ const& last
+          , Context_ const& context, unused_type, Attribute& attr) const
+        {
+            BOOST_STATIC_ASSERT_MSG(
+                (is_same<Iterator, Iterator_>::value)
+              , "Incompatible iterator used"
+            );
+
+            BOOST_ASSERT_MSG(
+                (_content != nullptr)
+              , "Invalid use of uninitialized any_parser"
+            );
+
+            return _content->parse(first, last, context, attr);
+        }
+
+        template <typename Iterator_, typename Context_, typename Attribute_>
+        bool parse(Iterator_& first, Iterator_ const& last
+          , Context_ const& context, unused_type, Attribute_& attr_) const
+        {
+            Attribute attr;
+            if (parse(first, last, context, unused, attr))
+            {
+                traits::move_to(attr, attr_);
+                return true;
+            }
+            return false;
+        }
+
+        std::string get_info() const
+        {
+            return _content ? _content->get_info() : "";
+        }
+
+    private:
+
+        struct placeholder
+        {
+            virtual placeholder* clone() const = 0;
+
+            virtual bool parse(Iterator& first, Iterator const& last
+              , Context const& context, Attribute& attr) const = 0;
+
+            virtual std::string get_info() const = 0;
+
+            virtual ~placeholder() {}
+        };
+
+        template <typename Expr>
+        struct holder : placeholder
+        {
+            typedef typename extension::as_parser<Expr>::value_type parser_type;
+
+            explicit holder(Expr const& p)
+              : _parser(as_parser(p)) {}
+
+            holder* clone() const override
+            {
+                return new holder(*this);
+            }
+
+            bool parse(Iterator& first, Iterator const& last
+              , Context const& context, Attribute& attr) const override
+            {
+                return _parser.parse(first, last, context, unused, attr);
+            }
+
+            std::string get_info() const override
+            {
+                return x3::what(_parser);
+            }
+
+            parser_type _parser;
+        };
+
+    private:
+        std::unique_ptr<placeholder> _content;
+    };
+
+    template <typename Iterator, typename Attribute, typename Context>
+    struct get_info<any_parser<Iterator, Attribute, Context>>
+    {
+        typedef std::string result_type;
+        std::string operator()(
+            any_parser<Iterator, Attribute, Context> const& p) const
+        {
+            return p.get_info();
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/attr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,135 @@
+/*=============================================================================
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef BOOST_SPIRIT_X3_ATTR_JUL_23_2008_0956AM
+#define BOOST_SPIRIT_X3_ATTR_JUL_23_2008_0956AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <algorithm>
+#include <cstddef>
+#include <string>
+#include <utility>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Value>
+    struct attr_parser : parser<attr_parser<Value>>
+    {
+        typedef Value attribute_type;
+
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+        static bool const handles_container =
+            traits::is_container<attribute_type>::value;
+        
+        attr_parser(Value const& value)
+          : value_(value) {}
+        attr_parser(Value&& value)
+          : value_(std::move(value)) {}
+
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext&, Attribute& attr_) const
+        {
+            // $$$ Change to copy_to once we have it $$$
+            traits::move_to(value_, attr_);
+            return true;
+        }
+
+        Value value_;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        attr_parser& operator= (attr_parser const&);
+    };
+    
+    template <typename Value, std::size_t N>
+    struct attr_parser<Value[N]> : parser<attr_parser<Value[N]>>
+    {
+        typedef Value attribute_type[N];
+
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+        static bool const handles_container = true;
+        
+        attr_parser(Value const (&value)[N])
+        {
+            std::copy(value + 0, value + N, value_ + 0);
+        }
+
+        attr_parser(Value (&&value)[N])
+        {
+            std::move(value + 0, value + N, value_ + 0);
+        }
+
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext&, Attribute& attr_) const
+        {
+            // $$$ Change to copy_to once we have it $$$
+            traits::move_to(value_ + 0, value_ + N, attr_);
+            return true;
+        }
+
+        Value value_[N];
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        attr_parser& operator= (attr_parser const&);
+    };
+    
+    template <typename Value>
+    struct get_info<attr_parser<Value>>
+    {
+        typedef std::string result_type;
+        std::string operator()(attr_parser<Value> const& /*p*/) const
+        {
+            return "attr";
+        }
+    };
+
+    struct attr_gen
+    {
+        template <typename Value>
+        attr_parser<typename remove_cv<
+            typename remove_reference<Value>::type>::type>
+        operator()(Value&& value) const
+        {
+            return {std::forward<Value>(value)};
+        }
+        
+        template <typename Value, std::size_t N>
+        attr_parser<typename remove_cv<Value>::type[N]>
+        operator()(Value (&value)[N]) const
+        {
+            return {value};
+        }
+        template <typename Value, std::size_t N>
+        attr_parser<typename remove_cv<Value>::type[N]>
+        operator()(Value (&&value)[N]) const
+        {
+            return {value};
+        }
+    };
+
+    attr_gen const attr = attr_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eoi.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_EOI_MARCH_23_2007_0454PM)
+#define BOOST_SPIRIT_X3_EOI_MARCH_23_2007_0454PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct eoi_parser : parser<eoi_parser>
+    {
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute&) const
+        {
+            x3::skip_over(first, last, context);
+            return first == last;
+        }
+    };
+
+    template<>
+    struct get_info<eoi_parser>
+    {
+        typedef std::string result_type;
+        result_type operator()(eoi_parser const &) const { return "eoi"; }
+    };
+
+    eoi_parser const eoi = eoi_parser();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eol.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_EOL_MARCH_23_2007_0454PM)
+#define BOOST_SPIRIT_X3_EOL_MARCH_23_2007_0454PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct eol_parser : parser<eol_parser>
+    {
+         typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+         , Context const& context, unused_type, Attribute& /*attr*/) const
+        {
+            x3::skip_over(first, last, context);
+            Iterator iter = first;
+            bool matched = false;
+            if (iter != last && *iter == '\r')  // CR
+            {
+                matched = true;
+                ++iter;
+            }
+            if (iter != last && *iter == '\n')  // LF
+            {
+                matched = true;
+                ++iter;
+            }
+
+            if (matched) first = iter;
+            return matched;
+        }
+    };
+
+    template<>
+    struct get_info<eol_parser>
+    {
+        typedef std::string result_type;
+        result_type operator()(eol_parser const &) const { return "eol"; }
+    };
+
+    eol_parser const eol = eol_parser();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/eps.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,92 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_EPS_MARCH_23_2007_0454PM)
+#define BOOST_SPIRIT_X3_EPS_MARCH_23_2007_0454PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct rule_context_tag;
+
+    struct semantic_predicate : parser<semantic_predicate>
+    {
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        semantic_predicate(bool predicate)
+          : predicate(predicate) {}
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute&) const
+        {
+            x3::skip_over(first, last, context);
+            return predicate;
+        }
+
+        bool predicate;
+    };
+
+    template <typename F>
+    struct lazy_semantic_predicate : parser<lazy_semantic_predicate<F>>
+    {
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        lazy_semantic_predicate(F f)
+          : f(f) {}
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute& attr) const
+        {
+            x3::skip_over(first, last, context);
+            return f(x3::get<rule_context_tag>(context));
+        }
+
+        F f;
+    };
+
+    struct eps_parser : parser<eps_parser>
+    {
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext&, Attribute&) const
+        {
+            x3::skip_over(first, last, context);
+            return true;
+        }
+
+        semantic_predicate
+        operator()(bool predicate) const
+        {
+            return semantic_predicate(predicate);
+        }
+
+        template <typename F>
+        lazy_semantic_predicate<F>
+        operator()(F f) const
+        {
+            return lazy_semantic_predicate<F>(f);
+        }
+    };
+
+    eps_parser const eps = eps_parser();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/auxiliary/guard.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,73 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_GUARD_FERBRUARY_02_2013_0649PM)
+#define BOOST_SPIRIT_X3_GUARD_FERBRUARY_02_2013_0649PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/directive/expect.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    enum class error_handler_result
+    {
+        fail
+      , retry
+      , accept
+      , rethrow
+    };
+
+    template <typename Subject, typename Handler>
+    struct guard : unary_parser<Subject, guard<Subject, Handler>>
+    {
+        typedef unary_parser<Subject, guard<Subject, Handler>> base_type;
+        static bool const is_pass_through_unary = true;
+
+        guard(Subject const& subject, Handler handler)
+          : base_type(subject), handler(handler) {}
+
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr) const
+        {
+            for (;;)
+            {
+                try
+                {
+                    Iterator i = first;
+                    bool r = this->subject.parse(i, last, context, rcontext, attr);
+                    if (r)
+                        first = i;
+                    return r;
+                }
+                catch (expectation_failure<Iterator> const& x)
+                {
+                    switch (handler(first, last, x, context))
+                    {
+                        case error_handler_result::fail:
+                            return false;
+                        case error_handler_result::retry:
+                            continue;
+                        case error_handler_result::accept:
+                            return true;
+                        case error_handler_result::rethrow:
+                            throw;
+                    }
+                }
+            }
+            return false;
+        }
+
+        Handler handler;
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,23 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CHAR_FEBRUARY_02_2007_0921AM)
+#define BOOST_SPIRIT_X3_CHAR_FEBRUARY_02_2007_0921AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/char_parser.hpp>
+#include <boost/spirit/home/x3/char/negated_char_parser.hpp>
+#include <boost/spirit/home/x3/char/char.hpp>
+#include <boost/spirit/home/x3/char/char_class.hpp>
+
+#if defined(BOOST_SPIRIT_X3_UNICODE)
+#include <boost/spirit/home/x3/char/unicode.hpp>
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/any_char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ANY_CHAR_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_X3_ANY_CHAR_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/literal_char.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Encoding>
+    struct any_char : char_parser<any_char<Encoding>>
+    {
+        typedef typename Encoding::char_type char_type;
+        typedef Encoding encoding;
+        typedef char_type attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Char, typename Context>
+        bool test(Char ch_, Context const&) const
+        {
+            return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch_));
+        }
+
+        template <typename Char>
+        literal_char<Encoding>
+        operator()(Char ch) const
+        {
+            return literal_char<Encoding>(ch);
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,88 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CHAR_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_X3_CHAR_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/any_char.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+#include <boost/spirit/home/support/char_encoding/standard.hpp>
+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    namespace standard
+    {
+        typedef any_char<char_encoding::standard> char_type;
+        char_type const char_ = char_type();
+    }
+
+    using standard::char_type;
+    using standard::char_;
+
+    namespace standard_wide
+    {
+        typedef any_char<char_encoding::standard_wide> char_type;
+        char_type const char_ = char_type();
+    }
+
+    namespace ascii
+    {
+        typedef any_char<char_encoding::ascii> char_type;
+        char_type const char_ = char_type();
+    }
+
+    namespace extension
+    {
+        template <>
+        struct as_parser<char>
+        {
+            typedef literal_char<
+                char_encoding::standard, unused_type>
+            type;
+
+            typedef type value_type;
+
+            static type call(char ch)
+            {
+                return type(ch);
+            }
+        };
+
+        template <>
+        struct as_parser<wchar_t>
+        {
+            typedef literal_char<
+                char_encoding::standard_wide, unused_type>
+            type;
+
+            typedef type value_type;
+
+            static type call(wchar_t ch)
+            {
+                return type(ch);
+            }
+        };
+    }
+
+    inline literal_char<char_encoding::standard, unused_type>
+    lit(char ch)
+    {
+        return literal_char<char_encoding::standard, unused_type>(ch);
+    }
+
+    inline literal_char<char_encoding::standard_wide, unused_type>
+    lit(wchar_t ch)
+    {
+        return literal_char<char_encoding::standard_wide, unused_type>(ch);
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char_class.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,148 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CHAR_CLASS_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_X3_CHAR_CLASS_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/char_parser.hpp>
+#include <boost/spirit/home/x3/char/detail/cast_char.hpp>
+#include <boost/spirit/home/support/char_encoding/standard.hpp>
+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+#include <boost/spirit/home/support/char_encoding/iso8859_1.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    struct char_tag {};
+    struct alnum_tag {};
+    struct alpha_tag {};
+    struct blank_tag {};
+    struct cntrl_tag {};
+    struct digit_tag {};
+    struct graph_tag {};
+    struct print_tag {};
+    struct punct_tag {};
+    struct space_tag {};
+    struct xdigit_tag {};
+    struct lower_tag {};
+    struct upper_tag {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Encoding>
+    struct char_class_base
+    {
+        typedef typename Encoding::char_type char_type;
+
+#define BOOST_SPIRIT_X3_CLASSIFY(name)                                             \
+        template <typename Char>                                                \
+        static bool                                                             \
+        is(name##_tag, Char ch)                                                 \
+        {                                                                       \
+            return Encoding::is##name                                           \
+                BOOST_PREVENT_MACRO_SUBSTITUTION                                \
+                    (detail::cast_char<char_type>(ch));                         \
+        }                                                                       \
+        /***/
+
+        BOOST_SPIRIT_X3_CLASSIFY(char)
+        BOOST_SPIRIT_X3_CLASSIFY(alnum)
+        BOOST_SPIRIT_X3_CLASSIFY(alpha)
+        BOOST_SPIRIT_X3_CLASSIFY(digit)
+        BOOST_SPIRIT_X3_CLASSIFY(xdigit)
+        BOOST_SPIRIT_X3_CLASSIFY(cntrl)
+        BOOST_SPIRIT_X3_CLASSIFY(graph)
+        BOOST_SPIRIT_X3_CLASSIFY(lower)
+        BOOST_SPIRIT_X3_CLASSIFY(print)
+        BOOST_SPIRIT_X3_CLASSIFY(punct)
+        BOOST_SPIRIT_X3_CLASSIFY(space)
+        BOOST_SPIRIT_X3_CLASSIFY(blank)
+        BOOST_SPIRIT_X3_CLASSIFY(upper)
+
+#undef BOOST_SPIRIT_X3_CLASSIFY
+    };
+
+    template <typename Encoding, typename Tag>
+    struct char_class
+      : char_parser<char_class<Encoding, Tag>>
+    {
+        typedef Encoding encoding;
+        typedef Tag tag;
+        typedef typename Encoding::char_type char_type;
+        typedef char_type attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Char, typename Context>
+        bool test(Char ch, Context const&) const
+        {
+            return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch))
+                && char_class_base<Encoding>::is(tag(), ch);
+        }
+    };
+
+#define BOOST_SPIRIT_X3_CHAR_CLASS(encoding, name)                                 \
+    typedef char_class<char_encoding::encoding, name##_tag> name##_type;        \
+    name##_type const name = name##_type();                                     \
+    /***/
+
+#define BOOST_SPIRIT_X3_CHAR_CLASSES(encoding)                                     \
+    namespace encoding                                                          \
+    {                                                                           \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, alnum)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, alpha)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, digit)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, xdigit)                               \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, cntrl)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, graph)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, lower)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, print)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, punct)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, space)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, blank)                                \
+        BOOST_SPIRIT_X3_CHAR_CLASS(encoding, upper)                                \
+    }                                                                           \
+    /***/
+
+    BOOST_SPIRIT_X3_CHAR_CLASSES(standard)
+    BOOST_SPIRIT_X3_CHAR_CLASSES(standard_wide)
+    BOOST_SPIRIT_X3_CHAR_CLASSES(ascii)
+    BOOST_SPIRIT_X3_CHAR_CLASSES(iso8859_1)
+
+#undef BOOST_SPIRIT_X3_CHAR_CLASS
+#undef BOOST_SPIRIT_X3_CHAR_CLASSES
+
+    using standard::alnum_type;
+    using standard::alpha_type;
+    using standard::digit_type;
+    using standard::xdigit_type;
+    using standard::cntrl_type;
+    using standard::graph_type;
+    using standard::lower_type;
+    using standard::print_type;
+    using standard::punct_type;
+    using standard::space_type;
+    using standard::blank_type;
+    using standard::upper_type;
+
+    using standard::alnum;
+    using standard::alpha;
+    using standard::digit;
+    using standard::xdigit;
+    using standard::cntrl;
+    using standard::graph;
+    using standard::lower;
+    using standard::print;
+    using standard::punct;
+    using standard::space;
+    using standard::blank;
+    using standard::upper;
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/char_parser.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CHAR_PARSER_APR_16_2006_0906AM)
+#define BOOST_SPIRIT_X3_CHAR_PARSER_APR_16_2006_0906AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // The base char_parser
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Derived>
+    struct char_parser : parser<Derived>
+    {
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute& attr) const
+        {
+            x3::skip_over(first, last, context);
+
+            if (first != last && this->derived().test(*first, context))
+            {
+                x3::traits::move_to(*first, attr);
+                ++first;
+                return true;
+            }
+            return false;
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/detail/cast_char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,58 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CAST_CHAR_NOVEMBER_10_2006_0907AM)
+#define BOOST_SPIRIT_X3_CAST_CHAR_NOVEMBER_10_2006_0907AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/type_traits/make_signed.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    // Here's the thing... typical encodings (except ASCII) deal with unsigned
+    // integers > 127 (ASCII uses only 127). Yet, most char and wchar_t are signed.
+    // Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you
+    // cast this to an unsigned int with 32 bits, you get 4294967273!
+    //
+    // The trick is to cast to an unsigned version of the source char first
+    // before casting to the target. {P.S. Don't worry about the code, the
+    // optimizer will optimize the if-else branches}
+
+    template <typename TargetChar, typename SourceChar>
+    TargetChar cast_char(SourceChar ch)
+    {
+        if (is_signed<TargetChar>::value != is_signed<SourceChar>::value)
+        {
+            if (is_signed<SourceChar>::value)
+            {
+                 // source is signed, target is unsigned
+                typedef typename make_unsigned<SourceChar>::type USourceChar;
+                return TargetChar(USourceChar(ch));
+            }
+            else
+            {
+                 // source is unsigned, target is signed
+                typedef typename make_signed<SourceChar>::type SSourceChar;
+                return TargetChar(SSourceChar(ch));
+            }
+        }
+        else
+        {
+            // source and target has same signedness
+            return TargetChar(ch); // just cast
+        }
+    }
+}}}}
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/literal_char.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,54 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_LITERAL_CHAR_APRIL_16_2006_1051AM)
+#define BOOST_SPIRIT_X3_LITERAL_CHAR_APRIL_16_2006_1051AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/char_parser.hpp>
+#include <boost/spirit/home/x3/support/utility/utf8.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Encoding, typename Attribute = typename Encoding::char_type>
+    struct literal_char : char_parser<literal_char<Encoding, Attribute>>
+    {
+        typedef typename Encoding::char_type char_type;
+        typedef Encoding encoding;
+        typedef Attribute attribute_type;
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+
+        template <typename Char>
+        literal_char(Char ch)
+          : ch(static_cast<char_type>(ch)) {}
+
+        template <typename Char, typename Context>
+        bool test(Char ch_, Context const&) const
+        {
+            return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch_))
+                && ch == char_type(ch_);
+        }
+
+        char_type ch;
+    };
+
+    template <typename Encoding, typename Attribute>
+    struct get_info<literal_char<Encoding, Attribute>>
+    {
+        typedef std::string result_type;
+        std::string operator()(literal_char<Encoding, Attribute> const& p) const
+        {
+            return '\'' + to_utf8(Encoding::toucs4(p.ch)) + '\'';
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/negated_char_parser.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,65 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_NEGATED_CHAR_PARSER_APR_16_2006_0906AM)
+#define BOOST_SPIRIT_X3_NEGATED_CHAR_PARSER_APR_16_2006_0906AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/char/char_parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // negated_char_parser handles ~cp expressions (cp is a char_parser)
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Positive>
+    struct negated_char_parser :
+        char_parser<negated_char_parser<Positive>>
+    {
+        negated_char_parser(Positive const& positive)
+          : positive(positive) {}
+
+        template <typename CharParam, typename Context>
+        bool test(CharParam ch, Context const& context) const
+        {
+            return !positive.test(ch, context);
+        }
+
+        Positive positive;
+    };
+
+    template <typename Positive>
+    inline negated_char_parser<Positive>
+    operator~(char_parser<Positive> const& cp)
+    {
+        return negated_char_parser<Positive>(cp.derived());
+    }
+
+    template <typename Positive>
+    inline Positive const&
+    operator~(negated_char_parser<Positive> const& cp)
+    {
+        return cp.positive;
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Positive, typename Context>
+    struct attribute_of<x3::negated_char_parser<Positive>, Context>
+        : attribute_of<Positive, Context> {};
+    
+    template <typename Positive, typename Context>
+    struct has_attribute<x3::negated_char_parser<Positive>, Context>
+        : has_attribute<Positive, Context> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/char/unicode.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,617 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_UNICODE_JAN_20_2012_1218AM)
+#define BOOST_SPIRIT_X3_UNICODE_JAN_20_2012_1218AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/char/char_parser.hpp>
+#include <boost/spirit/home/x3/char/char.hpp>
+#include <boost/spirit/home/x3/char/detail/cast_char.hpp>
+#include <boost/spirit/home/support/char_encoding/unicode.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+    struct char_tag;
+    struct alnum_tag;
+    struct alpha_tag;
+    struct blank_tag;
+    struct cntrl_tag;
+    struct digit_tag;
+    struct graph_tag;
+    struct print_tag;
+    struct punct_tag;
+    struct space_tag;
+    struct xdigit_tag;
+    struct lower_tag;
+    struct upper_tag;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+    struct letter_tag {};
+    struct mark_tag {};
+    struct number_tag {};
+    struct separator_tag {};
+    struct other_tag {};
+    struct punctuation_tag {};
+    struct symbol_tag {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode General Categories
+    ///////////////////////////////////////////////////////////////////////////
+    struct uppercase_letter_tag {};
+    struct lowercase_letter_tag {};
+    struct titlecase_letter_tag {};
+    struct modifier_letter_tag {};
+    struct other_letter_tag {};
+
+    struct nonspacing_mark_tag {};
+    struct enclosing_mark_tag {};
+    struct spacing_mark_tag {};
+
+    struct decimal_number_tag {};
+    struct letter_number_tag {};
+    struct other_number_tag {};
+
+    struct space_separator_tag {};
+    struct line_separator_tag {};
+    struct paragraph_separator_tag {};
+
+    struct control_tag {};
+    struct format_tag {};
+    struct private_use_tag {};
+    struct surrogate_tag {};
+    struct unassigned_tag {};
+
+    struct dash_punctuation_tag {};
+    struct open_punctuation_tag {};
+    struct close_punctuation_tag {};
+    struct connector_punctuation_tag {};
+    struct other_punctuation_tag {};
+    struct initial_punctuation_tag {};
+    struct final_punctuation_tag {};
+
+    struct math_symbol_tag {};
+    struct currency_symbol_tag {};
+    struct modifier_symbol_tag {};
+    struct other_symbol_tag {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Derived Categories
+    ///////////////////////////////////////////////////////////////////////////
+    struct alphabetic_tag {};
+    struct uppercase_tag {};
+    struct lowercase_tag {};
+    struct white_space_tag {};
+    struct hex_digit_tag {};
+    struct noncharacter_code_point_tag {};
+    struct default_ignorable_code_point_tag {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Scripts
+    ///////////////////////////////////////////////////////////////////////////
+    struct arabic_tag {};
+    struct imperial_aramaic_tag {};
+    struct armenian_tag {};
+    struct avestan_tag {};
+    struct balinese_tag {};
+    struct bamum_tag {};
+    struct bengali_tag {};
+    struct bopomofo_tag {};
+    struct braille_tag {};
+    struct buginese_tag {};
+    struct buhid_tag {};
+    struct canadian_aboriginal_tag {};
+    struct carian_tag {};
+    struct cham_tag {};
+    struct cherokee_tag {};
+    struct coptic_tag {};
+    struct cypriot_tag {};
+    struct cyrillic_tag {};
+    struct devanagari_tag {};
+    struct deseret_tag {};
+    struct egyptian_hieroglyphs_tag {};
+    struct ethiopic_tag {};
+    struct georgian_tag {};
+    struct glagolitic_tag {};
+    struct gothic_tag {};
+    struct greek_tag {};
+    struct gujarati_tag {};
+    struct gurmukhi_tag {};
+    struct hangul_tag {};
+    struct han_tag {};
+    struct hanunoo_tag {};
+    struct hebrew_tag {};
+    struct hiragana_tag {};
+    struct katakana_or_hiragana_tag {};
+    struct old_italic_tag {};
+    struct javanese_tag {};
+    struct kayah_li_tag {};
+    struct katakana_tag {};
+    struct kharoshthi_tag {};
+    struct khmer_tag {};
+    struct kannada_tag {};
+    struct kaithi_tag {};
+    struct tai_tham_tag {};
+    struct lao_tag {};
+    struct latin_tag {};
+    struct lepcha_tag {};
+    struct limbu_tag {};
+    struct linear_b_tag {};
+    struct lisu_tag {};
+    struct lycian_tag {};
+    struct lydian_tag {};
+    struct malayalam_tag {};
+    struct mongolian_tag {};
+    struct meetei_mayek_tag {};
+    struct myanmar_tag {};
+    struct nko_tag {};
+    struct ogham_tag {};
+    struct ol_chiki_tag {};
+    struct old_turkic_tag {};
+    struct oriya_tag {};
+    struct osmanya_tag {};
+    struct phags_pa_tag {};
+    struct inscriptional_pahlavi_tag {};
+    struct phoenician_tag {};
+    struct inscriptional_parthian_tag {};
+    struct rejang_tag {};
+    struct runic_tag {};
+    struct samaritan_tag {};
+    struct old_south_arabian_tag {};
+    struct saurashtra_tag {};
+    struct shavian_tag {};
+    struct sinhala_tag {};
+    struct sundanese_tag {};
+    struct syloti_nagri_tag {};
+    struct syriac_tag {};
+    struct tagbanwa_tag {};
+    struct tai_le_tag {};
+    struct new_tai_lue_tag {};
+    struct tamil_tag {};
+    struct tai_viet_tag {};
+    struct telugu_tag {};
+    struct tifinagh_tag {};
+    struct tagalog_tag {};
+    struct thaana_tag {};
+    struct thai_tag {};
+    struct tibetan_tag {};
+    struct ugaritic_tag {};
+    struct vai_tag {};
+    struct old_persian_tag {};
+    struct cuneiform_tag {};
+    struct yi_tag {};
+    struct inherited_tag {};
+    struct common_tag {};
+    struct unknown_tag {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    struct unicode_char_class_base
+    {
+        typedef char_encoding::unicode encoding;
+        typedef char_encoding::unicode::char_type char_type;
+
+#define BOOST_SPIRIT_X3_BASIC_CLASSIFY(name)                                       \
+        template <typename Char>                                                \
+        static bool                                                             \
+        is(name##_tag, Char ch)                                                 \
+        {                                                                       \
+            return encoding::is ##name                                          \
+                BOOST_PREVENT_MACRO_SUBSTITUTION                                \
+                    (detail::cast_char<char_type>(ch));                         \
+        }                                                                       \
+        /***/
+
+#define BOOST_SPIRIT_X3_CLASSIFY(name)                                             \
+        template <typename Char>                                                \
+        static bool                                                             \
+        is(name##_tag, Char ch)                                                 \
+        {                                                                       \
+            return encoding::is_##name                                          \
+                BOOST_PREVENT_MACRO_SUBSTITUTION                                \
+                    (detail::cast_char<char_type>(ch));                         \
+        }                                                                       \
+        /***/
+
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(char)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(alnum)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(alpha)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(digit)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(xdigit)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(cntrl)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(graph)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(lower)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(print)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(punct)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(space)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(blank)
+        BOOST_SPIRIT_X3_BASIC_CLASSIFY(upper)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CLASSIFY(letter)
+        BOOST_SPIRIT_X3_CLASSIFY(mark)
+        BOOST_SPIRIT_X3_CLASSIFY(number)
+        BOOST_SPIRIT_X3_CLASSIFY(separator)
+        BOOST_SPIRIT_X3_CLASSIFY(other)
+        BOOST_SPIRIT_X3_CLASSIFY(punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(symbol)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode General Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CLASSIFY(uppercase_letter)
+        BOOST_SPIRIT_X3_CLASSIFY(lowercase_letter)
+        BOOST_SPIRIT_X3_CLASSIFY(titlecase_letter)
+        BOOST_SPIRIT_X3_CLASSIFY(modifier_letter)
+        BOOST_SPIRIT_X3_CLASSIFY(other_letter)
+
+        BOOST_SPIRIT_X3_CLASSIFY(nonspacing_mark)
+        BOOST_SPIRIT_X3_CLASSIFY(enclosing_mark)
+        BOOST_SPIRIT_X3_CLASSIFY(spacing_mark)
+
+        BOOST_SPIRIT_X3_CLASSIFY(decimal_number)
+        BOOST_SPIRIT_X3_CLASSIFY(letter_number)
+        BOOST_SPIRIT_X3_CLASSIFY(other_number)
+
+        BOOST_SPIRIT_X3_CLASSIFY(space_separator)
+        BOOST_SPIRIT_X3_CLASSIFY(line_separator)
+        BOOST_SPIRIT_X3_CLASSIFY(paragraph_separator)
+
+        BOOST_SPIRIT_X3_CLASSIFY(control)
+        BOOST_SPIRIT_X3_CLASSIFY(format)
+        BOOST_SPIRIT_X3_CLASSIFY(private_use)
+        BOOST_SPIRIT_X3_CLASSIFY(surrogate)
+        BOOST_SPIRIT_X3_CLASSIFY(unassigned)
+
+        BOOST_SPIRIT_X3_CLASSIFY(dash_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(open_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(close_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(connector_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(other_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(initial_punctuation)
+        BOOST_SPIRIT_X3_CLASSIFY(final_punctuation)
+
+        BOOST_SPIRIT_X3_CLASSIFY(math_symbol)
+        BOOST_SPIRIT_X3_CLASSIFY(currency_symbol)
+        BOOST_SPIRIT_X3_CLASSIFY(modifier_symbol)
+        BOOST_SPIRIT_X3_CLASSIFY(other_symbol)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Derived Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CLASSIFY(alphabetic)
+        BOOST_SPIRIT_X3_CLASSIFY(uppercase)
+        BOOST_SPIRIT_X3_CLASSIFY(lowercase)
+        BOOST_SPIRIT_X3_CLASSIFY(white_space)
+        BOOST_SPIRIT_X3_CLASSIFY(hex_digit)
+        BOOST_SPIRIT_X3_CLASSIFY(noncharacter_code_point)
+        BOOST_SPIRIT_X3_CLASSIFY(default_ignorable_code_point)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Scripts
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CLASSIFY(arabic)
+        BOOST_SPIRIT_X3_CLASSIFY(imperial_aramaic)
+        BOOST_SPIRIT_X3_CLASSIFY(armenian)
+        BOOST_SPIRIT_X3_CLASSIFY(avestan)
+        BOOST_SPIRIT_X3_CLASSIFY(balinese)
+        BOOST_SPIRIT_X3_CLASSIFY(bamum)
+        BOOST_SPIRIT_X3_CLASSIFY(bengali)
+        BOOST_SPIRIT_X3_CLASSIFY(bopomofo)
+        BOOST_SPIRIT_X3_CLASSIFY(braille)
+        BOOST_SPIRIT_X3_CLASSIFY(buginese)
+        BOOST_SPIRIT_X3_CLASSIFY(buhid)
+        BOOST_SPIRIT_X3_CLASSIFY(canadian_aboriginal)
+        BOOST_SPIRIT_X3_CLASSIFY(carian)
+        BOOST_SPIRIT_X3_CLASSIFY(cham)
+        BOOST_SPIRIT_X3_CLASSIFY(cherokee)
+        BOOST_SPIRIT_X3_CLASSIFY(coptic)
+        BOOST_SPIRIT_X3_CLASSIFY(cypriot)
+        BOOST_SPIRIT_X3_CLASSIFY(cyrillic)
+        BOOST_SPIRIT_X3_CLASSIFY(devanagari)
+        BOOST_SPIRIT_X3_CLASSIFY(deseret)
+        BOOST_SPIRIT_X3_CLASSIFY(egyptian_hieroglyphs)
+        BOOST_SPIRIT_X3_CLASSIFY(ethiopic)
+        BOOST_SPIRIT_X3_CLASSIFY(georgian)
+        BOOST_SPIRIT_X3_CLASSIFY(glagolitic)
+        BOOST_SPIRIT_X3_CLASSIFY(gothic)
+        BOOST_SPIRIT_X3_CLASSIFY(greek)
+        BOOST_SPIRIT_X3_CLASSIFY(gujarati)
+        BOOST_SPIRIT_X3_CLASSIFY(gurmukhi)
+        BOOST_SPIRIT_X3_CLASSIFY(hangul)
+        BOOST_SPIRIT_X3_CLASSIFY(han)
+        BOOST_SPIRIT_X3_CLASSIFY(hanunoo)
+        BOOST_SPIRIT_X3_CLASSIFY(hebrew)
+        BOOST_SPIRIT_X3_CLASSIFY(hiragana)
+        BOOST_SPIRIT_X3_CLASSIFY(katakana_or_hiragana)
+        BOOST_SPIRIT_X3_CLASSIFY(old_italic)
+        BOOST_SPIRIT_X3_CLASSIFY(javanese)
+        BOOST_SPIRIT_X3_CLASSIFY(kayah_li)
+        BOOST_SPIRIT_X3_CLASSIFY(katakana)
+        BOOST_SPIRIT_X3_CLASSIFY(kharoshthi)
+        BOOST_SPIRIT_X3_CLASSIFY(khmer)
+        BOOST_SPIRIT_X3_CLASSIFY(kannada)
+        BOOST_SPIRIT_X3_CLASSIFY(kaithi)
+        BOOST_SPIRIT_X3_CLASSIFY(tai_tham)
+        BOOST_SPIRIT_X3_CLASSIFY(lao)
+        BOOST_SPIRIT_X3_CLASSIFY(latin)
+        BOOST_SPIRIT_X3_CLASSIFY(lepcha)
+        BOOST_SPIRIT_X3_CLASSIFY(limbu)
+        BOOST_SPIRIT_X3_CLASSIFY(linear_b)
+        BOOST_SPIRIT_X3_CLASSIFY(lisu)
+        BOOST_SPIRIT_X3_CLASSIFY(lycian)
+        BOOST_SPIRIT_X3_CLASSIFY(lydian)
+        BOOST_SPIRIT_X3_CLASSIFY(malayalam)
+        BOOST_SPIRIT_X3_CLASSIFY(mongolian)
+        BOOST_SPIRIT_X3_CLASSIFY(meetei_mayek)
+        BOOST_SPIRIT_X3_CLASSIFY(myanmar)
+        BOOST_SPIRIT_X3_CLASSIFY(nko)
+        BOOST_SPIRIT_X3_CLASSIFY(ogham)
+        BOOST_SPIRIT_X3_CLASSIFY(ol_chiki)
+        BOOST_SPIRIT_X3_CLASSIFY(old_turkic)
+        BOOST_SPIRIT_X3_CLASSIFY(oriya)
+        BOOST_SPIRIT_X3_CLASSIFY(osmanya)
+        BOOST_SPIRIT_X3_CLASSIFY(phags_pa)
+        BOOST_SPIRIT_X3_CLASSIFY(inscriptional_pahlavi)
+        BOOST_SPIRIT_X3_CLASSIFY(phoenician)
+        BOOST_SPIRIT_X3_CLASSIFY(inscriptional_parthian)
+        BOOST_SPIRIT_X3_CLASSIFY(rejang)
+        BOOST_SPIRIT_X3_CLASSIFY(runic)
+        BOOST_SPIRIT_X3_CLASSIFY(samaritan)
+        BOOST_SPIRIT_X3_CLASSIFY(old_south_arabian)
+        BOOST_SPIRIT_X3_CLASSIFY(saurashtra)
+        BOOST_SPIRIT_X3_CLASSIFY(shavian)
+        BOOST_SPIRIT_X3_CLASSIFY(sinhala)
+        BOOST_SPIRIT_X3_CLASSIFY(sundanese)
+        BOOST_SPIRIT_X3_CLASSIFY(syloti_nagri)
+        BOOST_SPIRIT_X3_CLASSIFY(syriac)
+        BOOST_SPIRIT_X3_CLASSIFY(tagbanwa)
+        BOOST_SPIRIT_X3_CLASSIFY(tai_le)
+        BOOST_SPIRIT_X3_CLASSIFY(new_tai_lue)
+        BOOST_SPIRIT_X3_CLASSIFY(tamil)
+        BOOST_SPIRIT_X3_CLASSIFY(tai_viet)
+        BOOST_SPIRIT_X3_CLASSIFY(telugu)
+        BOOST_SPIRIT_X3_CLASSIFY(tifinagh)
+        BOOST_SPIRIT_X3_CLASSIFY(tagalog)
+        BOOST_SPIRIT_X3_CLASSIFY(thaana)
+        BOOST_SPIRIT_X3_CLASSIFY(thai)
+        BOOST_SPIRIT_X3_CLASSIFY(tibetan)
+        BOOST_SPIRIT_X3_CLASSIFY(ugaritic)
+        BOOST_SPIRIT_X3_CLASSIFY(vai)
+        BOOST_SPIRIT_X3_CLASSIFY(old_persian)
+        BOOST_SPIRIT_X3_CLASSIFY(cuneiform)
+        BOOST_SPIRIT_X3_CLASSIFY(yi)
+        BOOST_SPIRIT_X3_CLASSIFY(inherited)
+        BOOST_SPIRIT_X3_CLASSIFY(common)
+        BOOST_SPIRIT_X3_CLASSIFY(unknown)
+
+#undef BOOST_SPIRIT_X3_BASIC_CLASSIFY
+#undef BOOST_SPIRIT_X3_CLASSIFY
+    };
+
+    template <typename Tag>
+    struct unicode_char_class
+      : char_parser<unicode_char_class<Tag>>
+    {
+        typedef char_encoding::unicode encoding;
+        typedef Tag tag;
+        typedef typename encoding::char_type char_type;
+        typedef char_type attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Char, typename Context>
+        bool test(Char ch, Context const&) const
+        {
+            return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch))
+                && unicode_char_class_base::is(tag(), ch);
+        }
+    };
+
+#define BOOST_SPIRIT_X3_CHAR_CLASS(name)                                           \
+    typedef unicode_char_class<name##_tag> name##_type;                         \
+    name##_type const name = name##_type();                                     \
+    /***/
+
+    namespace unicode
+    {
+        typedef any_char<char_encoding::unicode> char_type;
+        char_type const char_ = char_type();
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CHAR_CLASS(alnum)
+        BOOST_SPIRIT_X3_CHAR_CLASS(alpha)
+        BOOST_SPIRIT_X3_CHAR_CLASS(digit)
+        BOOST_SPIRIT_X3_CHAR_CLASS(xdigit)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cntrl)
+        BOOST_SPIRIT_X3_CHAR_CLASS(graph)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lower)
+        BOOST_SPIRIT_X3_CHAR_CLASS(print)
+        BOOST_SPIRIT_X3_CHAR_CLASS(punct)
+        BOOST_SPIRIT_X3_CHAR_CLASS(space)
+        BOOST_SPIRIT_X3_CHAR_CLASS(blank)
+        BOOST_SPIRIT_X3_CHAR_CLASS(upper)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Major Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CHAR_CLASS(letter)
+        BOOST_SPIRIT_X3_CHAR_CLASS(mark)
+        BOOST_SPIRIT_X3_CHAR_CLASS(number)
+        BOOST_SPIRIT_X3_CHAR_CLASS(separator)
+        BOOST_SPIRIT_X3_CHAR_CLASS(other)
+        BOOST_SPIRIT_X3_CHAR_CLASS(punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(symbol)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode General Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CHAR_CLASS(uppercase_letter)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lowercase_letter)
+        BOOST_SPIRIT_X3_CHAR_CLASS(titlecase_letter)
+        BOOST_SPIRIT_X3_CHAR_CLASS(modifier_letter)
+        BOOST_SPIRIT_X3_CHAR_CLASS(other_letter)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(nonspacing_mark)
+        BOOST_SPIRIT_X3_CHAR_CLASS(enclosing_mark)
+        BOOST_SPIRIT_X3_CHAR_CLASS(spacing_mark)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(decimal_number)
+        BOOST_SPIRIT_X3_CHAR_CLASS(letter_number)
+        BOOST_SPIRIT_X3_CHAR_CLASS(other_number)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(space_separator)
+        BOOST_SPIRIT_X3_CHAR_CLASS(line_separator)
+        BOOST_SPIRIT_X3_CHAR_CLASS(paragraph_separator)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(control)
+        BOOST_SPIRIT_X3_CHAR_CLASS(format)
+        BOOST_SPIRIT_X3_CHAR_CLASS(private_use)
+        BOOST_SPIRIT_X3_CHAR_CLASS(surrogate)
+        BOOST_SPIRIT_X3_CHAR_CLASS(unassigned)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(dash_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(open_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(close_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(connector_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(other_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(initial_punctuation)
+        BOOST_SPIRIT_X3_CHAR_CLASS(final_punctuation)
+
+        BOOST_SPIRIT_X3_CHAR_CLASS(math_symbol)
+        BOOST_SPIRIT_X3_CHAR_CLASS(currency_symbol)
+        BOOST_SPIRIT_X3_CHAR_CLASS(modifier_symbol)
+        BOOST_SPIRIT_X3_CHAR_CLASS(other_symbol)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Derived Categories
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CHAR_CLASS(alphabetic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(uppercase)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lowercase)
+        BOOST_SPIRIT_X3_CHAR_CLASS(white_space)
+        BOOST_SPIRIT_X3_CHAR_CLASS(hex_digit)
+        BOOST_SPIRIT_X3_CHAR_CLASS(noncharacter_code_point)
+        BOOST_SPIRIT_X3_CHAR_CLASS(default_ignorable_code_point)
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Unicode Scripts
+    ///////////////////////////////////////////////////////////////////////////
+        BOOST_SPIRIT_X3_CHAR_CLASS(arabic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(imperial_aramaic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(armenian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(avestan)
+        BOOST_SPIRIT_X3_CHAR_CLASS(balinese)
+        BOOST_SPIRIT_X3_CHAR_CLASS(bamum)
+        BOOST_SPIRIT_X3_CHAR_CLASS(bengali)
+        BOOST_SPIRIT_X3_CHAR_CLASS(bopomofo)
+        BOOST_SPIRIT_X3_CHAR_CLASS(braille)
+        BOOST_SPIRIT_X3_CHAR_CLASS(buginese)
+        BOOST_SPIRIT_X3_CHAR_CLASS(buhid)
+        BOOST_SPIRIT_X3_CHAR_CLASS(canadian_aboriginal)
+        BOOST_SPIRIT_X3_CHAR_CLASS(carian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cham)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cherokee)
+        BOOST_SPIRIT_X3_CHAR_CLASS(coptic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cypriot)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cyrillic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(devanagari)
+        BOOST_SPIRIT_X3_CHAR_CLASS(deseret)
+        BOOST_SPIRIT_X3_CHAR_CLASS(egyptian_hieroglyphs)
+        BOOST_SPIRIT_X3_CHAR_CLASS(ethiopic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(georgian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(glagolitic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(gothic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(greek)
+        BOOST_SPIRIT_X3_CHAR_CLASS(gujarati)
+        BOOST_SPIRIT_X3_CHAR_CLASS(gurmukhi)
+        BOOST_SPIRIT_X3_CHAR_CLASS(hangul)
+        BOOST_SPIRIT_X3_CHAR_CLASS(han)
+        BOOST_SPIRIT_X3_CHAR_CLASS(hanunoo)
+        BOOST_SPIRIT_X3_CHAR_CLASS(hebrew)
+        BOOST_SPIRIT_X3_CHAR_CLASS(hiragana)
+        BOOST_SPIRIT_X3_CHAR_CLASS(katakana_or_hiragana)
+        BOOST_SPIRIT_X3_CHAR_CLASS(old_italic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(javanese)
+        BOOST_SPIRIT_X3_CHAR_CLASS(kayah_li)
+        BOOST_SPIRIT_X3_CHAR_CLASS(katakana)
+        BOOST_SPIRIT_X3_CHAR_CLASS(kharoshthi)
+        BOOST_SPIRIT_X3_CHAR_CLASS(khmer)
+        BOOST_SPIRIT_X3_CHAR_CLASS(kannada)
+        BOOST_SPIRIT_X3_CHAR_CLASS(kaithi)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tai_tham)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lao)
+        BOOST_SPIRIT_X3_CHAR_CLASS(latin)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lepcha)
+        BOOST_SPIRIT_X3_CHAR_CLASS(limbu)
+        BOOST_SPIRIT_X3_CHAR_CLASS(linear_b)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lisu)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lycian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(lydian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(malayalam)
+        BOOST_SPIRIT_X3_CHAR_CLASS(mongolian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(meetei_mayek)
+        BOOST_SPIRIT_X3_CHAR_CLASS(myanmar)
+        BOOST_SPIRIT_X3_CHAR_CLASS(nko)
+        BOOST_SPIRIT_X3_CHAR_CLASS(ogham)
+        BOOST_SPIRIT_X3_CHAR_CLASS(ol_chiki)
+        BOOST_SPIRIT_X3_CHAR_CLASS(old_turkic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(oriya)
+        BOOST_SPIRIT_X3_CHAR_CLASS(osmanya)
+        BOOST_SPIRIT_X3_CHAR_CLASS(phags_pa)
+        BOOST_SPIRIT_X3_CHAR_CLASS(inscriptional_pahlavi)
+        BOOST_SPIRIT_X3_CHAR_CLASS(phoenician)
+        BOOST_SPIRIT_X3_CHAR_CLASS(inscriptional_parthian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(rejang)
+        BOOST_SPIRIT_X3_CHAR_CLASS(runic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(samaritan)
+        BOOST_SPIRIT_X3_CHAR_CLASS(old_south_arabian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(saurashtra)
+        BOOST_SPIRIT_X3_CHAR_CLASS(shavian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(sinhala)
+        BOOST_SPIRIT_X3_CHAR_CLASS(sundanese)
+        BOOST_SPIRIT_X3_CHAR_CLASS(syloti_nagri)
+        BOOST_SPIRIT_X3_CHAR_CLASS(syriac)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tagbanwa)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tai_le)
+        BOOST_SPIRIT_X3_CHAR_CLASS(new_tai_lue)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tamil)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tai_viet)
+        BOOST_SPIRIT_X3_CHAR_CLASS(telugu)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tifinagh)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tagalog)
+        BOOST_SPIRIT_X3_CHAR_CLASS(thaana)
+        BOOST_SPIRIT_X3_CHAR_CLASS(thai)
+        BOOST_SPIRIT_X3_CHAR_CLASS(tibetan)
+        BOOST_SPIRIT_X3_CHAR_CLASS(ugaritic)
+        BOOST_SPIRIT_X3_CHAR_CLASS(vai)
+        BOOST_SPIRIT_X3_CHAR_CLASS(old_persian)
+        BOOST_SPIRIT_X3_CHAR_CLASS(cuneiform)
+        BOOST_SPIRIT_X3_CHAR_CLASS(yi)
+        BOOST_SPIRIT_X3_CHAR_CLASS(inherited)
+        BOOST_SPIRIT_X3_CHAR_CLASS(common)
+        BOOST_SPIRIT_X3_CHAR_CLASS(unknown)
+    }
+
+#undef BOOST_SPIRIT_X3_CHAR_CLASS
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,20 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CORE_APRIL_04_2012_0318PM)
+#define BOOST_SPIRIT_X3_CORE_APRIL_04_2012_0318PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parse.hpp>
+//~ #include <boost/spirit/home/x3/core/parse_attr.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/action.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/action.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,120 @@
+/*=============================================================================
+    Copyright (arg) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_ACTION_JANUARY_07_2007_1128AM)
+#define SPIRIT_ACTION_JANUARY_07_2007_1128AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/make_attribute.hpp>
+#include <boost/spirit/home/x3/core/call.hpp>
+#include <boost/spirit/home/x3/nonterminal/detail/transform_attribute.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct raw_attribute_type;
+    struct parse_pass_context_tag;
+
+    template <typename Context>
+    inline bool& _pass(Context const& context)
+    {
+        return x3::get<parse_pass_context_tag>(context);
+    }
+
+    template <typename Subject, typename Action>
+    struct action : unary_parser<Subject, action<Subject, Action>>
+    {
+        typedef unary_parser<Subject, action<Subject, Action>> base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const has_action = true;
+
+        action(Subject const& subject, Action f)
+          : base_type(subject), f(f) {}
+
+        template <typename Iterator, typename Context, typename RuleContext, typename Attribute>
+        bool call_action(
+            Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr) const
+        {
+            bool pass = true;
+            auto action_context = make_context<parse_pass_context_tag>(pass, context);
+            call(f, first, last, action_context, rcontext, attr);
+            return pass;
+        }
+
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse_main(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr) const
+        {
+            Iterator save = first;
+            if (this->subject.parse(first, last, context, rcontext, attr))
+            {
+                if (call_action(first, last, context, rcontext, attr))
+                    return true;
+
+                // reset iterators if semantic action failed the match
+                // retrospectively
+                first = save;
+            }
+            return false;
+        }
+        
+        // attr==raw_attribute_type, action wants iterator_range (see raw.hpp)
+        template <typename Iterator, typename Context, typename RuleContext>
+        bool parse_main(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, raw_attribute_type&) const
+        {
+            boost::iterator_range<Iterator> rng;
+            // synthesize the attribute since one is not supplied
+            return parse_main(first, last, context, rcontext, rng);
+        }
+
+        // attr==unused, action wants attribute
+        template <typename Iterator, typename Context, typename RuleContext>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, unused_type) const
+        {
+            typedef typename
+                traits::attribute_of<action<Subject, Action>, Context>::type
+            attribute_type;
+            typedef traits::make_attribute<attribute_type, unused_type> make_attribute;
+            typedef traits::transform_attribute<
+                typename make_attribute::type, attribute_type, parser_id>
+            transform;
+
+            // synthesize the attribute since one is not supplied
+            typename make_attribute::type made_attr = make_attribute::call(unused_type());
+            typename transform::type attr = transform::pre(made_attr);
+            return parse_main(first, last, context, rcontext, attr);
+        }
+        
+        // main parse function
+        template <typename Iterator, typename Context
+            , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr) const
+        {
+            return parse_main(first, last, context, rcontext, attr);
+        }
+
+        Action f;
+    };
+
+    template <typename P, typename Action>
+    inline action<typename extension::as_parser<P>::value_type, Action>
+    operator/(P const& p, Action f)
+    {
+        return {as_parser(p), f};
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/call.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_CALL_CONTEXT_MAY_26_2014_0234PM)
+#define SPIRIT_CALL_CONTEXT_MAY_26_2014_0234PM
+
+#include <type_traits>
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/utility/is_callable.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ////////////////////////////////////////////////////////////////////////////
+    struct rule_val_context_tag;
+
+    template <typename Context>
+    inline auto _val(Context const& context)
+        -> decltype(x3::get<rule_val_context_tag>(context))
+    {
+        return x3::get<rule_val_context_tag>(context);
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+    struct where_context_tag;
+
+    template <typename Context>
+    inline auto _where(Context const& context)
+        -> decltype(x3::get<where_context_tag>(context))
+    {
+        return x3::get<where_context_tag>(context);
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+    struct attr_context_tag;
+
+    template <typename Context>
+    inline auto _attr(Context const& context)
+        -> decltype(x3::get<attr_context_tag>(context))
+    {
+        return x3::get<attr_context_tag>(context);
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+    namespace detail
+    {
+        template <typename F, typename Context>
+        auto call(F f, Context const& context, mpl::true_)
+        {
+            return f(context);
+        }
+
+        template <typename F, typename Context>
+        auto call(F f, Context const& context, mpl::false_)
+        {
+            return f();
+        }
+    }
+
+    template <
+        typename F, typename Iterator
+      , typename Context, typename RuleContext, typename Attribute>
+    auto call(
+        F f, Iterator& first, Iterator const& last
+      , Context const& context, RuleContext& rcontext, Attribute& attr)
+    {
+        boost::iterator_range<Iterator> rng(first, last);
+        auto val_context = make_context<rule_val_context_tag>(rcontext, context);
+        auto where_context = make_context<where_context_tag>(rng, val_context);
+        auto attr_context = make_context<attr_context_tag>(attr, where_context);
+        return detail::call(f, attr_context, is_callable<F(decltype(attr_context) const&)>());
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/detail/parse_into_container.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,248 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_PARSE_INTO_CONTAINER_JAN_15_2013_0957PM)
+#define SPIRIT_PARSE_INTO_CONTAINER_JAN_15_2013_0957PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <type_traits>
+
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/value_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/handles_container.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/support/traits/is_substitute.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/fusion/include/front.hpp>
+#include <boost/fusion/include/back.hpp>
+#include <boost/variant/apply_visitor.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    template <typename Attribute, typename Value>
+    struct saver_visitor;
+
+    // save to associative fusion container where Key is simple type
+    template <typename Key, typename Enable = void>
+    struct save_to_assoc_attr
+    {
+        template <typename Value, typename Attribute>
+        static void call(const Key, Value& value, Attribute& attr)
+        {
+            traits::move_to(value, fusion::at_key<Key>(attr));
+        }
+    };
+
+	
+    // save to associative fusion container where Key
+    // is variant over possible keys
+    template <typename ...T>
+    struct save_to_assoc_attr<variant<T...> >
+    {
+        typedef variant<T...> variant_t;
+            
+        template <typename Value, typename Attribute>
+        static void call(const variant_t key, Value& value, Attribute& attr)
+        {
+            apply_visitor(saver_visitor<Attribute, Value>(attr, value), key);
+        }
+    };
+
+    template <typename Attribute, typename Value>
+    struct saver_visitor  : boost::static_visitor<void>
+    {
+        saver_visitor(Attribute& attr, Value& value)
+            : attr(attr), value(value) {};
+
+        Attribute& attr;
+        Value& value;
+            
+        template <typename Key>
+        void operator()(Key) const
+        {
+            save_to_assoc_attr<Key>::call(Key(), value,attr);
+        }
+    };
+
+
+    template <typename Parser>
+    struct parse_into_container_base_impl
+    {
+    private:
+
+        // Parser has attribute (synthesize; Attribute is a container)
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        static bool call_synthesize(
+            Parser const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr)
+        {
+            // synthesized attribute needs to be value initialized
+            typedef typename
+                traits::container_value<Attribute>::type
+            value_type;
+            value_type val = traits::value_initialize<value_type>::call();
+
+            if (!parser.parse(first, last, context, rcontext, val))
+                return false;
+
+            // push the parsed value into our attribute
+            traits::push_back(attr, val);
+            return true;
+        }
+
+        // Parser has attribute (synthesize; Attribute is a single element fusion sequence)
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        static bool call_synthesize_into_fusion_seq(Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::false_ /* is_associative */)
+        {
+            static_assert(traits::has_size<Attribute, 1>::value,
+                "Expecting a single element fusion sequence");
+            return call_synthesize(parser, first, last, context, rcontext,
+                fusion::front(attr));
+        }
+
+        // Parser has attribute (synthesize; Attribute is fusion map sequence)
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call_synthesize_into_fusion_seq(
+            Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::true_ /*is_associative*/)
+        {
+            using attribute_type = typename traits::attribute_of<Parser, Context>::type;
+            static_assert(traits::has_size<attribute_type, 2>::value,
+                "To parse directly into fusion map parser must produce 2 element attr");
+
+            // use type of  first element of attribute as key
+            using key = typename std::remove_reference<
+            typename fusion::result_of::front<attribute_type>::type>::type;
+
+            attribute_type attr_;
+            if (!parser.parse(first, last, context, rcontext, attr_))
+                return false;
+
+            save_to_assoc_attr<key>::call(fusion::front(attr_), fusion::back(attr_), attr);
+            return true;
+        }
+
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call_synthesize_dispatch_by_seq(Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::true_ /*is_sequence*/)
+        {
+            return call_synthesize_into_fusion_seq(
+                parser, first, last, context, rcontext, attr
+              , fusion::traits::is_associative<Attribute>());
+        }
+
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call_synthesize_dispatch_by_seq(Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::false_ /*is_sequence*/)
+        {
+            return call_synthesize(parser, first, last, context, rcontext, attr);
+        }
+
+        // Parser has attribute (synthesize)
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call(Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::true_)
+        {
+            return call_synthesize_dispatch_by_seq(parser, first, last, context, rcontext, attr
+                , fusion::traits::is_sequence<Attribute>());
+        }
+
+        // Parser has no attribute (pass unused)
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call(
+            Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr, mpl::false_)
+        {
+            return parser.parse(first, last, context, rcontext, unused);
+        }
+	
+
+    public:
+
+        template <typename Iterator, typename Context, typename RContext, typename Attribute>
+        static bool call(Parser const& parser
+          , Iterator& first, Iterator const& last, Context const& context
+          , RContext& rcontext, Attribute& attr)
+        {
+            return call(parser, first, last, context, rcontext, attr
+              , mpl::bool_<traits::has_attribute<Parser, Context>::value>());
+        }
+    };
+
+    template <typename Parser, typename Context, typename RContext, typename Enable = void>
+    struct parse_into_container_impl : parse_into_container_base_impl<Parser> {};
+
+    template <typename Parser, typename Container, typename RContext, typename Context>
+    struct parser_attr_is_substitute_for_container_value
+        : traits::is_substitute<
+            typename traits::attribute_of<Parser, Context>::type
+          , typename traits::container_value<Container>::type
+        >
+    {};
+
+    template <typename Parser, typename Context, typename RContext>
+    struct parse_into_container_impl<Parser, Context, RContext,
+        typename enable_if<traits::handles_container<Parser, Context>>::type>
+    {
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            Parser const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::true_)
+        {
+            return parse_into_container_base_impl<Parser>::call(
+                parser, first, last, context, rcontext, attr);
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            Parser const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::false_)
+        {
+            return parser.parse(first, last, context, rcontext, attr);
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(Parser const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr)
+        {
+            return call(parser, first, last, context, rcontext, attr,
+                parser_attr_is_substitute_for_container_value<
+                    Parser, Attribute, Context, RContext>());
+        }
+    };
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_into_container(
+        Parser const& parser
+      , Iterator& first, Iterator const& last, Context const& context
+      , RContext& rcontext, Attribute& attr)
+    {
+        return parse_into_container_impl<Parser, Context, RContext>::call(
+            parser, first, last, context, rcontext, attr);
+    }
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/parse.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,190 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_PARSE_APRIL_16_2006_0442PM)
+#define BOOST_SPIRIT_X3_PARSE_APRIL_16_2006_0442PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/concept_check.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Attribute>
+    inline bool
+    parse_main(
+        Iterator& first
+      , Iterator last
+      , Parser const& p
+      , Attribute& attr)
+    {
+        // Make sure the iterator is at least a forward_iterator. If you got a
+        // compilation error here, then you are using an input_iterator while
+        // calling this function. You need to supply at least a forward_iterator
+        // instead.
+        BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+        // If you get an error no matching function for call to 'as_parser'
+        // here, then p is not a parser or there is no suitable conversion
+        // from p to a parser.
+        return as_parser(p).parse(first, last, unused, unused, attr);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Attribute>
+    inline bool
+    parse(
+        Iterator& first
+      , Iterator last
+      , Parser const& p
+      , Attribute& attr)
+    {
+        return parse_main(first, last, p, attr);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Attribute>
+    inline bool
+    parse(
+        Iterator const& first_
+      , Iterator last
+      , Parser const& p
+      , Attribute& attr)
+    {
+        Iterator first = first_;
+        return parse_main(first, last, p, attr);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser>
+    inline bool
+    parse(
+        Iterator& first
+      , Iterator last
+      , Parser const& p)
+    {
+        return parse_main(first, last, p, unused);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser>
+    inline bool
+    parse(
+        Iterator const& first_
+      , Iterator last
+      , Parser const& p)
+    {
+        Iterator first = first_;
+        return parse_main(first, last, p, unused);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    enum class skip_flag
+    {
+        post_skip,      // force post-skipping in phrase_parse()
+        dont_post_skip  // inhibit post-skipping in phrase_parse()
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
+    inline bool
+    phrase_parse_main(
+        Iterator& first
+      , Iterator last
+      , Parser const& p
+      , Skipper const& s
+      , Attribute& attr
+      , skip_flag post_skip = skip_flag::post_skip)
+    {
+        // Make sure the iterator is at least a forward_iterator. If you got a
+        // compilation error here, then you are using an input_iterator while
+        // calling this function. You need to supply at least a forward_iterator
+        // instead.
+        BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
+
+        // If you get an error no matching function for call to 'as_parser'
+        // here, for either p or s, then p or s is not a parser or there is
+        // no suitable conversion from p to a parser.
+        auto skipper_ctx = make_context<skipper_tag>(as_parser(s));
+        bool r = as_parser(p).parse(first, last, skipper_ctx, unused, attr);
+        if (post_skip == skip_flag::post_skip)
+            x3::skip_over(first, last, skipper_ctx);
+        return r;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
+    inline bool
+    phrase_parse(
+        Iterator& first
+      , Iterator last
+      , Parser const& p
+      , Skipper const& s
+      , Attribute& attr
+      , skip_flag post_skip = skip_flag::post_skip)
+    {
+        return phrase_parse_main(first, last, p, s, attr, post_skip);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
+    inline bool
+    phrase_parse(
+        Iterator const& first_
+      , Iterator last
+      , Parser const& p
+      , Skipper const& s
+      , Attribute& attr
+      , skip_flag post_skip = skip_flag::post_skip)
+    {
+        Iterator first = first_;
+        return phrase_parse_main(first, last, p, s, attr, post_skip);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Skipper>
+    inline bool
+    phrase_parse(
+        Iterator& first
+      , Iterator last
+      , Parser const& p
+      , Skipper const& s
+      , skip_flag post_skip = skip_flag::post_skip)
+    {
+        return phrase_parse_main(first, last, p, s, unused, post_skip);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Parser, typename Skipper>
+    inline bool
+    phrase_parse(
+        Iterator const& first_
+      , Iterator last
+      , Parser const& p
+      , Skipper const& s
+      , skip_flag post_skip = skip_flag::post_skip)
+    {
+        Iterator first = first_;
+        return phrase_parse_main(first, last, p, s, unused, post_skip);
+    }
+    
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Skipper>
+    struct phrase_parse_context
+    {
+        typedef decltype(
+            make_context<skipper_tag>(as_parser(std::declval<Skipper>())))
+        type;
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/parser.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,239 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_PARSER_OCTOBER_16_2008_0254PM)
+#define BOOST_SPIRIT_X3_PARSER_OCTOBER_16_2008_0254PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/declval.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+#include <string>
+
+#if !defined(BOOST_SPIRIT_X3_NO_RTTI)
+#include <typeinfo>
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    using x3::unused_type;
+    using x3::unused;
+    using x3::get;
+
+    template <typename Subject, typename Action>
+    struct action;
+
+    template <typename Subject, typename Handler>
+    struct guard;
+
+    struct parser_base {};
+    struct parser_id;
+
+    template <typename Derived>
+    struct parser : parser_base
+    {
+        typedef Derived derived_type;
+        static bool const handles_container = false;
+        static bool const is_pass_through_unary = false;
+        static bool const has_action = false;
+
+        Derived const& derived() const
+        {
+            return *static_cast<Derived const*>(this);
+        }
+
+        template <typename Action>
+        action<Derived, Action>
+        operator[](Action f) const
+        {
+            return action<Derived, Action>(this->derived(), f);
+        }
+
+        template <typename Handler>
+        guard<Derived, Handler>
+        on_error(Handler f) const
+        {
+            return guard<Derived, Handler>(this->derived(), f);
+        }
+    };
+
+    struct unary_category;
+    struct binary_category;
+
+    template <typename Subject, typename Derived>
+    struct unary_parser : parser<Derived>
+    {
+        typedef unary_category category;
+        typedef Subject subject_type;
+        static bool const has_action = Subject::has_action;
+
+        unary_parser(Subject subject)
+            : subject(subject) {}
+
+        unary_parser const& get_unary() const { return *this; }
+
+        Subject subject;
+    };
+
+    template <typename Left, typename Right, typename Derived>
+    struct binary_parser : parser<Derived>
+    {
+        typedef binary_category category;
+        typedef Left left_type;
+        typedef Right right_type;
+        static bool const has_action =
+            left_type::has_action || right_type::has_action;
+
+        binary_parser(Left left, Right right)
+            : left(left), right(right) {}
+
+        binary_parser const& get_binary() const { return *this; }
+
+        Left left;
+        Right right;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // as_parser: convert a type, T, into a parser.
+    ///////////////////////////////////////////////////////////////////////////
+    namespace extension
+    {
+        namespace detail
+        {
+            namespace as_parser_guard
+            {
+                void as_spirit_parser(...);
+
+                template<typename T, typename R =
+                    decltype(as_spirit_parser(boost::declval<T const&>()))>
+                struct deduce_as_parser
+                {
+                    typedef R type;
+                    typedef typename
+                        boost::remove_cv<
+                            typename boost::remove_reference<R>::type
+                        >::type
+                    value_type;
+
+                    static type call(T const& v)
+                    {
+                        return as_spirit_parser(v);
+                    }
+                };
+                template<typename T>
+                struct deduce_as_parser<T, void>
+                {};
+            }
+            using as_parser_guard::deduce_as_parser;
+        }
+
+        template <typename T, typename Enable = void>
+        struct as_parser : detail::deduce_as_parser<T> {};
+
+        template <>
+        struct as_parser<unused_type>
+        {
+            typedef unused_type type;
+            typedef unused_type value_type;
+            static type call(unused_type)
+            {
+                return unused;
+            }
+        };
+
+        template <typename Derived>
+        struct as_parser<Derived
+            , typename enable_if<is_base_of<parser_base, Derived>>::type>
+        {
+            typedef Derived const& type;
+            typedef Derived value_type;
+            static type call(Derived const& p)
+            {
+                return p;
+            }
+        };
+
+        template <typename Derived>
+        struct as_parser<parser<Derived>>
+        {
+            typedef Derived const& type;
+            typedef Derived value_type;
+            static type call(parser<Derived> const& p)
+            {
+                return p.derived();
+            }
+        };
+    }
+
+    template <typename T>
+    inline typename extension::as_parser<T>::type
+    as_parser(T const& x)
+    {
+        return extension::as_parser<T>::call(x);
+    }
+
+    template <typename Derived>
+    inline Derived const&
+    as_parser(parser<Derived> const& p)
+    {
+        return p.derived();
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // The main what function
+    //
+    // Note: unlike Spirit2, spirit parsers are no longer required to have a
+    // "what" member function. In X3, we specialize the get_info struct
+    // below where needed. If a specialization is not provided, the default
+    // below will be used. The default "what" result will be the typeid
+    // name of the parser if BOOST_SPIRIT_X3_NO_RTTI is not defined, otherwise
+    // "undefined"
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Parser, typename Enable = void>
+    struct get_info
+    {
+        typedef std::string result_type;
+        std::string operator()(Parser const&) const
+        {
+#if !defined(BOOST_SPIRIT_X3_NO_RTTI)
+            return typeid(Parser).name();
+#else
+            return "undefined";
+#endif
+        }
+    };
+
+    template <typename Parser>
+    std::string what(Parser const& p)
+    {
+        return get_info<Parser>()(p);
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Subject, typename Derived, typename Context>
+    struct has_attribute<x3::unary_parser<Subject, Derived>, Context>
+        : has_attribute<Subject, Context> {};
+
+    template <typename Left, typename Right, typename Derived, typename Context>
+    struct has_attribute<x3::binary_parser<Left, Right, Derived>, Context>
+        : mpl::bool_<has_attribute<Left, Context>::value ||
+                has_attribute<Right, Context>::value> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/proxy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_PROXY_FEBRUARY_1_2013_0211PM)
+#define BOOST_SPIRIT_X3_PROXY_FEBRUARY_1_2013_0211PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject, typename Derived>
+    struct proxy : unary_parser<Subject, Derived>
+    {
+        static bool const is_pass_through_unary = true;
+
+        proxy(Subject const& subject)
+          : unary_parser<Subject, Derived>(subject) {}
+
+        // Overload this when appropriate. The proxy parser will pick up
+        // the most derived overload.
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute, typename Category>
+        bool parse_subject(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr, Category) const
+        {
+            this->subject.parse(first, last, context, rcontext, attr);
+            return true;
+        }
+
+        // Main entry point.
+        template <typename Iterator, typename Context
+          , typename RuleContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RuleContext& rcontext, Attribute& attr) const
+        {
+            return this->derived().parse_subject(first, last, context, rcontext, attr
+                , typename traits::attribute_category<Attribute>::type());
+        }
+    };
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/core/skip_over.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,104 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SKIP_APRIL_16_2006_0625PM)
+#define BOOST_SPIRIT_X3_SKIP_APRIL_16_2006_0625PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/declval.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Move the /first/ iterator to the first non-matching position
+    // given a skip-parser. The function is a no-op if unused_type or
+    // unused_skipper is passed as the skip-parser.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Skipper>
+    struct unused_skipper : unused_type
+    {
+        unused_skipper(Skipper const& skipper)
+          : skipper(skipper) {}
+        Skipper const& skipper;
+    };
+
+    namespace detail
+    {
+        template <typename Skipper>
+        struct is_unused_skipper
+          : mpl::false_ {};
+
+        template <typename Skipper>
+        struct is_unused_skipper<unused_skipper<Skipper>>
+          : mpl::true_ {};
+
+        template <> 
+        struct is_unused_skipper<unused_type>
+          : mpl::true_ {};
+
+        template <typename Skipper>
+        inline Skipper const&
+        get_unused_skipper(Skipper const& skipper)
+        {
+            return skipper;
+        }
+        template <typename Skipper>
+        inline Skipper const&
+        get_unused_skipper(unused_skipper<Skipper> const& unused_skipper)
+        {
+            return unused_skipper.skipper;
+        }
+
+        template <typename Iterator, typename Skipper>
+        inline void skip_over(
+            Iterator& first, Iterator const& last, Skipper const& skipper)
+        {
+            while (first != last && skipper.parse(first, last, unused, unused, unused))
+                /***/;
+        }
+
+        template <typename Iterator>
+        inline void skip_over(Iterator&, Iterator const&, unused_type)
+        {
+        }
+
+        template <typename Iterator, typename Skipper>
+        inline void skip_over(
+            Iterator&, Iterator const&, unused_skipper<Skipper> const&)
+        {
+        }
+    }
+
+    // this tag is used to find the skipper from the context
+    struct skipper_tag;
+    
+    template <typename Context>
+    struct has_skipper
+      : mpl::not_<detail::is_unused_skipper<
+            typename remove_cv<typename remove_reference<
+                decltype(x3::get<skipper_tag>(boost::declval<Context>()))
+            >::type>::type
+        >> {};
+
+    template <typename Iterator, typename Context>
+    inline void skip_over(
+        Iterator& first, Iterator const& last, Context const& context)
+    {
+        detail::skip_over(first, last, x3::get<skipper_tag>(context));
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_DIRECTIVE_FEBRUARY_05_2007_0313PM)
+#define BOOST_SPIRIT_X3_DIRECTIVE_FEBRUARY_05_2007_0313PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+//~ #include <boost/spirit/home/x3/directive/as.hpp>
+//~ #include <boost/spirit/home/x3/directive/encoding.hpp>
+//~ #include <boost/spirit/home/x3/directive/hold.hpp>
+#include <boost/spirit/home/x3/directive/expect.hpp>
+#include <boost/spirit/home/x3/directive/lexeme.hpp>
+#include <boost/spirit/home/x3/directive/no_skip.hpp>
+//~ #include <boost/spirit/home/x3/directive/matches.hpp>
+//~ #include <boost/spirit/home/x3/directive/no_case.hpp>
+#include <boost/spirit/home/x3/directive/omit.hpp>
+#include <boost/spirit/home/x3/directive/raw.hpp>
+//~ #include <boost/spirit/home/x3/directive/repeat.hpp>
+#include <boost/spirit/home/x3/directive/skip.hpp>
+#include <boost/spirit/home/x3/directive/with.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/expect.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,80 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_EXPECT_MARCH_16_2012_1024PM)
+#define SPIRIT_EXPECT_MARCH_16_2012_1024PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/throw_exception.hpp>
+#include <stdexcept>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Iterator>
+    struct expectation_failure : std::runtime_error
+    {
+    public:
+
+        expectation_failure(Iterator where, std::string const& which)
+          : std::runtime_error("boost::spirit::x3::expectation_failure")
+          , where_(where), which_(which)
+        {}
+        ~expectation_failure() throw() {}
+        
+        std::string which() const { return which_; }
+        Iterator const& where() const { return where_; }
+        
+    private:
+
+        Iterator where_;
+        std::string which_;
+    };
+
+    template <typename Subject>
+    struct expect_directive : unary_parser<Subject, expect_directive<Subject>>
+    {
+        typedef unary_parser<Subject, expect_directive<Subject> > base_type;
+        static bool const is_pass_through_unary = true;
+
+        expect_directive(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            bool r = this->subject.parse(first, last, context, rcontext, attr);
+
+            if (!r)
+            {
+                boost::throw_exception(
+                    expectation_failure<Iterator>(
+                        first, what(this->subject)));
+            }
+            return r;
+        }
+    };
+
+    struct expect_gen
+    {
+        template <typename Subject>
+        expect_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    expect_gen const expect = expect_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/lexeme.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,84 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_LEXEME_MARCH_24_2007_0802AM)
+#define SPIRIT_LEXEME_MARCH_24_2007_0802AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct lexeme_directive : unary_parser<Subject, lexeme_directive<Subject>>
+    {
+        typedef unary_parser<Subject, lexeme_directive<Subject> > base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        lexeme_directive(Subject const& subject)
+          : base_type(subject) {}
+        
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename enable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            x3::skip_over(first, last, context);
+            auto const& skipper = x3::get<skipper_tag>(context);
+
+            typedef unused_skipper<
+                typename remove_reference<decltype(skipper)>::type>
+            unused_skipper_type;
+            unused_skipper_type unused_skipper(skipper);
+
+            return this->subject.parse(
+                first, last
+              , make_context<skipper_tag>(unused_skipper, context)
+              , rcontext
+              , attr);
+        }
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename disable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            //  no need to pre-skip if skipper is unused
+            //- x3::skip_over(first, last, context);
+
+            return this->subject.parse(
+                first, last
+              , context
+              , rcontext
+              , attr);
+        }
+    };
+
+    struct lexeme_gen
+    {
+        template <typename Subject>
+        lexeme_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    lexeme_gen const lexeme = lexeme_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/no_skip.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,82 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_NO_SKIP_JAN_16_2010_0802PM)
+#define SPIRIT_NO_SKIP_JAN_16_2010_0802PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    // same as lexeme[], but does not pre-skip
+    template <typename Subject>
+    struct no_skip_directive : unary_parser<Subject, no_skip_directive<Subject>>
+    {
+        typedef unary_parser<Subject, no_skip_directive<Subject> > base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        no_skip_directive(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename enable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            auto const& skipper = x3::get<skipper_tag>(context);
+
+            typedef unused_skipper<
+                typename remove_reference<decltype(skipper)>::type>
+            unused_skipper_type;
+            unused_skipper_type unused_skipper(skipper);
+
+            return this->subject.parse(
+                first, last
+              , make_context<skipper_tag>(unused_skipper, context)
+              , rcontext
+              , attr);
+        }
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename disable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            return this->subject.parse(
+                first, last
+              , context
+              , rcontext
+              , attr);
+        }
+    };
+
+    struct no_skip_gen
+    {
+        template <typename Subject>
+        no_skip_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    no_skip_gen const no_skip = no_skip_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/omit.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,55 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_OMIT_MARCH_24_2007_0802AM)
+#define SPIRIT_OMIT_MARCH_24_2007_0802AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // omit_directive forces the attribute of subject parser
+    // to be unused_type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Subject>
+    struct omit_directive : unary_parser<Subject, omit_directive<Subject>>
+    {
+        typedef unary_parser<Subject, omit_directive<Subject> > base_type;
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        typedef Subject subject_type;
+        omit_directive(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context, typename RContext>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, unused_type) const
+        {
+            return this->subject.parse(first, last, context, rcontext, unused);
+        }
+    };
+
+    struct omit_gen
+    {
+        template <typename Subject>
+        omit_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    omit_gen const omit = omit_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/raw.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_X3_RAW_APRIL_9_2007_0912AM)
+#define SPIRIT_X3_RAW_APRIL_9_2007_0912AM
+
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/range/iterator_range.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    // this is a pseudo attribute type indicating that the parser wants the
+    // iterator range pointing to the [first, last) matching characters from
+    // the input iterators.
+    struct raw_attribute_type {};
+
+    template <typename Subject>
+    struct raw_directive : unary_parser<Subject, raw_directive<Subject>>
+    {
+        typedef unary_parser<Subject, raw_directive<Subject> > base_type;
+        typedef raw_attribute_type attribute_type;
+        static bool const handles_container = Subject::handles_container;
+        typedef Subject subject_type;
+
+        raw_directive(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+            , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            x3::skip_over(first, last, context);
+            Iterator i = first;
+            if (this->subject.parse(i, last, context, rcontext, unused))
+            {
+                traits::move_to(first, i, attr);
+                first = i;
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Iterator, typename Context, typename RContext>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, unused_type) const
+        {
+            return this->subject.parse(first, last, context, rcontext, unused);
+        }
+    };
+
+    struct raw_gen
+    {
+        template <typename Subject>
+        raw_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    raw_gen const raw = raw_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/skip.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,124 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_SKIP_JANUARY_26_2008_0422PM)
+#define SPIRIT_SKIP_JANUARY_26_2008_0422PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct reskip_directive : unary_parser<Subject, reskip_directive<Subject>>
+    {
+        typedef unary_parser<Subject, reskip_directive<Subject>> base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        reskip_directive(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename disable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            auto const& skipper =
+                detail::get_unused_skipper(x3::get<skipper_tag>(context));
+
+            return this->subject.parse(
+                first, last
+              , make_context<skipper_tag>(skipper, context)
+              , rcontext
+              , attr);
+        }
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        typename enable_if<has_skipper<Context>, bool>::type
+        parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            return this->subject.parse(
+                first, last
+              , context
+              , rcontext
+              , attr);
+        }
+    };
+
+    template <typename Subject, typename Skipper>
+    struct skip_directive : unary_parser<Subject, skip_directive<Subject, Skipper>>
+    {
+        typedef unary_parser<Subject, skip_directive<Subject, Skipper>> base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        skip_directive(Subject const& subject, Skipper const& skipper)
+          : base_type(subject)
+          , skipper(skipper)
+        {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            return this->subject.parse(
+                first, last
+              , make_context<skipper_tag>(skipper, context)
+              , rcontext
+              , attr);
+        }
+
+        Skipper const skipper;
+    };
+
+    struct reskip_gen
+    {
+        template <typename Skipper>
+        struct skip_gen
+        {
+            explicit skip_gen(Skipper const& skipper)
+              : skipper_(skipper) {}
+
+            template <typename Subject>
+            skip_directive<typename extension::as_parser<Subject>::value_type, Skipper>
+            operator[](Subject const& subject) const
+            {
+                return {as_parser(subject), skipper_};
+            }
+
+            Skipper skipper_;
+        };
+        
+        template <typename Skipper>
+        skip_gen<Skipper> const operator()(Skipper const& skipper) const
+        {
+            return skip_gen<Skipper>(skipper);
+        }
+
+        template <typename Subject>
+        reskip_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    reskip_gen const skip = reskip_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/directive/with.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,107 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_X3_WITH_MAY_02_2014_0749AM)
+#define SPIRIT_X3_WITH_MAY_02_2014_0749AM
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // with directive injects a value into the context prior to parsing.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Subject, typename Derived, typename T>
+    struct with_value_holder
+      : unary_parser<Subject, Derived>
+    {
+        typedef unary_parser<Subject, Derived> base_type;
+        mutable T val;
+        with_value_holder(Subject const& subject, T const& val)
+          : base_type(subject)
+          , val(val) {}
+    };
+    
+    template <typename Subject, typename Derived, typename T>
+    struct with_value_holder<Subject, Derived, T const>
+      : unary_parser<Subject, Derived>
+    {
+        typedef unary_parser<Subject, Derived> base_type;
+        T val;
+        with_value_holder(Subject const& subject, T const& val)
+          : base_type(subject)
+          , val(val) {}
+    };
+
+    template <typename Subject, typename ID, typename T>
+    struct with_directive
+      : with_value_holder<Subject, with_directive<Subject, ID, T>, T>
+    {
+        typedef with_value_holder<Subject, with_directive<Subject, ID, T>, T> base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        typedef Subject subject_type;
+
+        with_directive(Subject const& subject, T const& val)
+          : base_type(subject, val) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            return this->subject.parse(
+                first, last
+              , make_context<ID>(this->val, context)
+              , rcontext
+              , attr);
+        }
+    };
+   
+    template <typename ID, typename T, typename NextContext = unused_type>
+    struct with_context
+    {
+        typedef context<ID, T, NextContext> type;
+    };
+    
+    template <typename ID, typename T>
+    struct with_context<ID, T, unused_type>
+    {
+        typedef context<ID, T> const type;
+    };
+
+    template <typename ID, typename T>
+    struct with_gen
+    {
+        T& val;
+
+        with_gen(T& val)
+          : val(val) {}
+
+        template <typename Subject>
+        with_directive<typename extension::as_parser<Subject>::value_type, ID, T>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject), val};
+        }
+    };
+
+    template <typename ID, typename T>
+    inline with_gen<ID, T> with(T& val)
+    {
+        return with_gen<ID, T>{val};
+    }
+    
+    template <typename ID, typename T>
+    inline with_gen<ID, T const> with(T const& val)
+    {
+        return with_gen<ID, T const>{val};
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/extensions.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,18 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2014 Thomas Bernard
+    Copyright (c) 2014 Lee Clagett
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_EXTENSIONS_APRIL_6_2014_1421PM)
+#define BOOST_SPIRIT_X3_EXTENSIONS_APRIL_6_2014_1421PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/extensions/seek.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/extensions/seek.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+/*=============================================================================
+    Copyright (c) 2011 Jamboree
+    Copyright (c) 2014 Lee Clagett
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SEEK_APRIL_13_2014_1920PM)
+#define BOOST_SPIRIT_X3_SEEK_APRIL_13_2014_1920PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template<typename Subject>
+    struct seek_directive : unary_parser<Subject, seek_directive<Subject>>
+    {
+        typedef unary_parser<Subject, seek_directive<Subject>> base_type;
+        static bool const is_pass_through_unary = true;
+        static bool const handles_container = Subject::handles_container;
+
+        seek_directive(Subject const& subject) :
+            base_type(subject) {}
+
+        template<typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            Iterator current(first);
+            for (/**/; current != last; ++current)
+            {
+                if (this->subject.parse(current, last, context, rcontext, attr))
+                {
+                    first = current;
+                    return true;
+                }
+            }
+
+            // Test for when subjects match on input empty. Example:
+            //     comment = "//" >> seek[eol | eoi]
+            if (this->subject.parse(current, last, context, rcontext, attr))
+            {
+                first = current;
+                return true;
+            }
+
+            return false;
+        }
+    };
+
+    struct seek_gen
+    {
+        template<typename Subject>
+        seek_directive<typename extension::as_parser<Subject>::value_type>
+        operator[](Subject const& subject) const
+        {
+            return {as_parser(subject)};
+        }
+    };
+
+    seek_gen const seek = seek_gen();
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_NONTERMINAL_FEBRUARY_12_2007_1018AM)
+#define BOOST_SPIRIT_X3_NONTERMINAL_FEBRUARY_12_2007_1018AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/nonterminal/rule.hpp>
+//~ #include <boost/spirit/home/x3/nonterminal/error_handler.hpp>
+//~ #include <boost/spirit/home/x3/nonterminal/debug_handler.hpp>
+//~ #include <boost/spirit/home/x3/nonterminal/success_handler.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/debug_handler_state.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,24 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_DEBUG_HANDLER_STATE_APR_21_2010_0733PM)
+#define BOOST_SPIRIT_X3_DEBUG_HANDLER_STATE_APR_21_2010_0733PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    enum debug_handler_state
+    {
+        pre_parse
+      , successful_parse
+      , failed_parse
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/detail/rule.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,385 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_DETAIL_RULE_JAN_08_2012_0326PM)
+#define BOOST_SPIRIT_X3_DETAIL_RULE_JAN_08_2012_0326PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/traits/make_attribute.hpp>
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+#include <boost/spirit/home/x3/nonterminal/detail/transform_attribute.hpp>
+#include <boost/utility/addressof.hpp>
+
+#if defined(BOOST_SPIRIT_X3_DEBUG)
+#include <boost/spirit/home/x3/nonterminal/simple_trace.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename ID>
+    struct identity;
+    
+    template <typename ID, typename Attribute = unused_type>
+    struct rule;
+
+    struct parse_pass_context_tag;
+
+    namespace detail
+    {
+        // we use this so we can detect if the default parse_rule
+        // is the being called.
+        struct default_parse_rule_result
+        {
+            default_parse_rule_result(bool r)
+              : r(r) {}
+            operator bool() const { return r; }
+            bool r;
+        };
+    }
+    
+    // default parse_rule implementation
+    template <typename ID, typename Attribute, typename Iterator
+      , typename Context, typename ActualAttribute>
+    inline detail::default_parse_rule_result
+    parse_rule(
+        rule<ID, Attribute> rule_
+      , Iterator& first, Iterator const& last
+      , Context const& context, ActualAttribute& attr);
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+#if defined(BOOST_SPIRIT_X3_DEBUG)
+    template <typename Iterator, typename Attribute>
+    struct context_debug
+    {
+        context_debug(
+            char const* rule_name
+          , Iterator const& first, Iterator const& last
+          , Attribute const& attr
+          , bool const& ok_parse //was parse successful?
+          )
+          : ok_parse(ok_parse), rule_name(rule_name)
+          , first(first), last(last)
+          , attr(attr)
+          , f(detail::get_simple_trace())
+        {
+            f(first, last, attr, pre_parse, rule_name);
+        }
+
+        ~context_debug()
+        {
+            auto status = ok_parse ? successful_parse : failed_parse ;
+            f(first, last, attr, status, rule_name);
+        }
+
+        bool const& ok_parse;
+        char const* rule_name;
+        Iterator const& first;
+        Iterator const& last;
+        Attribute const& attr;
+        detail::simple_trace_type& f;
+    };
+#endif
+    
+    template <typename ID, typename Iterator, typename Context, typename Enable = void>
+    struct has_on_error : mpl::false_ {};
+
+    template <typename ID, typename Iterator, typename Context>
+    struct has_on_error<ID, Iterator, Context,
+        typename disable_if_substitution_failure<
+            decltype(
+                std::declval<ID>().on_error(
+                    std::declval<Iterator&>()
+                  , std::declval<Iterator>()
+                  , std::declval<expectation_failure<Iterator>>()
+                  , std::declval<Context>()
+                )
+            )>::type
+        >
+      : mpl::true_
+    {};
+    
+    template <typename ID, typename Iterator, typename Attribute, typename Context, typename Enable = void>
+    struct has_on_success : mpl::false_ {};
+
+    template <typename ID, typename Iterator, typename Attribute, typename Context>
+    struct has_on_success<ID, Iterator, Context, Attribute,
+        typename disable_if_substitution_failure<
+            decltype(
+                std::declval<ID>().on_success(
+                    std::declval<Iterator&>()
+                  , std::declval<Iterator>()
+                  , std::declval<Attribute&>()
+                  , std::declval<Context>()
+                )
+            )>::type
+        >
+      : mpl::true_
+    {};
+
+    template <typename ID>
+    struct make_id
+    {
+        typedef identity<ID> type;
+    };
+
+    template <typename ID>
+    struct make_id<identity<ID>>
+    {
+        typedef identity<ID> type;
+    };
+    
+    template <typename ID, typename RHS, typename Context>
+    Context const&
+    make_rule_context(RHS const& rhs, Context const& context
+      , mpl::false_ /* is_default_parse_rule */)
+    {
+        return context;
+    }
+    
+    template <typename ID, typename RHS, typename Context>
+    auto make_rule_context(RHS const& rhs, Context const& context
+      , mpl::true_ /* is_default_parse_rule */ )
+    {
+        return make_unique_context<ID>(rhs, context);
+    }
+
+    template <typename Attribute, typename ID>
+    struct rule_parser
+    {
+        template <typename Iterator, typename Context, typename ActualAttribute>
+        static bool call_on_success(
+            Iterator& first, Iterator const& last
+          , Context const& context, ActualAttribute& attr
+          , mpl::false_ /* No on_success handler */ )
+        {
+            return true;
+        }
+        
+        template <typename Iterator, typename Context, typename ActualAttribute>
+        static bool call_on_success(
+            Iterator& first, Iterator const& last
+          , Context const& context, ActualAttribute& attr
+          , mpl::true_ /* Has on_success handler */)
+        {
+            bool pass = true;
+            ID().on_success(
+                first
+              , last
+              , attr
+              , make_context<parse_pass_context_tag>(pass, context)
+            );
+            return pass;
+        }
+        
+        template <typename RHS, typename Iterator, typename Context
+          , typename RContext, typename ActualAttribute>
+        static bool parse_rhs_main(
+            RHS const& rhs
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, ActualAttribute& attr
+          , mpl::false_)
+        {
+            // see if the user has a BOOST_SPIRIT_DEFINE for this rule
+            typedef
+                decltype(parse_rule(
+                    rule<ID, Attribute>(), first, last
+                  , make_unique_context<ID>(rhs, context), attr))
+            parse_rule_result;
+
+            // If there is no BOOST_SPIRIT_DEFINE for this rule,
+            // we'll make a context for this rule tagged by its ID
+            // so we can extract the rule later on in the default
+            // (generic) parse_rule function.
+            typedef
+                is_same<parse_rule_result, default_parse_rule_result>
+            is_default_parse_rule;
+
+            Iterator i = first;
+            bool r = rhs.parse(
+                i
+              , last
+              , make_rule_context<ID>(rhs, context, is_default_parse_rule())
+              , rcontext
+              , attr
+            );
+
+            if (r)
+            {
+                auto first_ = first;
+                x3::skip_over(first_, last, context);
+                r = call_on_success(first_, i, context, attr
+                  , has_on_success<ID, Iterator, Context, ActualAttribute>());
+            }
+            
+            if (r)
+                first = i;
+            return r;
+        }
+
+        template <typename RHS, typename Iterator, typename Context
+          , typename RContext, typename ActualAttribute>
+        static bool parse_rhs_main(
+            RHS const& rhs
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, ActualAttribute& attr
+          , mpl::true_ /* on_error is found */)
+        {
+            for (;;)
+            {
+                try
+                {
+                    return parse_rhs_main(
+                        rhs, first, last, context, rcontext, attr, mpl::false_());
+                }
+                catch (expectation_failure<Iterator> const& x)
+                {
+                    switch (ID().on_error(first, last, x, context))
+                    {
+                        case error_handler_result::fail:
+                            return false;
+                        case error_handler_result::retry:
+                            continue;
+                        case error_handler_result::accept:
+                            return true;
+                        case error_handler_result::rethrow:
+                            throw;
+                    }
+                }
+            }
+        }
+
+        template <typename RHS, typename Iterator
+          , typename Context, typename RContext, typename ActualAttribute>
+        static bool parse_rhs_main(
+            RHS const& rhs
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, ActualAttribute& attr)
+        {
+            return parse_rhs_main(
+                rhs, first, last, context, rcontext, attr
+              , has_on_error<ID, Iterator, Context>()
+            );
+        }
+
+        template <typename RHS, typename Iterator
+          , typename Context, typename RContext, typename ActualAttribute>
+        static bool parse_rhs(
+            RHS const& rhs
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, ActualAttribute& attr
+          , mpl::false_)
+        {
+            return parse_rhs_main(rhs, first, last, context, rcontext, attr);
+        }
+
+        template <typename RHS, typename Iterator
+          , typename Context, typename RContext, typename ActualAttribute>
+        static bool parse_rhs(
+            RHS const& rhs
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, ActualAttribute& attr
+          , mpl::true_)
+        {
+            return parse_rhs_main(rhs, first, last, context, rcontext, unused);
+        }
+
+        template <typename RHS, typename Iterator, typename Context
+          , typename ActualAttribute, typename ExplicitAttrPropagation>
+        static bool call_rule_definition(
+            RHS const& rhs
+          , char const* rule_name
+          , Iterator& first, Iterator const& last
+          , Context const& context, ActualAttribute& attr
+          , ExplicitAttrPropagation)
+        {
+            typedef traits::make_attribute<Attribute, ActualAttribute> make_attribute;
+
+            // do down-stream transformation, provides attribute for
+            // rhs parser
+            typedef traits::transform_attribute<
+                typename make_attribute::type, Attribute, parser_id>
+            transform;
+
+            typedef typename make_attribute::value_type value_type;
+            typedef typename transform::type transform_attr;
+            value_type made_attr = make_attribute::call(attr);
+            transform_attr attr_ = transform::pre(made_attr);
+
+            bool ok_parse
+              //Creates a place to hold the result of parse_rhs
+              //called inside the following scope.
+              ;
+            {
+             //Create a scope to cause the dbg variable below (within
+             //the #if...#endif) to call it's DTOR before any
+             //modifications are made to the attribute, attr_ passed
+             //to parse_rhs (such as might be done in
+             //traits::post_transform when, for example,
+             //ActualAttribute is a recursive variant).
+#if defined(BOOST_SPIRIT_X3_DEBUG)
+                  context_debug<Iterator, typename make_attribute::value_type>
+                dbg(rule_name, first, last, attr_, ok_parse);
+#endif
+                ok_parse=parse_rhs(rhs, first, last, context, attr_, attr_
+                   , mpl::bool_
+                     < (  RHS::has_action 
+                       && !ExplicitAttrPropagation::value
+                       )
+                     >()
+                  );
+            }
+            if(ok_parse)
+            {
+                // do up-stream transformation, this integrates the results
+                // back into the original attribute value, if appropriate
+                traits::post_transform(attr, attr_);
+            }
+            return ok_parse;
+        }
+
+//        template <typename RuleDef, typename Iterator, typename Context
+//            , typename ActualAttribute, typename AttributeContext>
+//        static bool call_from_rule(
+//            RuleDef const& rule_def
+//          , char const* rule_name
+//          , Iterator& first, Iterator const& last
+//          , Context const& context, ActualAttribute& attr, AttributeContext& attr_ctx)
+//        {
+//            // This is called when a rule-body has already been established.
+//            // The rule body is already established by the rule_definition class,
+//            // we will not do it again. We'll simply call the RHS by calling
+//            // call_rule_definition.
+//
+//            return call_rule_definition(
+//                rule_def.rhs, rule_name, first, last
+//              , context, attr, attr_ctx.attr_ptr
+//              , mpl::bool_<(RuleDef::explicit_attribute_propagation)>());
+//        }
+//
+//        template <typename RuleDef, typename Iterator, typename Context
+//            , typename ActualAttribute>
+//        static bool call_from_rule(
+//            RuleDef const& rule_def
+//          , char const* rule_name
+//          , Iterator& first, Iterator const& last
+//          , Context const& context, ActualAttribute& attr, unused_type)
+//        {
+//            // This is called when a rule-body has *not yet* been established.
+//            // The rule body is established by the rule_definition class, so
+//            // we call it to parse and establish the rule-body.
+//
+//            return rule_def.parse(first, last, context, unused, attr); // $$$ fix unused param $$$
+//        }
+    };
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/detail/transform_attribute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,108 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_X3_DETAIL_ATTRIBUTES_APR_18_2010_0458PM)
+#define SPIRIT_X3_DETAIL_ATTRIBUTES_APR_18_2010_0458PM
+
+#include <boost/spirit/home/x3/support/traits/transform_attribute.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace x3
+{
+    struct parser_id;
+
+    template <typename Exposed, typename Transformed>
+    struct default_transform_attribute
+    {
+        typedef Transformed type;
+
+        static Transformed pre(Exposed&) { return Transformed(); }
+
+        static void post(Exposed& val, Transformed& attr)
+        {
+            traits::move_to(attr, val);
+        }
+    };
+
+    // handle case where no transformation is required as the types are the same
+    template <typename Attribute>
+    struct default_transform_attribute<Attribute, Attribute>
+    {
+        typedef Attribute& type;
+        static Attribute& pre(Attribute& val) { return val; }
+        static void post(Attribute&, Attribute const&) {}
+    };
+
+    // main specialization for x3
+    template <typename Exposed, typename Transformed, typename Enable = void>
+    struct transform_attribute
+      : default_transform_attribute<Exposed, Transformed> {};
+
+    // reference types need special handling
+    template <typename Attribute>
+    struct transform_attribute<Attribute&, Attribute>
+    {
+        typedef Attribute& type;
+        static Attribute& pre(Attribute& val) { return val; }
+        static void post(Attribute&, Attribute const&) {}
+    };
+
+    // unused_type needs some special handling as well
+    template <>
+    struct transform_attribute<unused_type, unused_type>
+    {
+        typedef unused_type type;
+        static unused_type pre(unused_type) { return unused; }
+        static void post(unused_type, unused_type) {}
+    };
+
+    template <>
+    struct transform_attribute<unused_type const, unused_type>
+      : transform_attribute<unused_type, unused_type> {};
+
+    template <typename Attribute>
+    struct transform_attribute<unused_type, Attribute>
+      : transform_attribute<unused_type, unused_type> {};
+
+    template <typename Attribute>
+    struct transform_attribute<unused_type const, Attribute>
+      : transform_attribute<unused_type, unused_type> {};
+
+    template <typename Attribute>
+    struct transform_attribute<Attribute, unused_type>
+      : transform_attribute<unused_type, unused_type> {};
+
+    template <typename Attribute>
+    struct transform_attribute<Attribute const, unused_type>
+      : transform_attribute<unused_type, unused_type> {};
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Exposed, typename Transformed>
+    struct transform_attribute<Exposed, Transformed, x3::parser_id>
+      : x3::transform_attribute<Exposed, Transformed> {};
+
+    template <typename Exposed, typename Transformed>
+    struct transform_attribute<Exposed&, Transformed, x3::parser_id>
+      : transform_attribute<Exposed, Transformed, x3::parser_id> {};
+
+    template <typename Attribute>
+    struct transform_attribute<Attribute&, Attribute, x3::parser_id>
+      : x3::transform_attribute<Attribute&, Attribute> {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Exposed, typename Transformed>
+    void post_transform(Exposed& dest, Transformed&& attr)
+    {
+        return transform_attribute<Exposed, Transformed, x3::parser_id>::post(dest, attr);
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/rule.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,186 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_RULE_JAN_08_2012_0326PM)
+#define BOOST_SPIRIT_X3_RULE_JAN_08_2012_0326PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/nonterminal/detail/rule.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/preprocessor/variadic/to_seq.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+
+#if !defined(BOOST_SPIRIT_X3_NO_RTTI)
+#include <typeinfo>
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename ID>
+    struct identity {};
+    
+    // default parse_rule implementation
+    template <typename ID, typename Attribute, typename Iterator
+      , typename Context, typename ActualAttribute>
+    inline detail::default_parse_rule_result
+    parse_rule(
+        rule<ID, Attribute> rule_
+      , Iterator& first, Iterator const& last
+      , Context const& context, ActualAttribute& attr)
+    {
+        static_assert(!is_same<decltype(get<ID>(context)), unused_type>::value,
+            "BOOST_SPIRIT_DEFINE undefined for this rule.");
+        return get<ID>(context).parse(first, last, context, unused, attr);
+    }
+
+    template <typename ID, typename RHS, typename Attribute, bool force_attribute_>
+    struct rule_definition : parser<rule_definition<ID, RHS, Attribute, force_attribute_>>
+    {
+        typedef rule_definition<ID, RHS, Attribute, force_attribute_> this_type;
+        typedef ID id;
+        typedef RHS rhs_type;
+        typedef rule<ID, Attribute> lhs_type;
+        typedef Attribute attribute_type;
+
+        static bool const has_attribute =
+            !is_same<Attribute, unused_type>::value;
+        static bool const handles_container =
+            traits::is_container<Attribute>::value;
+        static bool const force_attribute =
+            force_attribute_;
+
+        rule_definition(RHS rhs, char const* name)
+          : rhs(rhs), name(name) {}
+
+        template <typename Iterator, typename Context, typename Attribute_>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute_& attr) const
+        {
+            return detail::rule_parser<attribute_type, ID>
+                ::call_rule_definition(
+                    rhs, name, first, last
+                  , context
+                  , attr
+                  , mpl::bool_<force_attribute>());
+        }
+
+        RHS rhs;
+        char const* name;
+    };
+
+    template <typename ID, typename Attribute>
+    struct rule : parser<rule<ID, Attribute>>
+    {
+        typedef ID id;
+        typedef Attribute attribute_type;
+        static bool const has_attribute =
+            !is_same<Attribute, unused_type>::value;
+        static bool const handles_container =
+            traits::is_container<Attribute>::value;
+
+#if !defined(BOOST_SPIRIT_X3_NO_RTTI)
+        rule() : name(typeid(rule).name()) {}
+#else
+        rule() : name("unnamed") {}
+#endif
+
+        rule(char const* name)
+          : name(name) {}
+
+        template <typename RHS>
+        rule_definition<
+            ID, typename extension::as_parser<RHS>::value_type, Attribute, false>
+        operator=(RHS const& rhs) const
+        {
+            return {as_parser(rhs), name};
+        }
+
+        template <typename RHS>
+        rule_definition<
+            ID, typename extension::as_parser<RHS>::value_type, Attribute, true>
+        operator%=(RHS const& rhs) const
+        {
+            return {as_parser(rhs), name};
+        }
+
+
+        template <typename Iterator, typename Context, typename Attribute_>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute_& attr) const
+        {
+            return parse_rule(*this, first, last, context, attr);
+        }
+
+        char const* name;
+    };
+    
+    namespace traits
+    {
+        template <typename T, typename Enable = void>
+        struct is_rule : mpl::false_ {};
+    
+        template <typename ID, typename Attribute>
+        struct is_rule<rule<ID, Attribute>> : mpl::true_ {};
+        
+        template <typename ID, typename Attribute, typename RHS, bool force_attribute>
+        struct is_rule<rule_definition<ID, RHS, Attribute, force_attribute>> : mpl::true_ {};
+    }
+
+    template <typename T>
+    struct get_info<T, typename enable_if<traits::is_rule<T>>::type>
+    {
+        typedef std::string result_type;
+        std::string operator()(T const& r) const
+        {
+            return r.name;
+        }
+    };
+    
+#define BOOST_SPIRIT_DECLARE_(r, data, rule_type)                               \
+    template <typename Iterator, typename Context, typename Attribute>          \
+    bool parse_rule(                                                            \
+        rule_type rule_                                                         \
+      , Iterator& first, Iterator const& last                                   \
+      , Context const& context, Attribute& attr);                               \
+    /***/
+
+#define BOOST_SPIRIT_DECLARE(...) BOOST_PP_SEQ_FOR_EACH(                        \
+    BOOST_SPIRIT_DECLARE_, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))            \
+    /***/
+    
+#define BOOST_SPIRIT_DEFINE_(r, data, def)                                      \
+    template <typename Iterator, typename Context, typename Attribute>          \
+    inline bool parse_rule(                                                     \
+        decltype(def)::lhs_type rule_                                           \
+      , Iterator& first, Iterator const& last                                   \
+      , Context const& context, Attribute& attr)                                \
+    {                                                                           \
+        using boost::spirit::x3::unused;                                        \
+        auto const& def_ = (def);                                               \
+        return def_.parse(first, last, context, unused, attr);                  \
+    }                                                                           \
+    /***/
+
+#define BOOST_SPIRIT_DEFINE(...) BOOST_PP_SEQ_FOR_EACH(                         \
+    BOOST_SPIRIT_DEFINE_, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))             \
+    /***/
+
+#define BOOST_SPIRIT_INSTANTIATE(rule_type, Iterator, Context)                  \
+    template bool parse_rule<Iterator, Context, rule_type::attribute_type>(     \
+        rule_type rule_                                                         \
+      , Iterator& first, Iterator const& last                                   \
+      , Context const& context, rule_type::attribute_type& attr);               \
+    /***/
+
+    
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/nonterminal/simple_trace.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,150 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SIMPLE_TRACE_DECEMBER_06_2008_1102AM)
+#define BOOST_SPIRIT_X3_SIMPLE_TRACE_DECEMBER_06_2008_1102AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/print_token.hpp>
+#include <boost/spirit/home/x3/support/traits/print_attribute.hpp>
+#include <boost/spirit/home/x3/nonterminal/debug_handler_state.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <ostream>
+
+//  The stream to use for debug output
+#if !defined(BOOST_SPIRIT_X3_DEBUG_OUT)
+#define BOOST_SPIRIT_X3_DEBUG_OUT std::cerr
+#endif
+
+//  number of tokens to print while debugging
+#if !defined(BOOST_SPIRIT_X3_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_X3_DEBUG_PRINT_SOME 20
+#endif
+
+//  number of spaces to indent
+#if !defined(BOOST_SPIRIT_X3_DEBUG_INDENT)
+#define BOOST_SPIRIT_X3_DEBUG_INDENT 2
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    namespace detail
+    {
+        template <typename Char>
+        inline void token_printer(std::ostream& o, Char c)
+        {
+            // allow customization of the token printer routine
+            x3::traits::print_token(o, c);
+        }
+    }
+
+    template <int IndentSpaces = 2, int CharsToPrint = 20>
+    struct simple_trace
+    {
+        simple_trace(std::ostream& out)
+          : out(out), indent(0) {}
+
+        void print_indent(int n) const
+        {
+            n *= IndentSpaces;
+            for (int i = 0; i != n; ++i)
+                out << ' ';
+        }
+
+        template <typename Iterator>
+        void print_some(
+            char const* tag
+          , Iterator first, Iterator const& last) const
+        {
+            print_indent(indent);
+            out << '<' << tag << '>';
+            int const n = CharsToPrint;
+            for (int i = 0; first != last && i != n && *first; ++i, ++first)
+                detail::token_printer(out, *first);
+            out << "</" << tag << '>' << std::endl;
+
+            // $$$ FIXME convert invalid xml characters (e.g. '<') to valid
+            // character entities. $$$
+        }
+
+        template <typename Iterator, typename Attribute, typename State>
+        void operator()(
+            Iterator const& first
+          , Iterator const& last
+          , Attribute const& attr
+          , State state
+          , std::string const& rule_name) const
+        {
+            switch (state)
+            {
+                case pre_parse:
+                    print_indent(indent++);
+                    out
+                        << '<' << rule_name << '>'
+                        << std::endl;
+                    print_some("try", first, last);
+                    break;
+
+                case successful_parse:
+                    print_some("success", first, last);
+                    if (!is_same<Attribute, unused_type>::value)
+                    {
+                        print_indent(indent);
+                        out
+                            << "<attributes>";
+                        traits::print_attribute(out, attr);
+                        out
+                            << "</attributes>";
+                        out << std::endl;
+                    }
+                    //~ if (!fusion::empty(context.locals))
+                        //~ out
+                            //~ << "<locals>"
+                            //~ << context.locals
+                            //~ << "</locals>";
+                    print_indent(--indent);
+                    out
+                        << "</" << rule_name << '>'
+                        << std::endl;
+                    break;
+
+                case failed_parse:
+                    print_indent(indent);
+                    out << "<fail/>" << std::endl;
+                    print_indent(--indent);
+                    out
+                        << "</" << rule_name << '>'
+                        << std::endl;
+                    break;
+            }
+        }
+
+        std::ostream& out;
+        mutable int indent;
+    };
+
+    namespace detail
+    {
+        typedef simple_trace<
+            BOOST_SPIRIT_X3_DEBUG_INDENT, BOOST_SPIRIT_X3_DEBUG_PRINT_SOME>
+        simple_trace_type;
+
+        inline simple_trace_type&
+        get_simple_trace()
+        {
+            static simple_trace_type tracer(BOOST_SPIRIT_X3_DEBUG_OUT);
+            return tracer;
+        }
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_NUMERIC_FEBRUARY_05_2007_1231PM)
+#define BOOST_SPIRIT_X3_NUMERIC_FEBRUARY_05_2007_1231PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/numeric/bool.hpp>
+#include <boost/spirit/home/x3/numeric/int.hpp>
+#include <boost/spirit/home/x3/numeric/uint.hpp>
+#include <boost/spirit/home/x3/numeric/real.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/bool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,106 @@
+/*=============================================================================
+    Copyright (c) 2009  Hartmut Kaiser
+    Copyright (c) 2014  Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(SPIRIT_X3_BOOL_SEP_29_2009_0709AM)
+#define SPIRIT_X3_BOOL_SEP_29_2009_0709AM
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/numeric/bool_policies.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T, typename BoolPolicies = bool_policies<T>>
+    struct bool_parser : parser<bool_parser<T, BoolPolicies>>
+    {
+        typedef T attribute_type;
+        static bool const has_attribute = true;
+
+        bool_parser()
+        	: policies() {}
+
+        bool_parser(BoolPolicies const& policies)
+        	: policies(policies) {}
+
+        template <typename Iterator, typename Context>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, T& attr) const
+        {
+            x3::skip_over(first, last, context);
+            return policies.parse_true(first, last, attr)
+                || policies.parse_false(first, last, attr);
+        }
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, Attribute& attr_param) const
+        {
+            // this case is called when Attribute is not T
+            T attr_;
+            if (parse(first, last, context, unused, attr_))
+            {
+                traits::move_to(attr_, attr_param);
+                return true;
+            }
+            return false;
+        }
+
+        BoolPolicies policies;
+    };
+
+    template <typename T, typename BoolPolicies = bool_policies<T>>
+    struct literal_bool_parser : parser<bool_parser<T, BoolPolicies>>
+    {
+        typedef T attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Value>
+        literal_bool_parser(Value const& n)
+        	: policies(), n_(n) {}
+
+        template <typename Value>
+        literal_bool_parser(Value const& n, BoolPolicies const& policies)
+        	: policies(policies), n_(n) {}
+
+        template <typename Iterator, typename Context>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, T& attr) const
+        {
+            x3::skip_over(first, last, context);
+            return (n_ && policies.parse_true(first, last, attr))
+                || (!n_ && policies.parse_false(first, last, attr));
+        }
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, Attribute& attr_param) const
+        {
+            // this case is called when Attribute is not T
+            T attr_;
+            if (parse(first, last, context, unused, attr_))
+            {
+                traits::move_to(attr_, attr_param);
+                return true;
+            }
+            return false;
+        }
+
+        BoolPolicies policies;
+        T n_;
+    };
+
+    typedef bool_parser<bool> bool_type;
+    bool_type const bool_ = {};
+
+    typedef literal_bool_parser<bool> true_type;
+    true_type const true_ = { true };
+
+    typedef literal_bool_parser<bool> false_type;
+    false_type const false_ = { false };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/bool_policies.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+/*=============================================================================
+    Copyright (c) 2009  Hartmut Kaiser
+    Copyright (c) 2014  Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM)
+#define SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/string/detail/string_parse.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  Default boolean policies
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T = bool>
+    struct bool_policies
+    {
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_true(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            if (detail::string_parse("true", first, last, unused))
+            {
+                traits::move_to(T(true), attr_);    // result is true
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_false(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            if (detail::string_parse("false", first, last, unused))
+            {
+                traits::move_to(T(false), attr_);   // result is false
+                return true;
+            }
+            return false;
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/int.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_INT_APR_17_2006_0830AM)
+#define BOOST_SPIRIT_X3_INT_APR_17_2006_0830AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/extract_int.hpp>
+#include <cstdint>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename T
+      , unsigned Radix = 10
+      , unsigned MinDigits = 1
+      , int MaxDigits = -1>
+    struct int_parser : parser<int_parser<T, Radix, MinDigits, MaxDigits>>
+    {
+        // check template parameter 'Radix' for validity
+        static_assert(
+            (Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16),
+            "Error Unsupported Radix");
+
+        typedef T attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute& attr) const
+        {
+            typedef extract_int<T, Radix, MinDigits, MaxDigits> extract;
+            x3::skip_over(first, last, context);
+            return extract::call(first, last, attr);
+        }
+    };
+
+#define BOOST_SPIRIT_X3_INT_PARSER(int_type, name)                              \
+    typedef int_parser<int_type> name##type;                                    \
+    name##type const name = {};                                                 \
+    /***/
+
+    BOOST_SPIRIT_X3_INT_PARSER(long, long_)
+    BOOST_SPIRIT_X3_INT_PARSER(short, short_)
+    BOOST_SPIRIT_X3_INT_PARSER(int, int_)
+    BOOST_SPIRIT_X3_INT_PARSER(long long, long_long)
+
+    BOOST_SPIRIT_X3_INT_PARSER(int8_t, int8)
+    BOOST_SPIRIT_X3_INT_PARSER(int16_t, int16)
+    BOOST_SPIRIT_X3_INT_PARSER(int32_t, int32)
+    BOOST_SPIRIT_X3_INT_PARSER(int64_t, int64)
+
+#undef BOOST_SPIRIT_X3_INT_PARSER
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/real.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_REAL_APRIL_18_2006_0850AM)
+#define BOOST_SPIRIT_X3_REAL_APRIL_18_2006_0850AM
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/numeric/real_policies.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/extract_real.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T, typename RealPolicies = real_policies<T> >
+    struct real_parser : parser<real_parser<T, RealPolicies> >
+    {
+        typedef T attribute_type;
+        static bool const has_attribute = true;
+
+        real_parser()
+        	: policies() {}
+
+        real_parser(RealPolicies const& policies)
+        	: policies(policies) {}
+
+        template <typename Iterator, typename Context>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, T& attr_) const
+        {
+            x3::skip_over(first, last, context);
+            return extract_real<T, RealPolicies>::parse(first, last, attr_, policies);
+        }
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, unused_type, Attribute& attr_param) const
+        {
+            // this case is called when Attribute is not T
+            T attr_;
+            if (parse(first, last, context, unused, attr_))
+            {
+                traits::move_to(attr_, attr_param);
+                return true;
+            }
+            return false;
+        }
+
+        RealPolicies policies;
+    };
+
+    typedef real_parser<float> float_type;
+    float_type const float_ = {};
+
+    typedef real_parser<double> double_type;
+    double_type const double_ = {};
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/real_policies.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,186 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(SPIRIT_REAL_POLICIES_APRIL_17_2006_1158PM)
+#define SPIRIT_REAL_POLICIES_APRIL_17_2006_1158PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/string/detail/string_parse.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/extract_int.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  Default (unsigned) real number policies
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct ureal_policies
+    {
+        // trailing dot policy suggested by Gustavo Guerra
+        static bool const allow_leading_dot = true;
+        static bool const allow_trailing_dot = true;
+        static bool const expect_dot = false;
+
+        template <typename Iterator>
+        static bool
+        parse_sign(Iterator& /*first*/, Iterator const& /*last*/)
+        {
+            return false;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_n(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            return extract_uint<T, 10, 1, -1>::call(first, last, attr_);
+        }
+
+        template <typename Iterator>
+        static bool
+        parse_dot(Iterator& first, Iterator const& last)
+        {
+            if (first == last || *first != '.')
+                return false;
+            ++first;
+            return true;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            return extract_uint<T, 10, 1, -1, true>::call(first, last, attr_);
+        }
+
+        template <typename Iterator>
+        static bool
+        parse_exp(Iterator& first, Iterator const& last)
+        {
+            if (first == last || (*first != 'e' && *first != 'E'))
+                return false;
+            ++first;
+            return true;
+        }
+
+        template <typename Iterator>
+        static bool
+        parse_exp_n(Iterator& first, Iterator const& last, int& attr_)
+        {
+            return extract_int<int, 10, 1, -1>::call(first, last, attr_);
+        }
+
+        ///////////////////////////////////////////////////////////////////////
+        //  The parse_nan() and parse_inf() functions get called whenever:
+        //
+        //    - a number to parse does not start with a digit (after having
+        //      successfully parsed an optional sign)
+        //
+        //  or
+        //
+        //    - after a floating point number of the value 1 (having no
+        //      exponential part and a fractional part value of 0) has been
+        //      parsed.
+        //
+        //  The first call allows to recognize representations of NaN or Inf
+        //  starting with a non-digit character (such as NaN, Inf, QNaN etc.).
+        //
+        //  The second call allows to recognize representation formats starting
+        //  with a 1.0 (such as 1.0#NAN or 1.0#INF etc.).
+        //
+        //  The functions should return true if a Nan or Inf has been found. In
+        //  this case the attr should be set to the matched value (NaN or
+        //  Inf). The optional sign will be automatically applied afterwards.
+        //
+        //  The default implementation below recognizes representations of NaN
+        //  and Inf as mandated by the C99 Standard and as proposed for
+        //  inclusion into the C++0x Standard: nan, nan(...), inf and infinity
+        //  (the matching is performed case-insensitively).
+        ///////////////////////////////////////////////////////////////////////
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_nan(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            if (first == last)
+                return false;   // end of input reached
+
+            if (*first != 'n' && *first != 'N')
+                return false;   // not "nan"
+
+            // nan[(...)] ?
+            if (detail::string_parse("nan", "NAN", first, last, unused))
+            {
+                if (*first == '(')
+                {
+                    // skip trailing (...) part
+                    Iterator i = first;
+
+                    while (++i != last && *i != ')')
+                        ;
+                    if (i == last)
+                        return false;     // no trailing ')' found, give up
+
+                    first = ++i;
+                }
+                attr_ = std::numeric_limits<T>::quiet_NaN();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_inf(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            if (first == last)
+                return false;   // end of input reached
+
+            if (*first != 'i' && *first != 'I')
+                return false;   // not "inf"
+
+            // inf or infinity ?
+            if (detail::string_parse("inf", "INF", first, last, unused))
+            {
+                // skip allowed 'inity' part of infinity
+                detail::string_parse("inity", "INITY", first, last, unused);
+                attr_ = std::numeric_limits<T>::infinity();
+                return true;
+            }
+            return false;
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Default (signed) real number policies
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct real_policies : ureal_policies<T>
+    {
+        template <typename Iterator>
+        static bool
+        parse_sign(Iterator& first, Iterator const& last)
+        {
+            return extract_sign(first, last);
+        }
+    };
+
+    template <typename T>
+    struct strict_ureal_policies : ureal_policies<T>
+    {
+        static bool const expect_dot = true;
+    };
+
+    template <typename T>
+    struct strict_real_policies : real_policies<T>
+    {
+        static bool const expect_dot = true;
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/numeric/uint.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2011 Jan Frederick Eick
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_UINT_APR_17_2006_0901AM)
+#define BOOST_SPIRIT_X3_UINT_APR_17_2006_0901AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/extract_int.hpp>
+#include <cstdint>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename T
+      , unsigned Radix = 10
+      , unsigned MinDigits = 1
+      , int MaxDigits = -1>
+    struct uint_parser : parser<uint_parser<T, Radix, MinDigits, MaxDigits>>
+    {
+        // check template parameter 'Radix' for validity
+        static_assert(
+            (Radix >= 2 && Radix <= 36),
+            "Error Unsupported Radix");
+
+        typedef T attribute_type;
+        static bool const has_attribute = true;
+
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute& attr) const
+        {
+            typedef extract_uint<T, Radix, MinDigits, MaxDigits> extract;
+            x3::skip_over(first, last, context);
+            return extract::call(first, last, attr);
+        }
+    };
+
+#define BOOST_SPIRIT_X3_UINT_PARSER(uint_type, name)                            \
+    typedef uint_parser<uint_type> name##type;                                  \
+    name##type const name = {};                                                 \
+    /***/
+
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned long, ulong_)
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned short, ushort_)
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned int, uint_)
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned long long, ulong_long)
+
+    BOOST_SPIRIT_X3_UINT_PARSER(uint8_t, uint8)
+    BOOST_SPIRIT_X3_UINT_PARSER(uint16_t, uint16)
+    BOOST_SPIRIT_X3_UINT_PARSER(uint32_t, uint32)
+    BOOST_SPIRIT_X3_UINT_PARSER(uint64_t, uint64)
+
+#undef BOOST_SPIRIT_X3_UINT_PARSER
+
+#define BOOST_SPIRIT_X3_UINT_PARSER(uint_type, radix, name)                     \
+    typedef uint_parser<uint_type, radix> name##type;                           \
+    name##type const name = name##type();                                       \
+    /***/
+
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned, 2, bin)
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned, 8, oct)
+    BOOST_SPIRIT_X3_UINT_PARSER(unsigned, 16, hex)
+
+#undef BOOST_SPIRIT_X3_UINT_PARSER
+
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,26 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_OPERATOR_FEBRUARY_02_2007_0558PM)
+#define BOOST_SPIRIT_X3_OPERATOR_FEBRUARY_02_2007_0558PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/operator/sequence.hpp>
+#include <boost/spirit/home/x3/operator/alternative.hpp>
+//~ #include <boost/spirit/home/x3/operator/sequential_or.hpp>
+//~ #include <boost/spirit/home/x3/operator/permutation.hpp>
+#include <boost/spirit/home/x3/operator/difference.hpp>
+#include <boost/spirit/home/x3/operator/list.hpp>
+#include <boost/spirit/home/x3/operator/optional.hpp>
+#include <boost/spirit/home/x3/operator/kleene.hpp>
+#include <boost/spirit/home/x3/operator/plus.hpp>
+#include <boost/spirit/home/x3/operator/and_predicate.hpp>
+#include <boost/spirit/home/x3/operator/not_predicate.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/alternative.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,68 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_ALTERNATIVE_JAN_07_2013_1131AM)
+#define SPIRIT_ALTERNATIVE_JAN_07_2013_1131AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/operator/detail/alternative.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct alternative : binary_parser<Left, Right, alternative<Left, Right>>
+    {
+        typedef binary_parser<Left, Right, alternative<Left, Right>> base_type;
+
+        alternative(Left left, Right right)
+            : base_type(left, right) {}
+
+        template <typename Iterator, typename Context, typename RContext>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, unused_type) const
+        {
+            return this->left.parse(first, last, context, rcontext, unused)
+               || this->right.parse(first, last, context, rcontext, unused);
+        }
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            if (detail::parse_alternative(this->left, first, last, context, rcontext, attr))
+                return true;
+            if (detail::parse_alternative(this->right, first, last, context, rcontext, attr))
+                return true;
+            return false;
+        }
+    };
+
+    template <typename Left, typename Right>
+    inline alternative<
+        typename extension::as_parser<Left>::value_type
+      , typename extension::as_parser<Right>::value_type>
+    operator|(Left const& left, Right const& right)
+    {
+        return {as_parser(left), as_parser(right)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Left, typename Right, typename Context>
+    struct attribute_of<x3::alternative<Left, Right>, Context>
+        : x3::detail::attribute_of_alternative<Left, Right, Context> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/and_predicate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_AND_PREDICATE_MARCH_23_2007_0617PM)
+#define SPIRIT_AND_PREDICATE_MARCH_23_2007_0617PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct and_predicate : unary_parser<Subject, and_predicate<Subject>>
+    {
+        typedef unary_parser<Subject, and_predicate<Subject>> base_type;
+
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        and_predicate(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& /*attr*/) const
+        {
+            Iterator i = first;
+            return this->subject.parse(i, last, context, rcontext, unused);
+        }
+    };
+
+    template <typename Subject>
+    inline and_predicate<typename extension::as_parser<Subject>::value_type>
+    operator&(Subject const& subject)
+    {
+        return {as_parser(subject)};
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/detail/alternative.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,317 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_ALTERNATIVE_DETAIL_JAN_07_2013_1245PM)
+#define SPIRIT_ALTERNATIVE_DETAIL_JAN_07_2013_1245PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/is_variant.hpp>
+#include <boost/spirit/home/x3/support/traits/tuple_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/spirit/home/x3/support/traits/variant_has_substitute.hpp>
+#include <boost/spirit/home/x3/support/traits/variant_find_substitute.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+#include <boost/variant/variant.hpp>
+
+#include <boost/mpl/copy_if.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/joint_view.hpp>
+
+#include <boost/fusion/include/front.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct alternative;
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    struct pass_variant_unused
+    {
+        typedef unused_type type;
+
+        template <typename T>
+        static unused_type
+        call(T&)
+        {
+            return unused_type();
+        }
+    };
+
+    template <typename Attribute>
+    struct pass_variant_used
+    {
+        typedef Attribute& type;
+
+        static Attribute&
+        call(Attribute& v)
+        {
+            return v;
+        }
+    };
+
+    template <>
+    struct pass_variant_used<unused_type> : pass_variant_unused {};
+
+    template <typename Parser, typename Attribute, typename Context
+      , typename Enable = void>
+    struct pass_parser_attribute
+    {
+        typedef typename
+            traits::attribute_of<Parser, Context>::type
+        attribute_type;
+        typedef typename
+            traits::variant_find_substitute<Attribute, attribute_type>::type
+        substitute_type;
+
+        typedef typename
+            mpl::if_<
+                is_same<Attribute, substitute_type>
+              , Attribute&
+              , substitute_type
+            >::type
+        type;
+
+        template <typename Attribute_>
+        static Attribute_&
+        call(Attribute_& attr, mpl::true_)
+        {
+            return attr;
+        }
+
+        template <typename Attribute_>
+        static type
+        call(Attribute_&, mpl::false_)
+        {
+            return type();
+        }
+
+        template <typename Attribute_>
+        static type
+        call(Attribute_& attr)
+        {
+            return call(attr, is_same<Attribute_, typename remove_reference<type>::type>());
+        }
+    };
+
+    // Pass non-variant attributes as-is
+    template <typename Parser, typename Attribute, typename Context
+      , typename Enable = void>
+    struct pass_non_variant_attribute
+    {
+        typedef Attribute& type;
+
+        static Attribute&
+        call(Attribute& attr)
+        {
+            return attr;
+        }
+    };
+
+    // Unwrap single element sequences
+    template <typename Parser, typename Attribute, typename Context>
+    struct pass_non_variant_attribute<Parser, Attribute, Context,
+        typename enable_if<traits::is_size_one_sequence<Attribute>>::type>
+    {
+        typedef typename remove_reference<
+            typename fusion::result_of::front<Attribute>::type>::type
+        attr_type;
+
+        typedef pass_parser_attribute<Parser, attr_type, Context> pass;
+        typedef typename pass::type type;
+
+        template <typename Attribute_>
+        static type
+        call(Attribute_& attr)
+        {
+            return pass::call(fusion::front(attr));
+        }
+    };
+
+    template <typename Parser, typename Attribute, typename Context>
+    struct pass_parser_attribute<Parser, Attribute, Context,
+        typename enable_if_c<(!traits::is_variant<Attribute>::value)>::type>
+        : pass_non_variant_attribute<Parser, Attribute, Context>
+    {};
+
+    template <typename Parser, typename Context>
+    struct pass_parser_attribute<Parser, unused_type, Context>
+        : pass_variant_unused {};
+
+    template <typename Parser, typename Attribute, typename Context>
+    struct pass_variant_attribute :
+        mpl::if_c<traits::has_attribute<Parser, Context>::value
+          , pass_parser_attribute<Parser, Attribute, Context>
+          , pass_variant_unused>::type
+    {
+        typedef typename mpl::false_ is_alternative;
+    };
+
+    template <typename L, typename R, typename Attribute, typename Context>
+    struct pass_variant_attribute<alternative<L, R>, Attribute, Context> :
+        mpl::if_c<traits::has_attribute<alternative<L, R>, Context>::value
+          , pass_variant_used<Attribute>
+          , pass_variant_unused>::type
+    {
+        typedef typename mpl::true_ is_alternative;
+    };
+
+    template <typename L, typename R, typename C>
+    struct get_alternative_types
+    {
+        typedef
+            mpl::vector<
+                typename traits::attribute_of<L, C>::type
+              , typename traits::attribute_of<R, C>::type
+            >
+        type;
+    };
+
+    template <typename LL, typename LR, typename R, typename C>
+    struct get_alternative_types<alternative<LL, LR>, R, C>
+    {
+        typedef typename
+            mpl::push_back<
+                typename get_alternative_types<LL, LR, C>::type
+              , typename traits::attribute_of<R, C>::type
+            >::type
+        type;
+    };
+
+    template <typename L, typename RL, typename RR, typename C>
+    struct get_alternative_types<L, alternative<RL, RR>, C>
+    {
+        typedef typename
+            mpl::push_front<
+                typename get_alternative_types<RL, RR, C>::type
+              , typename traits::attribute_of<L, C>::type
+            >::type
+        type;
+    };
+
+    template <typename LL, typename LR, typename RL, typename RR, typename C>
+    struct get_alternative_types<alternative<LL, LR>, alternative<RL, RR>, C>
+    {
+        typedef
+            mpl::joint_view<
+                typename get_alternative_types<LL, LR, C>::type
+              , typename get_alternative_types<RL, RR, C>::type
+            >
+        type;
+    };
+
+    template <typename L, typename R, typename C>
+    struct attribute_of_alternative
+    {
+        // Get all alternative attribute types
+        typedef typename get_alternative_types<L, R, C>::type all_types;
+
+        // Filter all unused_types
+        typedef typename
+            mpl::copy_if<
+                all_types
+              , mpl::not_<is_same<mpl::_1, unused_type>>
+              , mpl::back_inserter<mpl::vector<>>
+            >::type
+        filtered_types;
+
+        // Build a variant if filtered_types is not empty,
+        // else just return unused_type
+        typedef typename
+            mpl::eval_if<
+                mpl::empty<filtered_types>
+              , mpl::identity<unused_type>
+              , make_variant_over<filtered_types>
+            >::type
+        type;
+    };
+
+    template <typename IsAlternative>
+    struct move_if_not_alternative
+    {
+        template<typename T1, typename T2>
+        static void call(T1& attr_, T2& attr) {}
+    };
+
+    template <>
+    struct move_if_not_alternative<mpl::false_ /*is alternative*/>
+    {
+        template<typename T1, typename T2>
+        static void call(T1& attr_, T2& attr)
+        {
+            traits::move_to(attr_, attr);
+        }
+    };
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_alternative(Parser const& p, Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr)
+    {
+        typedef detail::pass_variant_attribute<Parser, Attribute, Context> pass;
+
+        typename pass::type attr_ = pass::call(attr);
+        if (p.parse(first, last, context, rcontext, attr_))
+        {
+            move_if_not_alternative<typename pass::is_alternative>::call(attr_, attr);
+            return true;
+        }
+        return false;
+    }
+
+
+    template <typename Left, typename Right, typename Context, typename RContext>
+    struct parse_into_container_impl<alternative<Left, Right>, Context, RContext>
+    {
+        typedef alternative<Left, Right> parser_type;
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::true_)
+        {
+            return parse_alternative(parser, first, last, context, rcontext, attr);
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::false_)
+        {
+            return parse_into_container_base_impl<parser_type>::call(
+                parser, first, last, context, rcontext, attr);
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr)
+        {
+            typedef typename
+                traits::attribute_of<parser_type, Context>::type
+            attribute_type;
+
+            return call(parser, first, last, context, rcontext, attr
+                , traits::variant_has_substitute<attribute_type, Attribute>());
+        }
+    };
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/detail/sequence.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,501 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_SEQUENCE_DETAIL_JAN_06_2013_1015AM)
+#define SPIRIT_SEQUENCE_DETAIL_JAN_06_2013_1015AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+#include <boost/spirit/home/x3/support/traits/make_attribute.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/support/traits/is_substitute.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/end.hpp>
+#include <boost/fusion/include/advance.hpp>
+#include <boost/fusion/include/empty.hpp>
+#include <boost/fusion/include/front.hpp>
+#include <boost/fusion/include/iterator_range.hpp>
+#include <boost/fusion/include/as_deque.hpp>
+#include <boost/fusion/include/mpl.hpp>
+
+#include <boost/mpl/copy_if.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct sequence;
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    template <typename Parser, typename Context, typename Enable = void>
+    struct sequence_size
+    {
+        static int const value = traits::has_attribute<Parser, Context>::value;
+    };
+
+    template <typename Parser, typename Context>
+    struct sequence_size_subject
+      : sequence_size<typename Parser::subject_type, Context> {};
+
+    template <typename Parser, typename Context>
+    struct sequence_size<Parser, Context
+      , typename enable_if_c<(Parser::is_pass_through_unary)>::type>
+      : sequence_size_subject<Parser, Context> {};
+
+    template <typename L, typename R, typename Context>
+    struct sequence_size<sequence<L, R>, Context>
+    {
+        static int const value =
+            sequence_size<L, Context>::value +
+            sequence_size<R, Context>::value;
+    };
+
+    struct pass_sequence_attribute_unused
+    {
+        typedef unused_type type;
+
+        template <typename T>
+        static unused_type
+        call(T&)
+        {
+            return unused_type();
+        }
+    };
+
+    template <typename Attribute>
+    struct pass_sequence_attribute_front
+    {
+        typedef typename fusion::result_of::front<Attribute>::type type;
+
+        static typename add_reference<type>::type
+        call(Attribute& attr)
+        {
+            return fusion::front(attr);
+        }
+    };
+
+    template <typename Attribute>
+    struct pass_through_sequence_attribute
+    {
+        typedef Attribute& type;
+
+        template <typename Attribute_>
+        static Attribute_&
+        call(Attribute_& attr)
+        {
+            return attr;
+        }
+    };
+
+    template <typename Parser, typename Attribute>
+    struct pass_sequence_attribute_used :
+        mpl::if_<
+            traits::is_size_one_sequence<Attribute>
+          , pass_sequence_attribute_front<Attribute>
+          , pass_through_sequence_attribute<Attribute>>::type {};
+
+    template <typename Parser, typename Attribute, typename Enable = void>
+    struct pass_sequence_attribute :
+        mpl::if_<
+            fusion::result_of::empty<Attribute>
+          , pass_sequence_attribute_unused
+          , pass_sequence_attribute_used<Parser, Attribute>>::type {};
+
+    template <typename L, typename R, typename Attribute>
+    struct pass_sequence_attribute<sequence<L, R>, Attribute>
+      : pass_through_sequence_attribute<Attribute> {};
+
+    template <typename Parser, typename Attribute>
+    struct pass_sequence_attribute_subject :
+        pass_sequence_attribute<typename Parser::subject_type, Attribute> {};
+
+    template <typename Parser, typename Attribute>
+    struct pass_sequence_attribute<Parser, Attribute
+      , typename enable_if_c<(Parser::is_pass_through_unary)>::type>
+      : pass_sequence_attribute_subject<Parser, Attribute> {};
+
+    template <typename L, typename R, typename Attribute, typename Context
+      , typename Enable = void>
+    struct partition_attribute
+    {
+        static int const l_size = sequence_size<L, Context>::value;
+        static int const r_size = sequence_size<R, Context>::value;
+
+        // If you got an error here, then you are trying to pass
+        // a fusion sequence with the wrong number of elements
+        // as that expected by the (sequence) parser.
+        static_assert(
+            fusion::result_of::size<Attribute>::value == (l_size + r_size)
+          , "Attribute does not have the expected size."
+        );
+
+        typedef typename fusion::result_of::begin<Attribute>::type l_begin;
+        typedef typename fusion::result_of::advance_c<l_begin, l_size>::type l_end;
+        typedef typename fusion::result_of::end<Attribute>::type r_end;
+        typedef fusion::iterator_range<l_begin, l_end> l_part;
+        typedef fusion::iterator_range<l_end, r_end> r_part;
+        typedef pass_sequence_attribute<L, l_part> l_pass;
+        typedef pass_sequence_attribute<R, r_part> r_pass;
+
+        static l_part left(Attribute& s)
+        {
+            auto i = fusion::begin(s);
+            return l_part(i, fusion::advance_c<l_size>(i));
+        }
+
+        static r_part right(Attribute& s)
+        {
+            return r_part(
+                fusion::advance_c<l_size>(fusion::begin(s))
+              , fusion::end(s));
+        }
+    };
+
+    template <typename L, typename R, typename Attribute, typename Context>
+    struct partition_attribute<L, R, Attribute, Context,
+        typename enable_if_c<(!traits::has_attribute<L, Context>::value &&
+            traits::has_attribute<R, Context>::value)>::type>
+    {
+        typedef unused_type l_part;
+        typedef Attribute& r_part;
+        typedef pass_sequence_attribute_unused l_pass;
+        typedef pass_sequence_attribute<R, Attribute> r_pass;
+
+        static unused_type left(Attribute&)
+        {
+            return unused;
+        }
+
+        static Attribute& right(Attribute& s)
+        {
+            return s;
+        }
+    };
+
+    template <typename L, typename R, typename Attribute, typename Context>
+    struct partition_attribute<L, R, Attribute, Context,
+        typename enable_if_c<(traits::has_attribute<L, Context>::value &&
+            !traits::has_attribute<R, Context>::value)>::type>
+    {
+        typedef Attribute& l_part;
+        typedef unused_type r_part;
+        typedef pass_sequence_attribute<L, Attribute> l_pass;
+        typedef pass_sequence_attribute_unused r_pass;
+
+        static Attribute& left(Attribute& s)
+        {
+            return s;
+        }
+
+        static unused_type right(Attribute&)
+        {
+            return unused;
+        }
+    };
+
+    template <typename L, typename R, typename Attribute, typename Context>
+    struct partition_attribute<L, R, Attribute, Context,
+        typename enable_if_c<(!traits::has_attribute<L, Context>::value &&
+            !traits::has_attribute<R, Context>::value)>::type>
+    {
+        typedef unused_type l_part;
+        typedef unused_type r_part;
+        typedef pass_sequence_attribute_unused l_pass;
+        typedef pass_sequence_attribute_unused r_pass;
+
+        static unused_type left(Attribute&)
+        {
+            return unused;
+        }
+
+        static unused_type right(Attribute&)
+        {
+            return unused;
+        }
+    };
+
+    template <typename L, typename R, typename C>
+    struct get_sequence_types
+    {
+        typedef
+            mpl::vector<
+                typename traits::attribute_of<L, C>::type
+              , typename traits::attribute_of<R, C>::type
+            >
+        type;
+    };
+
+    template <typename LL, typename LR, typename R, typename C>
+    struct get_sequence_types<sequence<LL, LR>, R, C>
+    {
+        typedef typename
+            mpl::push_back<
+                typename get_sequence_types<LL, LR, C>::type
+              , typename traits::attribute_of<R, C>::type
+            >::type
+        type;
+    };
+
+    template <typename L, typename RL, typename RR, typename C>
+    struct get_sequence_types<L, sequence<RL, RR>, C>
+    {
+        typedef typename
+            mpl::push_front<
+                typename get_sequence_types<RL, RR, C>::type
+              , typename traits::attribute_of<L, C>::type
+            >::type
+        type;
+    };
+
+    template <typename LL, typename LR, typename RL, typename RR, typename C>
+    struct get_sequence_types<sequence<LL, LR>, sequence<RL, RR>, C>
+    {
+        typedef
+            mpl::joint_view<
+                typename get_sequence_types<LL, LR, C>::type
+              , typename get_sequence_types<RL, RR, C>::type
+            >
+        type;
+    };
+
+    template <typename L, typename R, typename C>
+    struct attribute_of_sequence
+    {
+        // Get all sequence attribute types
+        typedef typename get_sequence_types<L, R, C>::type all_types;
+
+        // Filter all unused_types
+        typedef typename
+            mpl::copy_if<
+                all_types
+              , mpl::not_<is_same<mpl::_1, unused_type>>
+              , mpl::back_inserter<mpl::vector<>>
+            >::type
+        filtered_types;
+
+        // Build a fusion::deque if filtered_types is not empty,
+        // else just return unused_type
+        typedef typename
+            mpl::eval_if<
+                mpl::empty<filtered_types>
+	    , mpl::identity<unused_type>
+	    , mpl::if_<mpl::equal_to<mpl::size<filtered_types>, mpl::int_<1> >,
+	    typename mpl::front<filtered_types>::type
+		      , typename fusion::result_of::as_deque<filtered_types>::type >
+            >::type
+        type;
+    };
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence(
+        Parser const& parser, Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr
+      , traits::tuple_attribute)
+    {
+        typedef typename Parser::left_type Left;
+        typedef typename Parser::right_type Right;
+        typedef partition_attribute<Left, Right, Attribute, Context> partition;
+        typedef typename partition::l_pass l_pass;
+        typedef typename partition::r_pass r_pass;
+
+        typename partition::l_part l_part = partition::left(attr);
+        typename partition::r_part r_part = partition::right(attr);
+        typename l_pass::type l_attr = l_pass::call(l_part);
+        typename r_pass::type r_attr = r_pass::call(r_part);
+
+        Iterator save = first;
+        if (parser.left.parse(first, last, context, rcontext, l_attr)
+            && parser.right.parse(first, last, context, rcontext, r_attr))
+            return true;
+        first = save;
+        return false;
+    }
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence(
+        Parser const& parser , Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr
+      , traits::plain_attribute)
+    {
+        typedef typename Parser::left_type Left;
+        typedef typename Parser::right_type Right;
+        typedef typename traits::attribute_of<Left, Context>::type l_attr_type;
+        typedef typename traits::attribute_of<Right, Context>::type r_attr_type;
+        typedef traits::make_attribute<l_attr_type, Attribute> l_make_attribute;
+        typedef traits::make_attribute<r_attr_type, Attribute> r_make_attribute;
+
+        typename l_make_attribute::type l_attr = l_make_attribute::call(attr);
+        typename r_make_attribute::type r_attr = r_make_attribute::call(attr);
+
+        Iterator save = first;
+        if (parser.left.parse(first, last, context, rcontext, l_attr)
+            && parser.right.parse(first, last, context, rcontext, r_attr))
+            return true;
+        first = save;
+        return false;
+    }
+
+    template <typename Left, typename Right, typename Iterator
+      , typename Context, typename RContext, typename Attribute>
+    bool parse_sequence(
+        Left const& left, Right const& right
+      , Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr
+      , traits::container_attribute);
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence(
+        Parser const& parser , Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr
+      , traits::container_attribute)
+    {
+        Iterator save = first;
+        if (parse_into_container(parser.left, first, last, context, rcontext, attr)
+            && parse_into_container(parser.right, first, last, context, rcontext, attr))
+            return true;
+        first = save;
+        return false;
+    }
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence_assoc(
+        Parser const& parser , Iterator& first, Iterator const& last
+	  , Context const& context, RContext& rcontext, Attribute& attr, mpl::false_ /*should_split*/)
+    {
+	    return parse_into_container(parser, first, last, context, rcontext, attr);
+    }
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence_assoc(
+        Parser const& parser , Iterator& first, Iterator const& last
+	  , Context const& context, RContext& rcontext, Attribute& attr, mpl::true_ /*should_split*/)
+    {
+        Iterator save = first;
+        if (parser.left.parse( first, last, context, rcontext, attr)
+            && parser.right.parse(first, last, context, rcontext, attr))
+            return true;
+        first = save;
+        return false;
+    }
+
+    template <typename Parser, typename Iterator, typename Context
+      , typename RContext, typename Attribute>
+    bool parse_sequence(
+        Parser const& parser, Iterator& first, Iterator const& last
+      , Context const& context, RContext& rcontext, Attribute& attr
+      , traits::associative_attribute)
+    {
+        // we can come here in 2 cases:
+        // - when sequence is key >> value and therefore must
+        // be parsed with tuple synthesized attribute and then
+        // that tuple is used to save into associative attribute provided here.
+        // Example:  key >> value;
+        //
+        // - when either this->left or this->right provides full key-value
+        // pair (like in case 1) and another one provides nothing.
+        // Example:  eps >> rule<class x; fusion::map<...> >
+        //
+        // first case must be parsed as whole, and second one should
+        // be parsed separately for left and right.
+
+        typedef typename traits::attribute_of<
+            decltype(parser.left), Context>::type l_attr_type;
+        typedef typename traits::attribute_of<
+            decltype(parser.right), Context>::type r_attr_type;
+
+        typedef typename
+            mpl::or_<
+                is_same<l_attr_type, unused_type>
+              , is_same<r_attr_type, unused_type> >
+        should_split;
+
+        return parse_sequence_assoc(parser, first, last, context, rcontext, attr
+          , should_split());
+    }
+
+    template <typename Left, typename Right, typename Context, typename RContext>
+    struct parse_into_container_impl<sequence<Left, Right>, Context, RContext>
+    {
+        typedef sequence<Left, Right> parser_type;
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::false_)
+        {
+            // inform user what went wrong if we jumped here in attempt to
+            // parse incompatible sequence into fusion::map
+            static_assert(!is_same< typename traits::attribute_category<Attribute>::type,
+                  traits::associative_attribute>::value,
+                  "To parse directly into fusion::map sequence must produce tuple attribute "
+                  "where type of first element is existing key in fusion::map and second element "
+                  "is value to be stored under that key");
+
+            Attribute attr_;
+            if (!parse_sequence(parser
+			       , first, last, context, rcontext, attr_, traits::container_attribute()))
+            {
+                return false;
+            }
+            traits::append(attr, traits::begin(attr_), traits::end(attr_));
+            return true;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr, mpl::true_)
+        {
+            return parse_into_container_base_impl<parser_type>::call(
+                parser, first, last, context, rcontext, attr);
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool call(
+            parser_type const& parser
+          , Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr)
+        {
+            typedef typename
+                traits::attribute_of<parser_type, Context>::type
+            attribute_type;
+
+            typedef typename
+                traits::container_value<Attribute>::type
+            value_type;
+
+            return call(parser, first, last, context, rcontext, attr
+	        , typename traits::is_substitute<attribute_type, value_type>::type());
+        }
+    };
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/difference.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,75 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_DIFFERENCE_FEBRUARY_11_2007_1250PM)
+#define SPIRIT_DIFFERENCE_FEBRUARY_11_2007_1250PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/has_attribute.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct difference : binary_parser<Left, Right, difference<Left, Right>>
+    {
+        typedef binary_parser<Left, Right, difference<Left, Right>> base_type;
+        static bool const handles_container = Left::handles_container;
+
+        difference(Left const& left, Right const& right)
+          : base_type(left, right) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            // Try Right first
+            Iterator start = first;
+            if (this->right.parse(first, last, context, rcontext, unused))
+            {
+                // Right succeeds, we fail.
+                first = start;
+                return false;
+            }
+            // Right fails, now try Left
+            return this->left.parse(first, last, context, rcontext, attr);
+        }
+
+        template <typename Left_, typename Right_>
+        difference<Left_, Right_>
+        make(Left_ const& left, Right_ const& right) const
+        {
+            return difference<Left_, Right_>(left, right);
+        }
+    };
+
+    template <typename Left, typename Right>
+    inline difference<
+        typename extension::as_parser<Left>::value_type
+      , typename extension::as_parser<Right>::value_type>
+    operator-(Left const& left, Right const& right)
+    {
+        return {as_parser(left), as_parser(right)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Left, typename Right, typename Context>
+    struct attribute_of<x3::difference<Left, Right>, Context>
+        : attribute_of<Left, Context> {};
+
+    template <typename Left, typename Right, typename Context>
+    struct has_attribute<x3::difference<Left, Right>, Context>
+        : has_attribute<Left, Context> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/kleene.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_KLEENE_JANUARY_07_2007_0818AM)
+#define SPIRIT_KLEENE_JANUARY_07_2007_0818AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct kleene : unary_parser<Subject, kleene<Subject>>
+    {
+        typedef unary_parser<Subject, kleene<Subject>> base_type;
+        static bool const handles_container = true;
+
+        kleene(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            while (detail::parse_into_container(
+                this->subject, first, last, context, rcontext, attr))
+                ;
+            return true;
+        }
+    };
+
+    template <typename Subject>
+    inline kleene<typename extension::as_parser<Subject>::value_type>
+    operator*(Subject const& subject)
+    {
+        return {as_parser(subject)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Subject, typename Context>
+    struct attribute_of<x3::kleene<Subject>, Context>
+        : build_container<
+            typename attribute_of<Subject, Context>::type> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,73 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_LIST_MARCH_24_2007_1031AM)
+#define SPIRIT_LIST_MARCH_24_2007_1031AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct list : binary_parser<Left, Right, list<Left, Right>>
+    {
+        typedef binary_parser<Left, Right, list<Left, Right>> base_type;
+        static bool const handles_container = true;
+        static bool const has_attribute = true;
+
+        list(Left const& left, Right const& right)
+          : base_type(left, right) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            // in order to succeed we need to match at least one element
+            if (!detail::parse_into_container(
+                this->left, first, last, context, rcontext, attr))
+                return false;
+
+            Iterator save = first;
+            while (this->right.parse(first, last, context, rcontext, unused)
+                && detail::parse_into_container(
+                    this->left, first, last, context, rcontext, attr))
+            {
+                save = first;
+            }
+
+            first = save;
+            return true;
+        }
+    };
+
+    template <typename Left, typename Right>
+    inline list<
+        typename extension::as_parser<Left>::value_type
+      , typename extension::as_parser<Right>::value_type>
+    operator%(Left const& left, Right const& right)
+    {
+        return {as_parser(left), as_parser(right)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Left, typename Right, typename Context>
+    struct attribute_of<x3::list<Left, Right>, Context>
+        : traits::build_container<
+            typename attribute_of<Left, Context>::type> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/not_predicate.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,47 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_NOT_PREDICATE_MARCH_23_2007_0618PM)
+#define SPIRIT_NOT_PREDICATE_MARCH_23_2007_0618PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct not_predicate : unary_parser<Subject, not_predicate<Subject>>
+    {
+        typedef unary_parser<Subject, not_predicate<Subject>> base_type;
+
+        typedef unused_type attribute_type;
+        static bool const has_attribute = false;
+
+        not_predicate(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& /*attr*/) const
+        {
+            Iterator i = first;
+            return !this->subject.parse(i, last, context, rcontext, unused);
+        }
+    };
+
+    template <typename Subject>
+    inline not_predicate<typename extension::as_parser<Subject>::value_type>
+    operator!(Subject const& subject)
+    {
+        return {as_parser(subject)};
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/optional.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,86 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_OPTIONAL_MARCH_23_2007_1117PM)
+#define SPIRIT_OPTIONAL_MARCH_23_2007_1117PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/proxy.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/spirit/home/x3/support/traits/optional_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct optional : proxy<Subject, optional<Subject>>
+    {
+        typedef proxy<Subject, optional<Subject>> base_type;
+        static bool const handles_container = true;
+
+        optional(Subject const& subject)
+          : base_type(subject) {}
+
+        using base_type::parse_subject;
+
+        // Attribute is a container
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse_subject(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr
+          , traits::container_attribute) const
+        {
+            detail::parse_into_container(
+                this->subject, first, last, context, rcontext, attr);
+            return true;
+        }
+
+        // Attribute is an optional
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse_subject(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr
+          , traits::optional_attribute) const
+        {
+            typedef typename
+                x3::traits::optional_value<Attribute>::type
+            value_type;
+
+            // create a local value
+            value_type val = value_type();
+
+            if (this->subject.parse(first, last, context, rcontext, val))
+            {
+                // assign the parsed value into our attribute
+                x3::traits::move_to(val, attr);
+            }
+            return true;
+        }
+    };
+
+    template <typename Subject>
+    inline optional<typename extension::as_parser<Subject>::value_type>
+    operator-(Subject const& subject)
+    {
+        return {as_parser(subject)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Subject, typename Context>
+    struct attribute_of<x3::optional<Subject>, Context>
+        : build_optional<
+            typename attribute_of<Subject, Context>::type> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/plus.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_PLUS_MARCH_13_2007_0127PM)
+#define SPIRIT_PLUS_MARCH_13_2007_0127PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/core/detail/parse_into_container.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Subject>
+    struct plus : unary_parser<Subject, plus<Subject>>
+    {
+        typedef unary_parser<Subject, plus<Subject>> base_type;
+        static bool const handles_container = true;
+
+        plus(Subject const& subject)
+          : base_type(subject) {}
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            if (!detail::parse_into_container(
+                this->subject, first, last, context, rcontext, attr))
+                return false;
+
+            while (detail::parse_into_container(
+                this->subject, first, last, context, rcontext, attr))
+                ;
+            return true;
+        }
+    };
+
+    template <typename Subject>
+    inline plus<typename extension::as_parser<Subject>::value_type>
+    operator+(Subject const& subject)
+    {
+        return {as_parser(subject)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Subject, typename Context>
+    struct attribute_of<x3::plus<Subject>, Context>
+        : build_container<
+            typename attribute_of<Subject, Context>::type> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/operator/sequence.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_SEQUENCE_JAN_06_2013_1015AM)
+#define SPIRIT_SEQUENCE_JAN_06_2013_1015AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/operator/detail/sequence.hpp>
+#include <boost/spirit/home/x3/directive/expect.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Left, typename Right>
+    struct sequence : binary_parser<Left, Right, sequence<Left, Right>>
+    {
+        typedef binary_parser<Left, Right, sequence<Left, Right>> base_type;
+
+        sequence(Left left, Right right)
+            : base_type(left, right) {}
+
+        template <typename Iterator, typename Context, typename RContext>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, unused_type) const
+        {
+            Iterator save = first;
+            if (this->left.parse(first, last, context, rcontext, unused)
+                && this->right.parse(first, last, context, rcontext, unused))
+                return true;
+            first = save;
+            return false;
+        }
+
+        template <typename Iterator, typename Context
+          , typename RContext, typename Attribute>
+        bool parse(
+            Iterator& first, Iterator const& last
+          , Context const& context, RContext& rcontext, Attribute& attr) const
+        {
+            return detail::parse_sequence(*this, first, last, context, rcontext, attr
+              , typename traits::attribute_category<Attribute>::type());
+        }
+    };
+
+    template <typename Left, typename Right>
+    inline sequence<
+        typename extension::as_parser<Left>::value_type
+      , typename extension::as_parser<Right>::value_type>
+    operator>>(Left const& left, Right const& right)
+    {
+        return {as_parser(left), as_parser(right)};
+    }
+
+    template <typename Left, typename Right>
+    inline sequence<
+        typename extension::as_parser<Left>::value_type
+      , expect_directive<typename extension::as_parser<Right>::value_type>>
+    operator>(Left const& left, Right const& right)
+    {
+        return {as_parser(left), as_parser(right)};
+    }
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Left, typename Right, typename Context>
+    struct attribute_of<x3::sequence<Left, Right>, Context>
+        : x3::detail::attribute_of_sequence<Left, Right, Context> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,17 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_STRING_FEBRUARY_03_2007_0355PM)
+#define BOOST_SPIRIT_X3_STRING_FEBRUARY_03_2007_0355PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/string/literal_string.hpp>
+#include <boost/spirit/home/x3/string/symbols.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/detail/string_parse.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,89 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_STRING_PARSE_APR_18_2006_1125PM)
+#define BOOST_SPIRIT_X3_STRING_PARSE_APR_18_2006_1125PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    template <typename Char, typename Iterator, typename Attribute>
+    inline bool string_parse(
+        Char const* str
+      , Iterator& first, Iterator const& last, Attribute& attr)
+    {
+        Iterator i = first;
+        Char ch = *str;
+
+        for (; !!ch; ++i)
+        {
+            if (i == last || (ch != *i))
+                return false;
+            ch = *++str;
+        }
+
+        x3::traits::move_to(first, i, attr);
+        first = i;
+        return true;
+    }
+
+    template <typename String, typename Iterator, typename Attribute>
+    inline bool string_parse(
+        String const& str
+      , Iterator& first, Iterator const& last, Attribute& attr)
+    {
+        Iterator i = first;
+        typename String::const_iterator stri = str.begin();
+        typename String::const_iterator str_last = str.end();
+
+        for (; stri != str_last; ++stri, ++i)
+            if (i == last || (*stri != *i))
+                return false;
+        x3::traits::move_to(first, i, attr);
+        first = i;
+        return true;
+    }
+
+    template <typename Char, typename Iterator, typename Attribute>
+    inline bool string_parse(
+        Char const* uc_i, Char const* lc_i
+      , Iterator& first, Iterator const& last, Attribute& attr)
+    {
+        Iterator i = first;
+
+        for (; *uc_i && *lc_i; ++uc_i, ++lc_i, ++i)
+            if (i == last || ((*uc_i != *i) && (*lc_i != *i)))
+                return false;
+        x3::traits::move_to(first, i, attr);
+        first = i;
+        return true;
+    }
+
+    template <typename String, typename Iterator, typename Attribute>
+    inline bool string_parse(
+        String const& ucstr, String const& lcstr
+      , Iterator& first, Iterator const& last, Attribute& attr)
+    {
+        typename String::const_iterator uc_i = ucstr.begin();
+        typename String::const_iterator uc_last = ucstr.end();
+        typename String::const_iterator lc_i = lcstr.begin();
+        Iterator i = first;
+
+        for (; uc_i != uc_last; ++uc_i, ++lc_i, ++i)
+            if (i == last || ((*uc_i != *i) && (*lc_i != *i)))
+                return false;
+        x3::traits::move_to(first, i, attr);
+        first = i;
+        return true;
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/detail/tst.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,213 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_TST_MARCH_09_2007_0905AM)
+#define BOOST_SPIRIT_X3_TST_MARCH_09_2007_0905AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/call_traits.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    // This file contains low level TST routines, not for
+    // public consumption.
+
+    template <typename Char, typename T>
+    struct tst_node
+    {
+        tst_node(Char id)
+          : id(id), data(0), lt(0), eq(0), gt(0)
+        {
+        }
+
+        template <typename Alloc>
+        static void
+        destruct_node(tst_node* p, Alloc* alloc)
+        {
+            if (p)
+            {
+                if (p->data)
+                    alloc->delete_data(p->data);
+                destruct_node(p->lt, alloc);
+                destruct_node(p->eq, alloc);
+                destruct_node(p->gt, alloc);
+                alloc->delete_node(p);
+            }
+        }
+
+        template <typename Alloc>
+        static tst_node*
+        clone_node(tst_node* p, Alloc* alloc)
+        {
+            if (p)
+            {
+                tst_node* clone = alloc->new_node(p->id);
+                if (p->data)
+                    clone->data = alloc->new_data(*p->data);
+                clone->lt = clone_node(p->lt, alloc);
+                clone->eq = clone_node(p->eq, alloc);
+                clone->gt = clone_node(p->gt, alloc);
+                return clone;
+            }
+            return 0;
+        }
+
+        template <typename Iterator, typename Filter>
+        static T*
+        find(tst_node* start, Iterator& first, Iterator last, Filter filter)
+        {
+            if (first == last)
+                return 0;
+
+            Iterator i = first;
+            Iterator latest = first;
+            tst_node* p = start;
+            T* found = 0;
+
+            while (p && i != last)
+            {
+                typename
+                    boost::detail::iterator_traits<Iterator>::value_type
+                c = filter(*i); // filter only the input
+
+                if (c == p->id)
+                {
+                    if (p->data)
+                    {
+                        found = p->data;
+                        latest = i;
+                    }
+                    p = p->eq;
+                    i++;
+                }
+                else if (c < p->id)
+                {
+                    p = p->lt;
+                }
+                else
+                {
+                    p = p->gt;
+                }
+            }
+
+            if (found)
+                first = ++latest; // one past the last matching char
+            return found;
+        }
+
+        template <typename Iterator, typename Alloc>
+        static T*
+        add(
+            tst_node*& start
+          , Iterator first
+          , Iterator last
+          , typename boost::call_traits<T>::param_type val
+          , Alloc* alloc)
+        {
+            if (first == last)
+                return 0;
+
+            tst_node** pp = &start;
+            for(;;)
+            {
+                typename
+                    boost::detail::iterator_traits<Iterator>::value_type
+                c = *first;
+
+                if (*pp == 0)
+                    *pp = alloc->new_node(c);
+                tst_node* p = *pp;
+
+                if (c == p->id)
+                {
+                    if (++first == last)
+                    {
+                        if (p->data == 0)
+                            p->data = alloc->new_data(val);
+                        return p->data;
+                    }
+                    pp = &p->eq;
+                }
+                else if (c < p->id)
+                {
+                    pp = &p->lt;
+                }
+                else
+                {
+                    pp = &p->gt;
+                }
+            }
+        }
+
+        template <typename Iterator, typename Alloc>
+        static void
+        remove(tst_node*& p, Iterator first, Iterator last, Alloc* alloc)
+        {
+            if (p == 0 || first == last)
+                return;
+
+            typename
+                boost::detail::iterator_traits<Iterator>::value_type
+            c = *first;
+
+            if (c == p->id)
+            {
+                if (++first == last)
+                {
+                    if (p->data)
+                    {
+                        alloc->delete_data(p->data);
+                        p->data = 0;
+                    }
+                }
+                remove(p->eq, first, last, alloc);
+            }
+            else if (c < p->id)
+            {
+                remove(p->lt, first, last, alloc);
+            }
+            else
+            {
+                remove(p->gt, first, last, alloc);
+            }
+
+            if (p->data == 0 && p->lt == 0 && p->eq == 0 && p->gt == 0)
+            {
+                alloc->delete_node(p);
+                p = 0;
+            }
+        }
+
+        template <typename F>
+        static void
+        for_each(tst_node* p, std::basic_string<Char> prefix, F f)
+        {
+            if (p)
+            {
+                for_each(p->lt, prefix, f);
+                std::basic_string<Char> s = prefix + p->id;
+                for_each(p->eq, s, f);
+                if (p->data)
+                    f(s, *p->data);
+                for_each(p->gt, prefix, f);
+            }
+        }
+
+        Char id;        // the node's identity character
+        T* data;        // optional data
+        tst_node* lt;   // left pointer
+        tst_node* eq;   // middle pointer
+        tst_node* gt;   // right pointer
+    };
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/literal_string.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,124 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM)
+#define BOOST_SPIRIT_X3_LITERAL_STRING_APR_18_2006_1125PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/string/detail/string_parse.hpp>
+#include <boost/spirit/home/x3/support/utility/utf8.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+#include <boost/spirit/home/support/char_encoding/standard.hpp>
+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <string>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename String, typename Encoding,
+        typename Attribute = std::basic_string<typename Encoding::char_type>>
+    struct literal_string : parser<literal_string<String, Encoding, Attribute>>
+    {
+        typedef typename Encoding::char_type char_type;
+        typedef Encoding encoding;
+        typedef Attribute attribute_type;
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+        static bool const handles_container = has_attribute;
+
+        literal_string(typename add_reference<String>::type str)
+          : str(str)
+        {}
+
+        template <typename Iterator, typename Context, typename Attribute_>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute_& attr) const
+        {
+            x3::skip_over(first, last, context);
+            return detail::string_parse(str, first, last, attr);
+        }
+
+        String str;
+    };
+
+    namespace standard
+    {
+        inline literal_string<char const*, char_encoding::standard>
+        string(char const* s)
+        {
+            return literal_string<char const*, char_encoding::standard>(s);
+        }
+    }
+    using standard::string;
+
+    namespace extension
+    {
+        template <int N>
+        struct as_parser<char[N]>
+        {
+            typedef
+                literal_string<
+                    char const*, char_encoding::standard, unused_type>
+            type;
+
+            typedef type value_type;
+
+            static type call(char const* s)
+            {
+                return type(s);
+            }
+        };
+
+        template <int N>
+        struct as_parser<char const[N]> : as_parser<char[N]> {};
+
+        template <int N>
+        struct as_parser<wchar_t[N]>
+        {
+            typedef
+                literal_string<
+                    wchar_t const*, char_encoding::standard_wide, unused_type>
+            type;
+
+            typedef type value_type;
+
+            static type call(wchar_t const* s)
+            {
+                return type(s);
+            }
+        };
+
+        template <int N>
+        struct as_parser<wchar_t const[N]> : as_parser<wchar_t[N]> {};
+    }
+
+    using standard::string;
+
+    inline literal_string<char const*, char_encoding::standard, unused_type>
+    lit(char const* s)
+    {
+        return literal_string<char const*, char_encoding::standard, unused_type>(s);
+    }
+
+    template <typename String, typename Encoding, typename Attribute>
+    struct get_info<literal_string<String, Encoding, Attribute>>
+    {
+        typedef std::string result_type;
+        std::string operator()(literal_string<String, Encoding, Attribute> const& p) const
+        {
+            return '"' + to_utf8(p.str) + '"';
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/symbols.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,358 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Carl Barron
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SYMBOLS_MARCH_11_2007_1055AM)
+#define BOOST_SPIRIT_X3_SYMBOLS_MARCH_11_2007_1055AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/core/skip_over.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/string/tst.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/string_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/range.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <initializer_list>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <
+        typename Char = char
+      , typename T = unused_type
+      , typename Lookup = tst<Char, T>
+      , typename Filter = tst_pass_through>
+    struct symbols : parser<symbols<Char, T, Lookup, Filter>>
+    {
+        typedef Char char_type; // the character type
+        typedef T value_type; // the value associated with each entry
+        typedef symbols<Char, T, Lookup, Filter> this_type;
+        typedef value_type attribute_type;
+
+        static bool const has_attribute =
+            !is_same<unused_type, attribute_type>::value;
+        static bool const handles_container =
+            traits::is_container<attribute_type>::value;
+
+        symbols(std::string const& name = "symbols")
+          : add(*this)
+          , remove(*this)
+          , lookup(new Lookup())
+          , name_(name)
+        {
+        }
+
+        symbols(symbols const& syms)
+          : add(*this)
+          , remove(*this)
+          , lookup(syms.lookup)
+          , name_(syms.name_)
+        {
+        }
+
+        template <typename Filter_>
+        symbols(symbols<Char, T, Lookup, Filter_> const& syms)
+          : add(*this)
+          , remove(*this)
+          , lookup(syms.lookup)
+          , name_(syms.name_)
+        {
+        }
+
+        template <typename Symbols>
+        symbols(Symbols const& syms, std::string const& name = "symbols")
+          : add(*this)
+          , remove(*this)
+          , lookup(new Lookup())
+          , name_(name)
+        {
+            typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+            while (si != boost::end(syms))
+                add(*si++);
+        }
+
+        template <typename Symbols, typename Data>
+        symbols(Symbols const& syms, Data const& data
+              , std::string const& name = "symbols")
+          : add(*this)
+          , remove(*this)
+          , lookup(new Lookup())
+          , name_(name)
+        {
+            typename range_const_iterator<Symbols>::type si = boost::begin(syms);
+            typename range_const_iterator<Data>::type di = boost::begin(data);
+            while (si != boost::end(syms))
+                add(*si++, *di++);
+        }
+
+        symbols(std::initializer_list<std::pair<Char const*, T>> syms
+              , std::string const & name="symbols")
+          : add(*this)
+          , remove(*this)
+          , lookup(new Lookup())
+          , name_(name)
+        {
+            typedef std::initializer_list<std::pair<Char const*, T>> symbols_t;
+            typename range_const_iterator<symbols_t>::type si = boost::begin(syms);
+            for (;si != boost::end(syms); ++si)
+                add(si->first, si->second);
+        }
+        
+        symbols(std::initializer_list<Char const*> syms
+              , std::string const &name="symbols")
+          : add(*this)
+          , remove(*this)
+          , lookup(new Lookup())
+          , name_(name)
+        {
+            typedef std::initializer_list<Char const*> symbols_t;
+            typename range_const_iterator<symbols_t>::type si = boost::begin(syms);
+            while (si != boost::end(syms))
+                add(*si++);
+        }
+
+        symbols&
+        operator=(symbols const& rhs)
+        {
+            name_ = rhs.name_;
+            lookup = rhs.lookup;
+            return *this;
+        }
+
+        template <typename Filter_>
+        symbols&
+        operator=(symbols<Char, T, Lookup, Filter_> const& rhs)
+        {
+            name_ = rhs.name_;
+            lookup = rhs.lookup;
+            return *this;
+        }
+
+        void clear()
+        {
+            lookup->clear();
+        }
+
+        struct adder;
+        struct remover;
+
+        template <typename Str>
+        adder const&
+        operator=(Str const& str)
+        {
+            lookup->clear();
+            return add(str);
+        }
+
+        template <typename Str>
+        friend adder const&
+        operator+=(symbols& sym, Str const& str)
+        {
+            return sym.add(str);
+        }
+
+        template <typename Str>
+        friend remover const&
+        operator-=(symbols& sym, Str const& str)
+        {
+            return sym.remove(str);
+        }
+
+        template <typename F>
+        void for_each(F f) const
+        {
+            lookup->for_each(f);
+        }
+
+        template <typename Str>
+        value_type& at(Str const& str)
+        {
+            return *lookup->add(traits::get_string_begin<Char>(str)
+                , traits::get_string_end<Char>(str), T());
+        }
+
+        template <typename Iterator>
+        value_type* prefix_find(Iterator& first, Iterator const& last)
+        {
+            return lookup->find(first, last, Filter());
+        }
+
+        template <typename Iterator>
+        value_type const* prefix_find(Iterator& first, Iterator const& last) const
+        {
+            return lookup->find(first, last, Filter());
+        }
+
+        template <typename Str>
+        value_type* find(Str const& str)
+        {
+            return find_impl(traits::get_string_begin<Char>(str)
+                , traits::get_string_end<Char>(str));
+        }
+
+        template <typename Str>
+        value_type const* find(Str const& str) const
+        {
+            return find_impl(traits::get_string_begin<Char>(str)
+                , traits::get_string_end<Char>(str));
+        }
+
+    private:
+        template <typename Iterator>
+        value_type* find_impl(Iterator begin, Iterator end)
+        {
+            value_type* r = lookup->find(begin, end, Filter());
+            return begin == end ? r : 0;
+        }
+
+        template <typename Iterator>
+        value_type const* find_impl(Iterator begin, Iterator end) const
+        {
+            value_type const* r = lookup->find(begin, end, Filter());
+            return begin == end ? r : 0;
+        }
+
+    public:
+        template <typename Iterator, typename Context, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context const& context, unused_type, Attribute& attr) const
+        {
+            x3::skip_over(first, last, context);
+
+            if (value_type* val_ptr
+                = lookup->find(first, last, Filter()))
+            {
+                x3::traits::move_to(*val_ptr, attr);
+                return true;
+            }
+            return false;
+        }
+
+        void name(std::string const &str)
+        {
+            name_ = str;
+        }
+        std::string const &name() const
+        {
+            return name_;
+        }
+
+        struct adder
+        {
+            template <typename, typename = unused_type, typename = unused_type>
+            struct result { typedef adder const& type; };
+
+            adder(symbols& sym)
+              : sym(sym)
+            {
+            }
+
+            template <typename Iterator>
+            adder const&
+            operator()(Iterator first, Iterator last, T const& val) const
+            {
+                sym.lookup->add(first, last, val);
+                return *this;
+            }
+
+            template <typename Str>
+            adder const&
+            operator()(Str const& s, T const& val = T()) const
+            {
+                sym.lookup->add(traits::get_string_begin<Char>(s)
+                  , traits::get_string_end<Char>(s), val);
+                return *this;
+            }
+
+            template <typename Str>
+            adder const&
+            operator,(Str const& s) const
+            {
+                sym.lookup->add(traits::get_string_begin<Char>(s)
+                  , traits::get_string_end<Char>(s), T());
+                return *this;
+            }
+
+            symbols& sym;
+        };
+
+        struct remover
+        {
+            template <typename, typename = unused_type, typename = unused_type>
+            struct result { typedef remover const& type; };
+
+            remover(symbols& sym)
+              : sym(sym)
+            {
+            }
+
+            template <typename Iterator>
+            remover const&
+            operator()(Iterator const& first, Iterator const& last) const
+            {
+                sym.lookup->remove(first, last);
+                return *this;
+            }
+
+            template <typename Str>
+            remover const&
+            operator()(Str const& s) const
+            {
+                sym.lookup->remove(traits::get_string_begin<Char>(s)
+                  , traits::get_string_end<Char>(s));
+                return *this;
+            }
+
+            template <typename Str>
+            remover const&
+            operator,(Str const& s) const
+            {
+                sym.lookup->remove(traits::get_string_begin<Char>(s)
+                  , traits::get_string_end<Char>(s));
+                return *this;
+            }
+
+            symbols& sym;
+        };
+
+        adder add;
+        remover remove;
+        shared_ptr<Lookup> lookup;
+        std::string name_;
+    };
+
+    template <typename Char, typename T, typename Lookup, typename Filter>
+    struct get_info<symbols<Char, T, Lookup, Filter>>
+    {
+      typedef std::string result_type;
+      result_type operator()(symbols< Char, T
+                                    , Lookup, Filter
+                                    > const& symbols) const
+      {
+         return symbols.name();
+      }
+    };
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/tst.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,137 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_TST_JUNE_03_2007_1031AM)
+#define BOOST_SPIRIT_X3_TST_JUNE_03_2007_1031AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/string/detail/tst.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct tst_pass_through
+    {
+        template <typename Char>
+        Char operator()(Char ch) const
+        {
+            return ch;
+        }
+    };
+
+    template <typename Char, typename T>
+    struct tst
+    {
+        typedef Char char_type; // the character type
+        typedef T value_type; // the value associated with each entry
+        typedef detail::tst_node<Char, T> node;
+
+        tst()
+          : root(0)
+        {
+        }
+
+        ~tst()
+        {
+            clear();
+        }
+
+        tst(tst const& rhs)
+          : root(0)
+        {
+            copy(rhs);
+        }
+
+        tst& operator=(tst const& rhs)
+        {
+            return assign(rhs);
+        }
+
+        template <typename Iterator, typename Filter>
+        T* find(Iterator& first, Iterator last, Filter filter) const
+        {
+            return node::find(root, first, last, filter);
+        }
+
+        template <typename Iterator>
+        T* find(Iterator& first, Iterator last) const
+        {
+            return find(first, last, tst_pass_through());
+        }
+
+        template <typename Iterator>
+        T* add(
+            Iterator first
+          , Iterator last
+          , typename boost::call_traits<T>::param_type val)
+        {
+            return node::add(root, first, last, val, this);
+        }
+
+        template <typename Iterator>
+        void remove(Iterator first, Iterator last)
+        {
+            node::remove(root, first, last, this);
+        }
+
+        void clear()
+        {
+            node::destruct_node(root, this);
+            root = 0;
+        }
+
+        template <typename F>
+        void for_each(F f) const
+        {
+            node::for_each(root, std::basic_string<Char>(), f);
+        }
+
+    private:
+
+        friend struct detail::tst_node<Char, T>;
+
+        void copy(tst const& rhs)
+        {
+            root = node::clone_node(rhs.root, this);
+        }
+
+        tst& assign(tst const& rhs)
+        {
+            if (this != &rhs)
+            {
+                clear();
+                copy(rhs);
+            }
+            return *this;
+        }
+
+        node* root;
+
+        node* new_node(Char id)
+        {
+            return new node(id);
+        }
+
+        T* new_data(typename boost::call_traits<T>::param_type val)
+        {
+            return new T(val);
+        }
+
+        void delete_node(node* p)
+        {
+            delete p;
+        }
+
+        void delete_data(T* p)
+        {
+            delete p;
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/string/tst_map.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,216 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_TST_MAP_JUNE_03_2007_1143AM)
+#define BOOST_SPIRIT_X3_TST_MAP_JUNE_03_2007_1143AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/string/detail/tst.hpp>
+#include <unordered_map>
+#include <boost/pool/object_pool.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct tst_pass_through; // declared in tst.hpp
+
+    template <typename Char, typename T>
+    struct tst_map
+    {
+        typedef Char char_type; // the character type
+        typedef T value_type; // the value associated with each entry
+        typedef detail::tst_node<Char, T> node;
+
+        tst_map()
+        {
+        }
+
+        ~tst_map()
+        {
+            // Nothing to do here.
+            // The pools do the right thing for us
+        }
+
+        tst_map(tst_map const& rhs)
+        {
+            copy(rhs);
+        }
+
+        tst_map& operator=(tst_map const& rhs)
+        {
+            return assign(rhs);
+        }
+
+        template <typename Iterator, typename Filter>
+        T* find(Iterator& first, Iterator last, Filter filter) const
+        {
+            if (first != last)
+            {
+                Iterator save = first;
+                typename map_type::const_iterator
+                    i = map.find(filter(*first++));
+                if (i == map.end())
+                {
+                    first = save;
+                    return 0;
+                }
+                if (T* p = node::find(i->second.root, first, last, filter))
+                {
+                    return p;
+                }
+                return i->second.data;
+            }
+            return 0;
+        }
+
+        template <typename Iterator>
+        T* find(Iterator& first, Iterator last) const
+        {
+            return find(first, last, tst_pass_through());
+        }
+
+        template <typename Iterator>
+        bool add(
+            Iterator first
+          , Iterator last
+          , typename boost::call_traits<T>::param_type val)
+        {
+            if (first != last)
+            {
+                map_data x = {0, 0};
+                std::pair<typename map_type::iterator, bool>
+                    r = map.insert(std::pair<Char, map_data>(*first++, x));
+
+                if (first != last)
+                {
+                    return node::add(r.first->second.root
+                      , first, last, val, this) ? true : false;
+                }
+                else
+                {
+                    if (r.first->second.data)
+                        return false;
+                    r.first->second.data = this->new_data(val);
+                }
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Iterator>
+        void remove(Iterator first, Iterator last)
+        {
+            if (first != last)
+            {
+                typename map_type::iterator i = map.find(*first++);
+                if (i != map.end())
+                {
+                    if (first != last)
+                    {
+                        node::remove(i->second.root, first, last, this);
+                    }
+                    else if (i->second.data)
+                    {
+                        this->delete_data(i->second.data);
+                        i->second.data = 0;
+                    }
+                    if (i->second.data == 0 && i->second.root == 0)
+                    {
+                        map.erase(i);
+                    }
+                }
+            }
+        }
+
+        void clear()
+        {
+            BOOST_FOREACH(typename map_type::value_type& x, map)
+            {
+                node::destruct_node(x.second.root, this);
+                if (x.second.data)
+                    this->delete_data(x.second.data);
+            }
+            map.clear();
+        }
+
+        template <typename F>
+        void for_each(F f) const
+        {
+            BOOST_FOREACH(typename map_type::value_type const& x, map)
+            {
+                std::basic_string<Char> s(1, x.first);
+                node::for_each(x.second.root, s, f);
+                if (x.second.data)
+                    f(s, *x.second.data);
+            }
+        }
+
+    private:
+
+        friend struct detail::tst_node<Char, T>;
+
+        struct map_data
+        {
+            node* root;
+            T* data;
+        };
+
+        typedef std::unordered_map<Char, map_data> map_type;
+
+        void copy(tst_map const& rhs)
+        {
+            BOOST_FOREACH(typename map_type::value_type const& x, rhs.map)
+            {
+                map_data xx = {node::clone_node(x.second.root, this), 0};
+                if (x.second.data)
+                    xx.data = data_pool.construct(*x.second.data);
+                map[x.first] = xx;
+            }
+        }
+
+        tst_map& assign(tst_map const& rhs)
+        {
+            if (this != &rhs)
+            {
+                BOOST_FOREACH(typename map_type::value_type& x, map)
+                {
+                    node::destruct_node(x.second.root, this);
+                }
+                map.clear();
+                copy(rhs);
+            }
+            return *this;
+        }
+
+        node* new_node(Char id)
+        {
+            return node_pool.construct(id);
+        }
+
+        T* new_data(typename boost::call_traits<T>::param_type val)
+        {
+            return data_pool.construct(val);
+        }
+
+        void delete_node(node* p)
+        {
+            node_pool.destroy(p);
+        }
+
+        void delete_data(T* p)
+        {
+            data_pool.destroy(p);
+        }
+
+        map_type map;
+        object_pool<node> node_pool;
+        object_pool<T> data_pool;
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/ast/position_tagged.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,96 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_POSITION_TAGGED_MAY_01_2014_0321PM)
+#define BOOST_SPIRIT_X3_POSITION_TAGGED_MAY_01_2014_0321PM
+
+#include <boost/range.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    struct position_tagged
+    {
+        // Use this to annotate an AST with the iterator position.
+        // These ids are used as a key to the position_cache (below)
+        // and marks the start and end of an AST node.
+        int id_first = -1;
+        int id_last = -1;
+    };
+
+    template <typename Container>
+    class position_cache
+    {
+    public:
+
+        typedef typename Container::value_type iterator_type;
+
+        position_cache(
+            iterator_type first
+          , iterator_type last)
+          : first_(first), last_(last) {}
+
+        // This will catch all nodes inheriting from position_tagged
+        boost::iterator_range<iterator_type>
+        position_of(position_tagged const& ast) const
+        {
+            return
+                boost::iterator_range<iterator_type>(
+                    positions.at(ast.id_first) // throws if out of range
+                  , positions.at(ast.id_last)  // throws if out of range
+                );
+        }
+
+        // This will catch all nodes except those inheriting from position_tagged
+        template <typename AST>
+        boost::iterator_range<iterator_type>
+        position_of(AST const& ast) const
+        {
+            // returns an empty position
+            return boost::iterator_range<iterator_type>();
+        }
+        
+        // This will catch all nodes except those inheriting from position_tagged
+        template <typename AST>
+        void annotate(AST& ast, iterator_type first, iterator_type last, mpl::false_)
+        {
+            // (no-op) no need for tags
+        }
+
+        // This will catch all nodes inheriting from position_tagged
+        void annotate(position_tagged& ast, iterator_type first, iterator_type last, mpl::true_)
+        {
+            ast.id_first = int(positions.size());
+            positions.push_back(first);
+            ast.id_last = int(positions.size());
+            positions.push_back(last);
+        }
+
+        template <typename AST>
+        void annotate(AST& ast, iterator_type first, iterator_type last)
+        {
+            annotate(ast, first, last, is_base_of<position_tagged, AST>());
+        }
+
+        Container const&
+        get_positions() const
+        {
+            return positions;
+        }
+
+        iterator_type first() const { return first_; }
+        iterator_type last() const { return last_; }
+
+    private:
+
+        Container positions;
+        iterator_type first_;
+        iterator_type last_;
+    };
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/ast/variant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,249 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_VARIANT_AUGUST_6_2011_0859AM)
+#define BOOST_SPIRIT_X3_VARIANT_AUGUST_6_2011_0859AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/mpl/list.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T>
+    class forward_ast
+    {
+    public:
+
+        typedef T type;
+
+    public:
+
+        forward_ast() : p_(new T) {}
+
+        forward_ast(forward_ast const& operand)
+            : p_(new T(operand.get())) {}
+
+        forward_ast(forward_ast&& operand)
+            : p_(operand.p_)
+        {
+            operand.p_ = 0;
+        }
+
+        forward_ast(T const& operand)
+            : p_(new T(operand)) {}
+
+        forward_ast(T&& operand)
+            : p_(new T(std::move(operand))) {}
+
+        ~forward_ast()
+        {
+            boost::checked_delete(p_);
+        }
+
+        forward_ast& operator=(forward_ast const& rhs)
+        {
+            assign(rhs.get());
+            return *this;
+        }
+
+        void swap(forward_ast& operand) BOOST_NOEXCEPT
+        {
+            T* temp = operand.p_;
+            operand.p_ = p_;
+            p_ = temp;
+        }
+
+        forward_ast& operator=(T const& rhs)
+        {
+            assign(rhs);
+            return *this;
+        }
+
+        forward_ast& operator=(forward_ast&& rhs) BOOST_NOEXCEPT
+        {
+            swap(rhs);
+            return *this;
+        }
+
+        forward_ast& operator=(T&& rhs)
+        {
+            get() = std::move(rhs);
+            return *this;
+        }
+
+        T& get() { return *get_pointer(); }
+        const T& get() const { return *get_pointer(); }
+
+        T* get_pointer() { return p_; }
+        const T* get_pointer() const { return p_; }
+
+        operator T const&() const { return this->get(); }
+        operator T&() { return this->get(); }
+
+    private:
+
+        void assign(const T& rhs)
+        {
+            this->get() = rhs;
+        }
+
+        T* p_;
+    };
+
+    // function template swap
+    //
+    // Swaps two forward_ast<T> objects of the same type T.
+    //
+    template <typename T>
+    inline void swap(forward_ast<T>& lhs, forward_ast<T>& rhs) BOOST_NOEXCEPT
+    {
+        lhs.swap(rhs);
+    }
+
+    namespace detail
+    {
+        template <typename T>
+        struct remove_forward : mpl::identity<T>
+        {};
+
+        template <typename T>
+        struct remove_forward<forward_ast<T>> : mpl::identity<T>
+        {};
+    }
+
+    template <typename ...Types>
+    struct variant
+    {
+        // tell spirit that this is an adapted variant
+        struct adapted_variant_tag;
+
+        typedef boost::variant<Types...> variant_type;
+        typedef mpl::list<typename detail::remove_forward<Types>::type...> types;
+        typedef variant<Types...> base_type;
+
+        variant() : var() {}
+
+        template <typename T, typename disable_if<is_base_of<base_type, T>>::type>
+        explicit variant(T const& rhs)
+            : var(rhs) {}
+
+        template <typename T, typename disable_if<is_base_of<base_type, T>>::type>
+        explicit variant(T&& rhs)
+            : var(std::forward<T>(rhs)) {}
+
+        variant(variant const& rhs)
+            : var(rhs.var) {}
+
+        variant(variant& rhs)
+            : var(rhs.var) {}
+
+        variant(variant&& rhs)
+            : var(std::forward<variant_type>(rhs.var)) {}
+
+        variant& operator=(variant const& rhs)
+        {
+            var = rhs.get();
+            return *this;
+        }
+
+        variant& operator=(variant&& rhs)
+        {
+            var = std::forward<variant_type>(rhs.get());
+            return *this;
+        }
+
+        template <typename T>
+        //typename disable_if<is_base_of<base_type, T>, variant&>::type
+        variant& operator=(T const& rhs)
+        {
+            var = rhs;
+            return *this;
+        }
+
+        template <typename T>
+        //typename disable_if<is_base_of<base_type, T>, variant&>::type
+        variant& operator=(T&& rhs)
+        {
+            var = std::forward<T>(rhs);
+            return *this;
+        }
+
+        template <typename F>
+        typename F::result_type apply_visitor(F const& v)
+        {
+            return var.apply_visitor(v);
+        }
+
+        template <typename F>
+        typename F::result_type apply_visitor(F const& v) const
+        {
+            return var.apply_visitor(v);
+        }
+
+        template <typename F>
+        typename F::result_type apply_visitor(F& v)
+        {
+            return var.apply_visitor(v);
+        }
+
+        template <typename F>
+        typename F::result_type apply_visitor(F& v) const
+        {
+            return var.apply_visitor(v);
+        }
+
+        variant_type const& get() const
+        {
+            return var;
+        }
+
+        variant_type& get()
+        {
+            return var;
+        }
+
+        variant_type var;
+    };
+}}}
+
+namespace boost
+{
+    template <typename T, typename ...Types>
+    inline T const&
+    get(boost::spirit::x3::variant<Types...> const& x)
+    {
+        return boost::get<T>(x.get());
+    }
+
+    template <typename T, typename ...Types>
+    inline T&
+    get(boost::spirit::x3::variant<Types...>& x)
+    {
+        return boost::get<T>(x.get());
+    }
+
+    template <typename T, typename ...Types>
+    inline T const*
+    get(boost::spirit::x3::variant<Types...> const* x)
+    {
+        return boost::get<T>(&x->get());
+    }
+
+    template <typename T, typename ...Types>
+    inline T*
+    get(boost::spirit::x3::variant<Types...>* x)
+    {
+        return boost::get<T>(&x->get());
+    }
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/context.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,135 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM)
+#define BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename ID, typename T, typename Next = unused_type>
+    struct context
+    {
+        context(T& val, Next const& next)
+            : val(val), next(next) {}
+
+        template <typename ID_, typename Unused = void>
+        struct get_result
+        {
+            typedef typename Next::template get_result<ID_>::type type;
+        };
+
+        template <typename Unused>
+        struct get_result<mpl::identity<ID>, Unused>
+        {
+            typedef T& type;
+        };
+
+        T& get(mpl::identity<ID>) const
+        {
+            return val;
+        }
+
+        template <typename ID_>
+        typename Next::template get_result<ID_>::type
+        get(ID_ id) const
+        {
+            return next.get(id);
+        }
+
+        T& val;
+        Next const& next;
+    };
+
+    template <typename ID, typename T>
+    struct context<ID, T, unused_type>
+    {
+        context(T& val)
+            : val(val) {}
+
+        context(T& val, unused_type)
+            : val(val) {}
+
+        template <typename ID_, typename Unused = void>
+        struct get_result
+        {
+            typedef unused_type type;
+        };
+
+        template <typename Unused>
+        struct get_result<mpl::identity<ID>, Unused>
+        {
+            typedef T& type;
+        };
+
+        T& get(mpl::identity<ID>) const
+        {
+            return val;
+        }
+
+        template <typename ID_>
+        unused_type
+        get(ID_) const
+        {
+            return unused;
+        }
+
+        T& val;
+    };
+
+    template <typename Tag, typename Context>
+    inline auto
+    get(Context const& context)
+        -> decltype(context.get(mpl::identity<Tag>()))
+    {
+        return context.get(mpl::identity<Tag>());
+    }
+
+    template <typename ID, typename T, typename Next>
+    inline context<ID, T, Next> make_context(T& val, Next const& next)
+    {
+        return context<ID, T, Next>(val, next);
+    }
+
+    template <typename ID, typename T>
+    inline context<ID, T> make_context(T& val)
+    {
+        return context<ID, T>(val);
+    }
+    
+    namespace detail
+    {
+        template <typename ID, typename T, typename Next, typename FoundVal>
+        inline Next const&
+        make_unique_context(T& val, Next const& next, FoundVal&)
+        {
+            return next;
+        }
+        
+        template <typename ID, typename T, typename Next>
+        inline context<ID, T, Next>
+        make_unique_context(T& val, Next const& next, unused_type)
+        {
+            return context<ID, T, Next>(val, next);
+        }
+    }
+    
+    template <typename ID, typename T, typename Next>
+    inline auto
+    make_unique_context(T& val, Next const& next)
+    {
+        return detail::make_unique_context<ID>(val, next, x3::get<ID>(next));
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/detail/extract_int.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,512 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    Copyright (c) 2011 Jan Frederick Eick
+    Copyright (c) 2011 Christopher Jefferson
+    Copyright (c) 2006 Stephen Nutt
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_DETAIL_EXTRACT_INT_APRIL_17_2006_0816AM)
+#define BOOST_SPIRIT_X3_DETAIL_EXTRACT_INT_APRIL_17_2006_0816AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_type.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/spirit/home/x3/support/traits/numeric_traits.hpp>
+#include <boost/spirit/home/support/char_encoding/ascii.hpp>
+
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+
+#include <boost/detail/iterator.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/limits.hpp>
+
+#if !defined(SPIRIT_NUMERICS_LOOP_UNROLL)
+# define SPIRIT_NUMERICS_LOOP_UNROLL 3
+#endif
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  The maximum radix digits that can be represented without
+    //  overflow:
+    //
+    //          template<typename T, unsigned Radix>
+    //          struct digits_traits::value;
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, unsigned Radix>
+    struct digits_traits;
+
+// lookup table for log2(x) : 2 <= x <= 36
+#define BOOST_SPIRIT_X3_LOG2 (#error)(#error)                                   \
+        (1000000)(1584960)(2000000)(2321920)(2584960)(2807350)                  \
+        (3000000)(3169920)(3321920)(3459430)(3584960)(3700430)                  \
+        (3807350)(3906890)(4000000)(4087460)(4169920)(4247920)                  \
+        (4321920)(4392310)(4459430)(4523560)(4584960)(4643850)                  \
+        (4700430)(4754880)(4807350)(4857980)(4906890)(4954190)                  \
+        (5000000)(5044390)(5087460)(5129280)(5169925)                           \
+    /***/
+
+#define BOOST_PP_LOCAL_MACRO(Radix)                                             \
+    template <typename T> struct digits_traits<T, Radix>                        \
+    {                                                                           \
+        typedef std::numeric_limits<T> numeric_limits_type;                     \
+        BOOST_STATIC_CONSTANT(int, value = static_cast<int>(                    \
+            (numeric_limits_type::digits * 1000000) /                           \
+                BOOST_PP_SEQ_ELEM(Radix, BOOST_SPIRIT_X3_LOG2)));               \
+    };                                                                          \
+    /***/
+
+#define BOOST_PP_LOCAL_LIMITS (2, 36)
+#include BOOST_PP_LOCAL_ITERATE()
+
+#undef BOOST_SPIRIT_X3_LOG2
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  Traits class for radix specific number conversion
+    //
+    //      Test the validity of a single character:
+    //
+    //          template<typename Char> static bool is_valid(Char ch);
+    //
+    //      Convert a digit from character representation to binary
+    //      representation:
+    //
+    //          template<typename Char> static int digit(Char ch);
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <unsigned Radix>
+    struct radix_traits
+    {
+        template <typename Char>
+        inline static bool is_valid(Char ch)
+        {
+            if (Radix <= 10)
+                return (ch >= '0' && ch <= static_cast<Char>('0' + Radix -1));
+            return (ch >= '0' && ch <= '9')
+                || (ch >= 'a' && ch <= static_cast<Char>('a' + Radix -10 -1))
+                || (ch >= 'A' && ch <= static_cast<Char>('A' + Radix -10 -1));
+        }
+
+        template <typename Char>
+        inline static unsigned digit(Char ch)
+        {
+            if (Radix <= 10 || (ch >= '0' && ch <= '9'))
+                return ch - '0';
+            return char_encoding::ascii::tolower(ch) - 'a' + 10;
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  positive_accumulator/negative_accumulator: Accumulator policies for
+    //  extracting integers. Use positive_accumulator if number is positive.
+    //  Use negative_accumulator if number is negative.
+    ///////////////////////////////////////////////////////////////////////////
+    template <unsigned Radix>
+    struct positive_accumulator
+    {
+        template <typename T, typename Char>
+        inline static void add(T& n, Char ch, mpl::false_) // unchecked add
+        {
+            const int digit = radix_traits<Radix>::digit(ch);
+            n = n * T(Radix) + T(digit);
+        }
+
+        template <typename T, typename Char>
+        inline static bool add(T& n, Char ch, mpl::true_) // checked add
+        {
+            // Ensure n *= Radix will not overflow
+            static T const max = (std::numeric_limits<T>::max)();
+            static T const val = max / Radix;
+            if (n > val)
+                return false;
+
+            n *= Radix;
+
+            // Ensure n += digit will not overflow
+            const int digit = radix_traits<Radix>::digit(ch);
+            if (n > max - digit)
+                return false;
+
+            n += static_cast<T>(digit);
+            return true;
+        }
+    };
+
+    template <unsigned Radix>
+    struct negative_accumulator
+    {
+        template <typename T, typename Char>
+        inline static void add(T& n, Char ch, mpl::false_) // unchecked subtract
+        {
+            const int digit = radix_traits<Radix>::digit(ch);
+            n = n * T(Radix) - T(digit);
+        }
+
+        template <typename T, typename Char>
+        inline static bool add(T& n, Char ch, mpl::true_) // checked subtract
+        {
+            // Ensure n *= Radix will not underflow
+            static T const min = (std::numeric_limits<T>::min)();
+            static T const val = (min + 1) / T(Radix);
+            if (n < val)
+                return false;
+
+            n *= Radix;
+
+            // Ensure n -= digit will not underflow
+            int const digit = radix_traits<Radix>::digit(ch);
+            if (n < min + digit)
+                return false;
+
+            n -= static_cast<T>(digit);
+            return true;
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Common code for extract_int::parse specializations
+    ///////////////////////////////////////////////////////////////////////////
+    template <unsigned Radix, typename Accumulator, int MaxDigits>
+    struct int_extractor
+    {
+        template <typename Char, typename T>
+        inline static bool
+        call(Char ch, std::size_t count, T& n, mpl::true_)
+        {
+            static std::size_t const
+                overflow_free = digits_traits<T, Radix>::value - 1;
+
+            if (count < overflow_free)
+            {
+                Accumulator::add(n, ch, mpl::false_());
+            }
+            else
+            {
+                if (!Accumulator::add(n, ch, mpl::true_()))
+                    return false; //  over/underflow!
+            }
+            return true;
+        }
+
+        template <typename Char, typename T>
+        inline static bool
+        call(Char ch, std::size_t /*count*/, T& n, mpl::false_)
+        {
+            // no need to check for overflow
+            Accumulator::add(n, ch, mpl::false_());
+            return true;
+        }
+
+        template <typename Char>
+        inline static bool
+        call(Char /*ch*/, std::size_t /*count*/, unused_type, mpl::false_)
+        {
+            return true;
+        }
+
+        template <typename Char, typename T>
+        inline static bool
+        call(Char ch, std::size_t count, T& n)
+        {
+            return call(ch, count, n
+              , mpl::bool_<
+                    (   (MaxDigits < 0)
+                    ||  (MaxDigits > digits_traits<T, Radix>::value)
+                    )
+                  && traits::check_overflow<T>::value
+                >()
+            );
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  End of loop checking: check if the number of digits
+    //  being parsed exceeds MaxDigits. Note: if MaxDigits == -1
+    //  we don't do any checking.
+    ///////////////////////////////////////////////////////////////////////////
+    template <int MaxDigits>
+    struct check_max_digits
+    {
+        inline static bool
+        call(std::size_t count)
+        {
+            return count < MaxDigits; // bounded
+        }
+    };
+
+    template <>
+    struct check_max_digits<-1>
+    {
+        inline static bool
+        call(std::size_t /*count*/)
+        {
+            return true; // unbounded
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  extract_int: main code for extracting integers
+    ///////////////////////////////////////////////////////////////////////////
+#define SPIRIT_NUMERIC_INNER_LOOP(z, x, data)                                   \
+        if (!check_max_digits<MaxDigits>::call(count + leading_zeros)           \
+            || it == last)                                                      \
+            break;                                                              \
+        ch = *it;                                                               \
+        if (!radix_check::is_valid(ch) || !extractor::call(ch, count, val))     \
+            break;                                                              \
+        ++it;                                                                   \
+        ++count;                                                                \
+    /**/
+
+    template <
+        typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+      , typename Accumulator = positive_accumulator<Radix>
+      , bool Accumulate = false
+    >
+    struct extract_int
+    {
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4127)   // conditional expression is constant
+#endif
+        template <typename Iterator, typename Attribute>
+        inline static bool
+        parse_main(
+            Iterator& first
+          , Iterator const& last
+          , Attribute& attr)
+        {
+            typedef radix_traits<Radix> radix_check;
+            typedef int_extractor<Radix, Accumulator, MaxDigits> extractor;
+            typedef typename
+                boost::detail::iterator_traits<Iterator>::value_type
+            char_type;
+
+            Iterator it = first;
+            std::size_t leading_zeros = 0;
+            if (!Accumulate)
+            {
+                // skip leading zeros
+                while (it != last && *it == '0' && leading_zeros < MaxDigits)
+                {
+                    ++it;
+                    ++leading_zeros;
+                }
+            }
+
+            typedef typename
+                traits::attribute_type<Attribute>::type
+            attribute_type;
+
+            attribute_type val = Accumulate ? attr : attribute_type(0);
+            std::size_t count = 0;
+            char_type ch;
+
+            while (true)
+            {
+                BOOST_PP_REPEAT(
+                    SPIRIT_NUMERICS_LOOP_UNROLL
+                  , SPIRIT_NUMERIC_INNER_LOOP, _)
+            }
+
+            if (count + leading_zeros >= MinDigits)
+            {
+                traits::move_to(val, attr);
+                first = it;
+                return true;
+            }
+            return false;
+        }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+        template <typename Iterator>
+        inline static bool
+        parse(
+            Iterator& first
+          , Iterator const& last
+          , unused_type)
+        {
+            T n = 0; // must calculate value to detect over/underflow
+            return parse_main(first, last, n);
+        }
+
+        template <typename Iterator, typename Attribute>
+        inline static bool
+        parse(
+            Iterator& first
+          , Iterator const& last
+          , Attribute& attr)
+        {
+            return parse_main(first, last, attr);
+        }
+    };
+#undef SPIRIT_NUMERIC_INNER_LOOP
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  extract_int: main code for extracting integers
+    //  common case where MinDigits == 1 and MaxDigits = -1
+    ///////////////////////////////////////////////////////////////////////////
+#define SPIRIT_NUMERIC_INNER_LOOP(z, x, data)                                   \
+        if (it == last)                                                         \
+            break;                                                              \
+        ch = *it;                                                               \
+        if (!radix_check::is_valid(ch))                                         \
+            break;                                                              \
+        if (!extractor::call(ch, count, val))                                   \
+            return false;                                                       \
+        ++it;                                                                   \
+        ++count;                                                                \
+    /**/
+
+    template <typename T, unsigned Radix, typename Accumulator, bool Accumulate>
+    struct extract_int<T, Radix, 1, -1, Accumulator, Accumulate>
+    {
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4127)   // conditional expression is constant
+#endif
+        template <typename Iterator, typename Attribute>
+        inline static bool
+        parse_main(
+            Iterator& first
+          , Iterator const& last
+          , Attribute& attr)
+        {
+            typedef radix_traits<Radix> radix_check;
+            typedef int_extractor<Radix, Accumulator, -1> extractor;
+            typedef typename
+                boost::detail::iterator_traits<Iterator>::value_type
+            char_type;
+
+            Iterator it = first;
+            std::size_t count = 0;
+            if (!Accumulate)
+            {
+                // skip leading zeros
+                while (it != last && *it == '0')
+                {
+                    ++it;
+                    ++count;
+                }
+
+                if (it == last)
+                {
+                    if (count == 0) // must have at least one digit
+                        return false;
+                    attr = 0;
+                    first = it;
+                    return true;
+                }
+            }
+
+            typedef typename
+                traits::attribute_type<Attribute>::type
+            attribute_type;
+
+            attribute_type val = Accumulate ? attr : attribute_type(0);
+            char_type ch = *it;
+
+            if (!radix_check::is_valid(ch) || !extractor::call(ch, 0, val))
+            {
+                if (count == 0) // must have at least one digit
+                    return false;
+                traits::move_to(val, attr);
+                first = it;
+                return true;
+            }
+
+            count = 0;
+            ++it;
+            while (true)
+            {
+                BOOST_PP_REPEAT(
+                    SPIRIT_NUMERICS_LOOP_UNROLL
+                  , SPIRIT_NUMERIC_INNER_LOOP, _)
+            }
+
+            traits::move_to(val, attr);
+            first = it;
+            return true;
+        }
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+        template <typename Iterator>
+        inline static bool
+        parse(
+            Iterator& first
+          , Iterator const& last
+          , unused_type)
+        {
+            T n = 0; // must calculate value to detect over/underflow
+            return parse_main(first, last, n);
+        }
+
+        template <typename Iterator, typename Attribute>
+        inline static bool
+        parse(
+            Iterator& first
+          , Iterator const& last
+          , Attribute& attr)
+        {
+            return parse_main(first, last, attr);
+        }
+    };
+
+#undef SPIRIT_NUMERIC_INNER_LOOP
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Cast an signed integer to an unsigned integer
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T,
+        bool force_unsigned
+            = mpl::and_<is_integral<T>, is_signed<T> >::value>
+    struct cast_unsigned;
+
+    template <typename T>
+    struct cast_unsigned<T, true>
+    {
+        typedef typename make_unsigned<T>::type unsigned_type;
+        typedef typename make_unsigned<T>::type& unsigned_type_ref;
+
+        inline static unsigned_type_ref call(T& n)
+        {
+            return unsigned_type_ref(n);
+        }
+    };
+
+    template <typename T>
+    struct cast_unsigned<T, false>
+    {
+        inline static T& call(T& n)
+        {
+            return n;
+        }
+    };
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/extract_int.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,147 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2011 Jan Frederick Eick
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_EXTRACT_INT_APRIL_17_2006_0830AM)
+#define BOOST_SPIRIT_X3_EXTRACT_INT_APRIL_17_2006_0830AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/detail/extract_int.hpp>
+#include <boost/assert.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  Extract the prefix sign (- or +), return true if a '-' was found
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    inline bool
+    extract_sign(Iterator& first, Iterator const& last)
+    {
+        (void)last;                  // silence unused warnings
+        BOOST_ASSERT(first != last); // precondition
+
+        // Extract the sign
+        bool neg = *first == '-';
+        if (neg || (*first == '+'))
+        {
+            ++first;
+            return neg;
+        }
+        return false;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Low level unsigned integer parser
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
+      , bool Accumulate = false>
+    struct extract_uint
+    {
+        // check template parameter 'Radix' for validity
+        static_assert(
+            (Radix >= 2 && Radix <= 36),
+            "Error Unsupported Radix");
+
+        template <typename Iterator>
+        inline static bool call(Iterator& first, Iterator const& last, T& attr)
+        {
+            if (first == last)
+                return false;
+
+            typedef detail::extract_int<
+                T
+              , Radix
+              , MinDigits
+              , MaxDigits
+              , detail::positive_accumulator<Radix>
+              , Accumulate>
+            extract_type;
+
+            Iterator save = first;
+            if (!extract_type::parse(first, last,
+                detail::cast_unsigned<T>::call(attr)))
+            {
+                first = save;
+                return false;
+            }
+            return true;
+        }
+
+        template <typename Iterator, typename Attribute>
+        inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            // this case is called when Attribute is not T
+            T attr;
+            if (call(first, last, attr))
+            {
+                traits::move_to(attr, attr_);
+                return true;
+            }
+            return false;
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Low level signed integer parser
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>
+    struct extract_int
+    {
+        // check template parameter 'Radix' for validity
+        static_assert(
+            (Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16),
+            "Error Unsupported Radix");
+
+        template <typename Iterator>
+        inline static bool call(Iterator& first, Iterator const& last, T& attr)
+        {
+            if (first == last)
+                return false;
+
+            typedef detail::extract_int<
+                T, Radix, MinDigits, MaxDigits>
+            extract_pos_type;
+
+            typedef detail::extract_int<
+                T, Radix, MinDigits, MaxDigits, detail::negative_accumulator<Radix> >
+            extract_neg_type;
+
+            Iterator save = first;
+            bool hit = extract_sign(first, last);
+            if (hit)
+                hit = extract_neg_type::parse(first, last, attr);
+            else
+                hit = extract_pos_type::parse(first, last, attr);
+
+            if (!hit)
+            {
+                first = save;
+                return false;
+            }
+            return true;
+        }
+
+        template <typename Iterator, typename Attribute>
+        inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
+        {
+            // this case is called when Attribute is not T
+            T attr;
+            if (call(first, last, attr))
+            {
+                traits::move_to(attr, attr_);
+                return true;
+            }
+            return false;
+        }
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/extract_real.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,271 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_EXTRACT_REAL_APRIL_18_2006_0901AM)
+#define SPIRIT_EXTRACT_REAL_APRIL_18_2006_0901AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cmath>
+#include <boost/limits.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/pow10.hpp>
+#include <boost/spirit/home/x3/support/numeric_utils/sign.hpp>
+#include <boost/spirit/home/x3/support/traits/move_to.hpp>
+#include <boost/assert.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4100)   // 'p': unreferenced formal parameter
+# pragma warning(disable: 4127)   // conditional expression is constant
+#endif
+
+namespace boost { namespace spirit { namespace x3 { namespace extension
+{
+    using x3::traits::pow10;
+
+    template <typename T>
+    inline void
+    scale(int exp, T& n)
+    {
+        if (exp >= 0)
+        {
+            // $$$ Why is this failing for boost.math.concepts ? $$$
+            //~ int nn = std::numeric_limits<T>::max_exponent10;
+            //~ BOOST_ASSERT(exp <= std::numeric_limits<T>::max_exponent10);
+            n *= pow10<T>(exp);
+        }
+        else
+        {
+            if (exp < std::numeric_limits<T>::min_exponent10)
+            {
+                n /= pow10<T>(-std::numeric_limits<T>::min_exponent10);
+                n /= pow10<T>(-exp + std::numeric_limits<T>::min_exponent10);
+            }
+            else
+            {
+                n /= pow10<T>(-exp);
+            }
+        }
+    }
+
+    inline void
+    scale(int /*exp*/, unused_type /*n*/)
+    {
+        // no-op for unused_type
+    }
+
+    template <typename T>
+    inline void
+    scale(int exp, int frac, T& n)
+    {
+        scale(exp - frac, n);
+    }
+
+    inline void
+    scale(int /*exp*/, int /*frac*/, unused_type /*n*/)
+    {
+        // no-op for unused_type
+    }
+
+    inline float
+    negate(bool neg, float n)
+    {
+        return neg ? x3::changesign(n) : n;
+    }
+
+    inline double
+    negate(bool neg, double n)
+    {
+        return neg ? x3::changesign(n) : n;
+    }
+
+    inline long double
+    negate(bool neg, long double n)
+    {
+        return neg ? x3::changesign(n) : n;
+    }
+
+    template <typename T>
+    inline T
+    negate(bool neg, T const& n)
+    {
+        return neg ? -n : n;
+    }
+
+    inline unused_type
+    negate(bool /*neg*/, unused_type n)
+    {
+        // no-op for unused_type
+        return n;
+    }
+
+    template <typename T>
+    inline bool
+    is_equal_to_one(T const& value)
+    {
+        return value == 1.0;
+    }
+
+    inline bool
+    is_equal_to_one(unused_type)
+    {
+        // no-op for unused_type
+        return false;
+    }
+}}}}
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T, typename RealPolicies>
+    struct extract_real
+    {
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse(Iterator& first, Iterator const& last, Attribute& attr,
+            RealPolicies const& p)
+        {
+            if (first == last)
+                return false;
+            Iterator save = first;
+
+            // Start by parsing the sign. neg will be true if
+            // we got a "-" sign, false otherwise.
+            bool neg = p.parse_sign(first, last);
+
+            // Now attempt to parse an integer
+            T n = 0;
+            bool got_a_number = p.parse_n(first, last, n);
+
+            // If we did not get a number it might be a NaN, Inf or a leading
+            // dot.
+            if (!got_a_number)
+            {
+                // Check whether the number to parse is a NaN or Inf
+                if (p.parse_nan(first, last, n) ||
+                    p.parse_inf(first, last, n))
+                {
+                    // If we got a negative sign, negate the number
+                    traits::move_to(extension::negate(neg, n), attr);
+                    return true;    // got a NaN or Inf, return early
+                }
+
+                // If we did not get a number and our policies do not
+                // allow a leading dot, fail and return early (no-match)
+                if (!p.allow_leading_dot)
+                {
+                    first = save;
+                    return false;
+                }
+            }
+
+            bool e_hit = false;
+            int frac_digits = 0;
+
+            // Try to parse the dot ('.' decimal point)
+            if (p.parse_dot(first, last))
+            {
+                // We got the decimal point. Now we will try to parse
+                // the fraction if it is there. If not, it defaults
+                // to zero (0) only if we already got a number.
+                Iterator savef = first;
+                if (p.parse_frac_n(first, last, n))
+                {
+                    // Optimization note: don't compute frac_digits if T is
+                    // an unused_type. This should be optimized away by the compiler.
+                    if (!is_same<T, unused_type>::value)
+                        frac_digits =
+                            static_cast<int>(std::distance(savef, first));
+                }
+                else if (!got_a_number || !p.allow_trailing_dot)
+                {
+                    // We did not get a fraction. If we still haven't got a
+                    // number and our policies do not allow a trailing dot,
+                    // return no-match.
+                    first = save;
+                    return false;
+                }
+
+                // Now, let's see if we can parse the exponent prefix
+                e_hit = p.parse_exp(first, last);
+            }
+            else
+            {
+                // No dot and no number! Return no-match.
+                if (!got_a_number)
+                {
+                    first = save;
+                    return false;
+                }
+
+                // If we must expect a dot and we didn't see an exponent
+                // prefix, return no-match.
+                e_hit = p.parse_exp(first, last);
+                if (p.expect_dot && !e_hit)
+                {
+                    first = save;
+                    return false;
+                }
+            }
+
+            if (e_hit)
+            {
+                // We got the exponent prefix. Now we will try to parse the
+                // actual exponent. It is an error if it is not there.
+                int exp = 0;
+                if (p.parse_exp_n(first, last, exp))
+                {
+                    // Got the exponent value. Scale the number by
+                    // exp-frac_digits.
+                    extension::scale(exp, frac_digits, n);
+                }
+                else
+                {
+                    // Oops, no exponent, return no-match.
+                    first = save;
+                    return false;
+                }
+            }
+            else if (frac_digits)
+            {
+                // No exponent found. Scale the number by -frac_digits.
+                extension::scale(-frac_digits, n);
+            }
+            else if (extension::is_equal_to_one(n))
+            {
+                // There is a chance of having to parse one of the 1.0#...
+                // styles some implementations use for representing NaN or Inf.
+
+                // Check whether the number to parse is a NaN or Inf
+                if (p.parse_nan(first, last, n) ||
+                    p.parse_inf(first, last, n))
+                {
+                    // If we got a negative sign, negate the number
+                    traits::move_to(extension::negate(neg, n), attr);
+                    return true;    // got a NaN or Inf, return immediately
+                }
+            }
+
+            // If we got a negative sign, negate the number
+            traits::move_to(extension::negate(neg, n), attr);
+
+            // Success!!!
+            return true;
+        }
+    };
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/pow10.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,116 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_POW10_DECEMBER_26_2008_1118AM)
+#define BOOST_SPIRIT_X3_POW10_DECEMBER_26_2008_1118AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/spirit/home/x3/support/traits/numeric_traits.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(push)
+# pragma warning(disable: 4244)   // conversion from 'double' to 'float', possible loss of data
+#endif
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    namespace detail
+    {
+        template <typename T, typename Enable = void>
+        struct pow10_helper
+        {
+            static T call(unsigned dim)
+            {
+                using namespace std;    // allow for ADL to find the correct overload
+                return pow(T(10), T(dim));
+            }
+        };
+
+        template <>
+        struct pow10_helper<unused_type>
+        {
+            static unused_type call(unused_type)
+            {
+                return unused;
+            }
+        };
+
+#if (DBL_MAX_10_EXP == 308) // for IEEE-754
+        template <>
+        struct pow10_helper<double>
+        {
+            static double call(unsigned dim)
+            {
+                static double const exponents[] =
+                {
+                    1e0,   1e1,   1e2,   1e3,   1e4,   1e5,   1e6,   1e7,   1e8,    1e9,
+                    1e10,  1e11,  1e12,  1e13,  1e14,  1e15,  1e16,  1e17,  1e18,  1e19,
+                    1e20,  1e21,  1e22,  1e23,  1e24,  1e25,  1e26,  1e27,  1e28,  1e29,
+                    1e30,  1e31,  1e32,  1e33,  1e34,  1e35,  1e36,  1e37,  1e38,  1e39,
+                    1e40,  1e41,  1e42,  1e43,  1e44,  1e45,  1e46,  1e47,  1e48,  1e49,
+                    1e50,  1e51,  1e52,  1e53,  1e54,  1e55,  1e56,  1e57,  1e58,  1e59,
+                    1e60,  1e61,  1e62,  1e63,  1e64,  1e65,  1e66,  1e67,  1e68,  1e69,
+                    1e70,  1e71,  1e72,  1e73,  1e74,  1e75,  1e76,  1e77,  1e78,  1e79,
+                    1e80,  1e81,  1e82,  1e83,  1e84,  1e85,  1e86,  1e87,  1e88,  1e89,
+                    1e90,  1e91,  1e92,  1e93,  1e94,  1e95,  1e96,  1e97,  1e98,  1e99,
+                    1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
+                    1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
+                    1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
+                    1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
+                    1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
+                    1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
+                    1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169,
+                    1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179,
+                    1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189,
+                    1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199,
+                    1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209,
+                    1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219,
+                    1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229,
+                    1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239,
+                    1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249,
+                    1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259,
+                    1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269,
+                    1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279,
+                    1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289,
+                    1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299,
+                    1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
+                };
+                BOOST_ASSERT(dim < sizeof(exponents)/sizeof(double));
+                return exponents[dim];
+            }
+        };
+
+        template <>
+        struct pow10_helper<float>
+        {
+            static float call(unsigned dim)
+            {
+                return pow10_helper<double>::call(dim);
+            }
+        };
+#endif // for IEEE-754
+    }
+
+    template <typename T>
+    inline T pow10(unsigned dim)
+    {
+        return detail::pow10_helper<T>::call(dim);
+    }
+}}}}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+# pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/numeric_utils/sign.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(SPIRIT_SIGN_MAR_11_2009_0734PM)
+#define SPIRIT_SIGN_MAR_11_2009_0734PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template<typename T>
+    inline bool (signbit)(T x)
+    {
+        return (boost::math::signbit)(x) ? true : false;
+    }
+
+    // This routine has been taken and adapted from Johan Rade's fp_traits
+    // library
+    template<typename T>
+    inline T (changesign)(T x)
+    {
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+        return -x;
+#else
+        typedef typename math::detail::fp_traits<T>::type traits_type;
+
+        typename traits_type::bits a;
+        traits_type::get_bits(x, a);
+        a ^= traits_type::sign;
+        traits_type::set_bits(x, a);
+        return x;
+#endif
+    }
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/subcontext.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,89 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustín Bergé
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM)
+#define BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/support/pair.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename... T>
+    struct subcontext;
+
+    template <>
+    struct subcontext<>
+    {
+        template <typename Context>
+        subcontext(Context const& /*context*/)
+        {}
+        
+        template <typename ID_, typename Unused = void>
+        struct get_result
+        {
+            typedef unused_type type;
+        };
+
+        template <typename ID_>
+        unused_type
+        get(ID_) const
+        {
+            return unused;
+        }
+    };
+
+    template <typename T>
+    struct subcontext<T>
+      : context<typename T::first_type, typename T::second_type>
+    {
+        typedef context<
+            typename T::first_type, typename T::second_type
+        > context_type;
+
+        template <typename Context>
+        subcontext(Context const& context)
+          : context_type(x3::get<typename T::first_type>(context))
+        {}
+
+        using context_type::get;
+    };
+
+    template <typename T, typename... Tail>
+    struct subcontext<T, Tail...>
+      : subcontext<Tail...>
+      , context<
+            typename T::first_type, typename T::second_type
+          , subcontext<Tail...>
+        >
+    {
+        typedef subcontext<Tail...> base_type;
+        typedef context<
+            typename T::first_type, typename T::second_type
+          , base_type
+        > context_type;
+
+        template <typename Context>
+        subcontext(Context const& context)
+          : base_type(context)
+          , context_type(
+                x3::get<typename T::first_type>(context)
+              , *static_cast<base_type*>(this))
+        {}
+
+        using context_type::get;
+    };
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_category.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,82 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ATTRIBUTE_CATEGORY_JAN_4_2012_1150AM)
+#define BOOST_SPIRIT_X3_ATTRIBUTE_CATEGORY_JAN_4_2012_1150AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/logical.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/fusion/include/copy.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/spirit/home/x3/support/traits/is_variant.hpp>
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+   struct unused_type;
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    struct unused_attribute {};
+    struct plain_attribute {};
+    struct container_attribute {};
+    struct tuple_attribute {};
+    struct associative_attribute {};
+    struct variant_attribute {};
+    struct optional_attribute {};
+
+    template <typename T, typename Enable = void>
+    struct attribute_category
+        : mpl::identity<plain_attribute> {};
+
+    template <>
+    struct attribute_category<unused_type>
+        : mpl::identity<unused_attribute> {};
+
+    template <>
+    struct attribute_category<unused_type const>
+        : mpl::identity<unused_attribute> {};
+
+    template <typename T>
+    struct attribute_category< T
+	, typename enable_if<
+	      typename mpl::eval_if< 
+		  fusion::traits::is_sequence<T>
+		  , fusion::traits::is_associative<T>
+		  , mpl::false_
+		  >::type >::type >
+        : mpl::identity<associative_attribute> {};
+
+    template <typename T>
+    struct attribute_category< T
+	, typename enable_if<
+	      mpl::and_<
+		  fusion::traits::is_sequence<T>
+		  , mpl::not_<fusion::traits::is_associative<T> > 
+		  > >::type >
+        : mpl::identity<tuple_attribute> {};
+
+    template <typename T>
+    struct attribute_category<T,
+        typename enable_if<traits::is_variant<T>>::type>
+        : mpl::identity<variant_attribute> {};
+
+    template <typename T>
+    struct attribute_category<T,
+        typename enable_if<traits::is_container<T>>::type>
+        : mpl::identity<container_attribute> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_of.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ATTRIBUTE_OF_JAN_7_2012_0914AM)
+#define BOOST_SPIRIT_X3_ATTRIBUTE_OF_JAN_7_2012_0914AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Get the attribute type of a component. By default, this gets the 
+    // Component's attribute_type typedef or instantiates a nested attribute 
+    // metafunction. Components may specialize this if such an attribute_type
+    // is not readily available (e.g. expensive to compute at compile time).
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Component, typename Context, typename Enable = void>
+    struct attribute_of;
+
+    namespace detail
+    {
+        template <typename Component, typename Context, typename Enable = void>
+        struct default_attribute_of;
+        
+        template <typename Component, typename Context>
+        struct default_attribute_of<Component, Context, 
+            typename disable_if_substitution_failure<
+                typename Component::attribute_type>::type>
+          : mpl::identity<typename Component::attribute_type> {};
+        
+        template <typename Component, typename Context>
+        struct default_attribute_of<Component, Context, 
+            typename disable_if_substitution_failure<
+                typename Component::template attribute<Context>::type>::type>
+          : Component::template attribute<Context> {};
+        
+        template <typename Component, typename Context>
+        struct default_attribute_of<Component, Context,
+            typename enable_if_c<Component::is_pass_through_unary>::type>
+          : attribute_of<typename Component::subject_type, Context>{};
+    }
+    
+    template <typename Component, typename Context, typename Enable>
+    struct attribute_of : detail::default_attribute_of<Component, Context> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/attribute_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ATTRIBUTE_TYPE_JAN_5_2012_0358PM)
+#define BOOST_SPIRIT_X3_ATTRIBUTE_TYPE_JAN_5_2012_0358PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Retrieve the attribute type to use from the given type
+    //
+    // This is needed to extract the correct attribute type from proxy classes
+    // as utilized in FUSION_ADAPT_ADT et. al.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Attribute, typename Enable = void>
+    struct attribute_type : mpl::identity<Attribute> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/container_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,333 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_CONTAINER_FEBRUARY_06_2007_1001AM)
+#define BOOST_SPIRIT_X3_CONTAINER_FEBRUARY_06_2007_1001AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/detail/iterator.hpp>
+#include <boost/fusion/include/deque.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <vector>
+#include <string>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  This file contains some container utils for stl containers.
+    ///////////////////////////////////////////////////////////////////////////
+
+    namespace detail
+    {
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type)
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator)
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(size_type)
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
+    }
+
+    template <typename T, typename Enable = void>
+    struct is_container
+      : mpl::bool_<
+            detail::has_value_type<T>::value &&
+            detail::has_iterator<T>::value &&
+            detail::has_size_type<T>::value &&
+            detail::has_reference<T>::value>
+    {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    namespace detail
+    {
+        template <typename T>
+        struct remove_value_const : mpl::identity<T> {};
+
+        template <typename T>
+        struct remove_value_const<T const> : remove_value_const<T> {};
+
+        template <typename F, typename S>
+        struct remove_value_const<std::pair<F, S>>
+        {
+            typedef typename remove_value_const<F>::type first_type;
+            typedef typename remove_value_const<S>::type second_type;
+            typedef std::pair<first_type, second_type> type;
+        };
+    }
+
+    ///////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Enable = void>
+    struct container_value
+      : detail::remove_value_const<typename Container::value_type>
+    {};
+
+    template <typename Container>
+    struct container_value<Container const> : container_value<Container> {};
+
+    // There is no single container value for fusion maps, but because output
+    // of this metafunc is used to check wheter parser's attribute can be
+    // saved to container, we simply return whole fusion::map as is
+    // so that check can be done in traits::is_substitute specialisation
+    template <typename T>
+    struct container_value<T
+			   , typename enable_if<typename mpl::eval_if <
+						    fusion::traits::is_sequence<T>
+						    , fusion::traits::is_associative<T>
+						    , mpl::false_ >::type >::type>
+    : mpl::identity<T> {};
+
+    template <>
+    struct container_value<unused_type> : mpl::identity<unused_type> {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Enable = void>
+    struct container_iterator
+        : mpl::identity<typename Container::iterator> {};
+
+    template <typename Container>
+    struct container_iterator<Container const>
+         : mpl::identity<typename Container::const_iterator> {};
+
+    template <>
+    struct container_iterator<unused_type>
+        : mpl::identity<unused_type const*> {};
+
+    template <>
+    struct container_iterator<unused_type const>
+        : mpl::identity<unused_type const*> {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename T>
+    bool push_back(Container& c, T&& val);
+
+    template <typename Container, typename Enable = void>
+    struct push_back_container
+    {
+        template <typename T>
+        static bool call(Container& c, T&& val)
+        {
+            c.insert(c.end(), std::move(val));
+            return true;
+        }
+    };
+
+    template <typename Container, typename T>
+    inline bool push_back(Container& c, T&& val)
+    {
+        return push_back_container<Container>::call(c, std::move(val));
+    }
+
+    template <typename Container>
+    inline bool push_back(Container&, unused_type)
+    {
+        return true;
+    }
+
+    template <typename T>
+    inline bool push_back(unused_type, T const&)
+    {
+        return true;
+    }
+
+    inline bool push_back(unused_type, unused_type)
+    {
+        return true;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Iterator>
+    bool append(Container& c, Iterator first, Iterator last);
+
+    template <typename Container, typename Enable = void>
+    struct append_container
+    {
+        // Not all containers have "reserve"
+        template <typename Container_>
+        static void reserve(Container_& c, std::size_t size) {}
+
+        template <typename T>
+        static void reserve(std::vector<T>& c, std::size_t size)
+        {
+            c.reserve(size);
+        }
+
+        template <typename Iterator>
+        static bool call(Container& c, Iterator first, Iterator last)
+        {
+            reserve(c, c.size() + std::distance(first, last));
+            c.insert(c.end(), first, last);
+            return true;
+        }
+    };
+
+    template <typename Container, typename Iterator>
+    inline bool append(Container& c, Iterator first, Iterator last)
+    {
+        return append_container<Container>::call(c, first, last);
+    }
+
+    template <typename Iterator>
+    inline bool append(unused_type, Iterator first, Iterator last)
+    {
+        return true;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Enable = void>
+    struct is_empty_container
+    {
+        static bool call(Container const& c)
+        {
+            return c.empty();
+        }
+    };
+
+    template <typename Container>
+    inline bool is_empty(Container const& c)
+    {
+        return is_empty_container<Container>::call(c);
+    }
+
+    inline bool is_empty(unused_type)
+    {
+        return true;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Enable = void>
+    struct begin_container
+    {
+        static typename container_iterator<Container>::type call(Container& c)
+        {
+            return c.begin();
+        }
+    };
+
+    template <typename Container>
+    inline typename container_iterator<Container>::type
+    begin(Container& c)
+    {
+        return begin_container<Container>::call(c);
+    }
+
+    inline unused_type const*
+    begin(unused_type)
+    {
+        return &unused;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Container, typename Enable = void>
+    struct end_container
+    {
+        static typename container_iterator<Container>::type call(Container& c)
+        {
+            return c.end();
+        }
+    };
+
+    template <typename Container>
+    inline typename container_iterator<Container>::type
+    end(Container& c)
+    {
+        return end_container<Container>::call(c);
+    }
+
+    inline unused_type const*
+    end(unused_type)
+    {
+        return &unused;
+    }
+
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Enable = void>
+    struct deref_iterator
+    {
+        typedef typename boost::detail::iterator_traits<Iterator>::reference type;
+        static type call(Iterator& it)
+        {
+            return *it;
+        }
+    };
+
+    template <typename Iterator>
+    typename deref_iterator<Iterator>::type
+    deref(Iterator& it)
+    {
+        return deref_iterator<Iterator>::call(it);
+    }
+
+    inline unused_type
+    deref(unused_type const*)
+    {
+        return unused;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Enable = void>
+    struct next_iterator
+    {
+        static void call(Iterator& it)
+        {
+            ++it;
+        }
+    };
+
+    template <typename Iterator>
+    void next(Iterator& it)
+    {
+        next_iterator<Iterator>::call(it);
+    }
+
+    inline void next(unused_type const*)
+    {
+        // do nothing
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator, typename Enable = void>
+    struct compare_iterators
+    {
+        static bool call(Iterator const& it1, Iterator const& it2)
+        {
+            return it1 == it2;
+        }
+    };
+
+    template <typename Iterator>
+    bool compare(Iterator& it1, Iterator& it2)
+    {
+        return compare_iterators<Iterator>::call(it1, it2);
+    }
+
+    inline bool compare(unused_type const*, unused_type const*)
+    {
+        return false;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct build_container : mpl::identity<std::vector<T>> {};
+
+    template <typename T>
+    struct build_container<boost::fusion::deque<T> > : build_container<T> {};
+
+    template <>
+    struct build_container<unused_type> : mpl::identity<unused_type> {};
+
+    template <>
+    struct build_container<char> : mpl::identity<std::string> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/handles_container.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,31 @@
+/*=============================================================================
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_HANDLES_CONTAINER_DEC_18_2010_0920AM)
+#define BOOST_SPIRIT_X3_HANDLES_CONTAINER_DEC_18_2010_0920AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Whether a component handles container attributes intrinsically
+    // (or whether container attributes need to be split up separately).
+    // By default, this gets the Component's handles_container nested value.
+    // Components may specialize this if such a handles_container is not 
+    // readily available (e.g. expensive to compute at compile time).
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Component, typename Context, typename Enable = void>
+    struct handles_container : mpl::bool_<Component::handles_container> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/has_attribute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,63 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_HAS_ATTRIBUTE_JUN_6_2012_1714PM)
+#define BOOST_SPIRIT_X3_HAS_ATTRIBUTE_JUN_6_2012_1714PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_of.hpp>
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+   struct unused_type;
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Whether a component has an attribute. By default, this compares the 
+    // component attribute against unused_type. If the component provides a
+    // nested constant expression has_attribute as a hint, that value is used
+    // instead. Components may specialize this.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Component, typename Context, typename Enable = void>
+    struct has_attribute;
+    
+    namespace detail
+    {
+        template <typename Component, typename Context, typename Enable = void>
+        struct default_has_attribute
+          : mpl::not_<is_same<unused_type,
+                typename attribute_of<Component, Context>::type>> {};
+
+        template <typename Component, typename Context>
+        struct default_has_attribute<Component, Context,
+            typename disable_if_substitution_failure<
+                mpl::bool_<Component::has_attribute>>::type>
+          : mpl::bool_<Component::has_attribute> {};
+    
+        template <typename Component, typename Context>
+        struct default_has_attribute<Component, Context,
+            typename enable_if_c<Component::is_pass_through_unary>::type>
+          : has_attribute<typename Component::subject_type, Context> {};
+    }
+    
+    template <typename Component, typename Context, typename Enable>
+    struct has_attribute : detail::default_has_attribute<Component, Context> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_parser.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,37 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2014 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_IS_PARSER_MAY_20_2013_0235PM)
+#define BOOST_SPIRIT_X3_IS_PARSER_MAY_20_2013_0235PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/x3/core/parser.hpp>
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // is_parser<T>: metafunction that evaluates to mpl::true_ if a type T 
+    // can be used as a parser, mpl::false_ otherwise
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, typename Enable = void>
+    struct is_parser
+      : mpl::false_
+    {};
+
+    template <typename T>
+    struct is_parser<T, typename disable_if_substitution_failure<
+        typename extension::as_parser<T>::type>::type>
+      : mpl::true_
+    {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_substitute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,164 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_IS_SUBSTITUTE_JAN_9_2012_1049PM)
+#define BOOST_SPIRIT_X3_IS_SUBSTITUTE_JAN_9_2012_1049PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/container_traits.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/map.hpp>
+#include <boost/fusion/include/value_at_key.hpp>
+#include <boost/fusion/adapted/mpl.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/equal.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/filter_view.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/logical.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/count_if.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/optional/optional.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Find out if T can be a (strong) substitute for Attribute
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, typename Attribute, typename Enable = void>
+    struct is_substitute;
+
+    template <typename Variant, typename Attribute>
+    struct variant_has_substitute;
+
+    namespace detail
+    {
+        template <typename T, typename Attribute>
+        struct value_type_is_substitute
+          : is_substitute<
+                typename container_value<T>::type
+              , typename container_value<Attribute>::type>
+        {};
+
+        template <typename T, typename Attribute, typename Enable = void>
+        struct is_substitute_impl : is_same<T, Attribute> {};
+
+        template <typename T, typename Attribute>
+        struct is_substitute_impl<T, Attribute,
+            typename enable_if<
+                mpl::and_<
+                    fusion::traits::is_sequence<T>,
+                    fusion::traits::is_sequence<Attribute>,
+                    mpl::equal<T, Attribute, is_substitute<mpl::_1, mpl::_2>>
+                >
+            >::type>
+          : mpl::true_ {};
+
+        template <typename T, typename Attribute>
+        struct is_substitute_impl<T, Attribute,
+            typename enable_if<
+                mpl::and_<
+                    is_container<T>,
+                    is_container<Attribute>,
+                    value_type_is_substitute<T, Attribute>
+                >
+            >::type>
+          : mpl::true_ {};
+
+        template <typename T, typename Attribute>
+        struct is_substitute_impl<T, Attribute,
+            typename enable_if<
+                is_variant<Attribute>
+            >::type>
+          : mpl::or_<
+                is_same<T, Attribute>
+              , variant_has_substitute<Attribute, T>
+            >
+        {};
+    }
+
+    template <typename T, typename Attribute, typename Enable /*= void*/>
+    struct is_substitute
+        : detail::is_substitute_impl<T, Attribute> {};
+
+    // for reference T
+    template <typename T, typename Attribute, typename Enable>
+    struct is_substitute<T&, Attribute, Enable>
+        : is_substitute<T, Attribute, Enable> {};
+
+    // for reference Attribute
+    template <typename T, typename Attribute, typename Enable>
+    struct is_substitute<T, Attribute&, Enable>
+        : is_substitute<T, Attribute, Enable> {};
+
+    // 2 element mpl tuple is compatible with fusion::map if:
+    // - it's first element type is existing key in map
+    // - it second element type is compatible to type stored at the key in map
+    template <typename T, typename Attribute>
+    struct is_substitute<T, Attribute
+	, typename enable_if<
+	      typename mpl::eval_if<
+		  mpl::and_<fusion::traits::is_sequence<T>
+			    , fusion::traits::is_sequence<Attribute>>
+		  , mpl::and_<traits::has_size<T, 2>
+			   , fusion::traits::is_associative<Attribute>>
+		  , mpl::false_>::type>::type>
+
+    {
+        // checking that "p_key >> p_value" parser can
+        // store it's result in fusion::map attribute
+        typedef typename mpl::at_c<T, 0>::type p_key;
+        typedef typename mpl::at_c<T, 1>::type p_value;
+
+        // for simple p_key type we just check that
+        // such key can be found in attr and that value under that key
+        // matches p_value
+        template <typename Key, typename Value, typename Map>
+        struct has_kv_in_map
+            : mpl::eval_if<
+                fusion::result_of::has_key<Map, Key>
+              , mpl::apply<
+                    is_substitute<
+                        fusion::result_of::value_at_key<mpl::_1, Key>
+                      , Value>
+                      , Map>
+              , mpl::false_>
+        {};
+
+        // if p_key is variant over multiple types (as a result of
+        // "(key1|key2|key3) >> p_value" parser) check that all
+        // keys are found in fusion::map attribute and that values
+        // under these keys match p_value
+        template <typename Variant>
+        struct variant_kv
+            : mpl::equal_to<
+                mpl::size< typename Variant::types>
+              , mpl::size< mpl::filter_view<typename Variant::types
+              , has_kv_in_map<mpl::_1, p_value, Attribute>>>
+            >
+        {};
+
+        typedef typename
+            mpl::eval_if<
+                is_variant<p_key>
+              , variant_kv<p_key>
+              , has_kv_in_map<p_key, p_value, Attribute>
+            >::type
+        type;
+    };
+
+    template <typename T, typename Attribute>
+    struct is_substitute<optional<T>, optional<Attribute>>
+      : is_substitute<T, Attribute> {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/is_variant.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_IS_VARIANT_JAN_10_2012_0823AM)
+#define BOOST_SPIRIT_X3_IS_VARIANT_JAN_10_2012_0823AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    namespace detail
+    {
+        // By declaring a nested struct in your class/struct, you tell
+        // spirit that it is regarded as a variant type. The minimum
+        // required interface for such a variant is that it has constructors
+        // for various types supported by your variant and a typedef 'types'
+        // which is an mpl sequence of the contained types.
+        //
+        // This is an intrusive interface. For a non-intrusive interface,
+        // use the is_variant trait.
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(adapted_variant_tag)
+    }
+
+    template <typename T, typename Enable = void>
+    struct is_variant
+      : detail::has_adapted_variant_tag<T>
+    {};
+
+    template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
+    struct is_variant<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>>
+      : mpl::true_
+    {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/make_attribute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,86 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2012 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_MAKE_ATTRIBUTE_JAN_8_2012_0721PM)
+#define BOOST_SPIRIT_X3_MAKE_ATTRIBUTE_JAN_8_2012_0721PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Attribute>
+    struct make_attribute_base
+    {
+        static Attribute call(unused_type)
+        {
+             // synthesize the attribute/parameter
+            return Attribute();
+        }
+
+        template <typename T>
+        static T& call(T& value)
+        {
+            return value; // just pass the one provided
+        }
+    };
+
+    template <typename Attribute, typename ActualAttribute>
+    struct make_attribute : make_attribute_base<Attribute>
+    {
+        typedef ActualAttribute& type;
+        typedef ActualAttribute value_type;
+    };
+
+    template <typename Attribute>
+    struct make_attribute<Attribute, unused_type>
+        : make_attribute_base<Attribute>
+    {
+        typedef typename remove_const<Attribute>::type attribute_type;
+        typedef attribute_type type;
+        typedef attribute_type value_type;
+    };
+
+    template <typename Attribute, typename ActualAttribute>
+    struct make_attribute<Attribute&, ActualAttribute>
+      : make_attribute<Attribute, ActualAttribute> {};
+
+    template <typename Attribute, typename ActualAttribute>
+    struct make_attribute<Attribute const&, ActualAttribute>
+      : make_attribute<Attribute const, ActualAttribute> {};
+
+    template <typename ActualAttribute>
+    struct make_attribute<unused_type, ActualAttribute>
+    {
+        typedef unused_type type;
+        typedef unused_type value_type;
+        static unused_type call(unused_type)
+        {
+            return unused;
+        }
+    };
+    
+    template <>
+    struct make_attribute<unused_type, unused_type>
+    {
+        typedef unused_type type;
+        typedef unused_type value_type;
+        static unused_type call(unused_type)
+        {
+            return unused;
+        }
+    };
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/move_to.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,211 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_MOVE_TO_JAN_17_2013_0859PM)
+#define BOOST_SPIRIT_X3_MOVE_TO_JAN_17_2013_0859PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+#include <boost/spirit/home/x3/support/traits/tuple_traits.hpp>
+#include <boost/spirit/home/x3/support/traits/variant_has_substitute.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/front.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/move.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <utility>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Source, typename Dest>
+    void move_to(Source&& src, Dest& dest);
+
+    template <typename Dest>
+    inline void move_to(unused_type, Dest&) {}
+
+    template <typename Source>
+    inline void move_to(Source&, unused_type) {}
+
+    inline void move_to(unused_type, unused_type) {}
+
+    template <typename Iterator, typename Dest>
+    void
+    move_to(Iterator first, Iterator last, Dest& dest);
+
+    template <typename Iterator>
+    inline void
+    move_to(Iterator, Iterator, unused_type) {}
+
+    namespace detail
+    {
+        template <typename Source, typename Dest>
+        inline void
+        move_to(Source&&, Dest&, unused_attribute) {}
+        
+        template <typename Source, typename Dest>
+        inline void
+        move_to_plain(Source&& src, Dest& dest, mpl::false_) // src is not a single-element tuple
+        {
+            dest = std::move(src);
+        }
+        
+        template <typename Source, typename Dest>
+        inline void
+        move_to_plain(Source&& src, Dest& dest, mpl::true_) // src is a single-element tuple
+        {
+            dest = std::move(fusion::front(src));
+        }
+
+        template <typename Source, typename Dest>
+        inline void
+        move_to(Source&& src, Dest& dest, plain_attribute)
+        {
+            typename mpl::and_<
+                fusion::traits::is_sequence<Source>,
+                is_size_one_sequence<Source> >
+            is_single_element_sequence;
+        
+            move_to_plain(std::move(src), dest, is_single_element_sequence);
+        }
+
+        template <typename Source, typename Dest>
+        inline typename enable_if<is_container<Source>>::type
+        move_to(Source&& src, Dest& dest, container_attribute)
+        {
+            traits::move_to(src.begin(), src.end(), dest);
+        }
+
+        template <typename Source, typename Dest>
+        inline typename enable_if<
+            mpl::and_<
+                is_same_size_sequence<Dest, Source>,
+                mpl::not_<is_size_one_sequence<Dest> > >
+        >::type
+        move_to(Source&& src, Dest& dest, tuple_attribute)
+        {
+            fusion::move(std::move(src), dest);
+        }
+
+        template <typename Source, typename Dest>
+        inline typename enable_if<
+            is_size_one_sequence<Dest>
+        >::type
+        move_to(Source&& src, Dest& dest, tuple_attribute)
+        {
+            traits::move_to(src, fusion::front(dest));
+        }
+
+        template <typename Source, typename Dest>
+        inline void
+        move_to(Source&& src, Dest& dest, variant_attribute, mpl::false_)
+        {
+            dest = std::move(src);
+        }
+        
+        template <typename Source, typename Dest>
+        inline void
+        move_to_variant_from_single_element_sequence(Source&& src, Dest& dest, mpl::false_)
+        {
+            // dest is a variant, src is a single element fusion sequence that the variant
+            // cannot directly hold. We'll try to unwrap the single element fusion sequence.
+            
+            // Make sure that the Dest variant can really hold Source
+            static_assert(variant_has_substitute<Dest, typename fusion::result_of::front<Source>::type>::value,
+                "Error! The destination variant (Dest) cannot hold the source type (Source)");
+            
+            dest = std::move(fusion::front(src));
+        }
+        
+        template <typename Source, typename Dest>
+        inline void
+        move_to_variant_from_single_element_sequence(Source&& src, Dest& dest, mpl::true_)
+        {
+            // dest is a variant, src is a single element fusion sequence that the variant
+            // *can* directly hold.
+            dest = std::move(src);
+        }
+
+        template <typename Source, typename Dest>
+        inline void
+        move_to(Source&& src, Dest& dest, variant_attribute, mpl::true_)
+        {
+            move_to_variant_from_single_element_sequence(src, dest, variant_has_substitute<Dest, Source>());
+        }
+
+        template <typename Source, typename Dest>
+        inline void
+        move_to(Source&& src, Dest& dest, variant_attribute tag)
+        {
+            move_to(src, dest, tag, is_size_one_sequence<Source>());
+        }
+
+        template <typename Iterator>
+        inline void
+        move_to(Iterator, Iterator, unused_type, unused_attribute) {}
+
+        template <typename Iterator, typename Dest>
+        inline void
+        move_to(Iterator first, Iterator last, Dest& dest, container_attribute)
+        {
+            if (is_empty(dest))
+                dest = Dest(first, last);
+            else
+                append(dest, first, last);
+        }
+        
+        template <typename Iterator>
+        inline void
+        move_to(Iterator first, Iterator last, boost::iterator_range<Iterator>& rng, container_attribute)
+        {
+            rng = {first, last};
+        }
+    }
+
+    template <typename Source, typename Dest>
+    inline void
+    move_to(Source&& src, Dest& dest)
+    {
+        detail::move_to(std::move(src), dest
+          , typename attribute_category<Dest>::type());
+    }
+
+    template <typename T>
+    inline void move_to(T& src, T& dest)
+    {
+        if (&src != &dest)
+            dest = std::move(src);
+    }
+
+    template <typename T>
+    inline void move_to(T const& src, T& dest)
+    {
+        if (&src != &dest)
+            dest = std::move(src);
+    }
+
+    template <typename T>
+    inline void move_to(T&& src, T& dest)
+    {
+        if (&src != &dest)
+            dest = std::move(src);
+    }
+
+    template <typename Iterator, typename Dest>
+    inline void
+    move_to(Iterator first, Iterator last, Dest& dest)
+    {
+        // $$$ Use std::move_iterator when iterator is not a const-iterator $$$
+        detail::move_to(first, last, dest, typename attribute_category<Dest>::type());
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/numeric_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,128 @@
+/*=============================================================================
+	Copyright (c) 2001-2011 Hartmut Kaiser
+
+	Distributed under the Boost Software License, Version 1.0. (See accompanying
+	file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_NUMERIC_TRAITS_JAN_07_2011_0722AM)
+#define BOOST_SPIRIT_X3_NUMERIC_TRAITS_JAN_07_2011_0722AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/integer_traits.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is a boolean type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_bool : mpl::false_ {};
+
+    template <typename T>
+    struct is_bool<T const> : is_bool<T> {};
+
+    template <>
+    struct is_bool<bool> : mpl::true_ {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is a signed integer type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_int : mpl::false_ {};
+
+    template <typename T>
+    struct is_int<T const> : is_int<T> {};
+
+    template <>
+    struct is_int<short> : mpl::true_ {};
+
+    template <>
+    struct is_int<int> : mpl::true_ {};
+
+    template <>
+    struct is_int<long> : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+    template <>
+    struct is_int<boost::long_long_type> : mpl::true_ {};
+#endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is an unsigned integer type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_uint : mpl::false_ {};
+
+    template <typename T>
+    struct is_uint<T const> : is_uint<T> {};
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+    template <>
+    struct is_uint<unsigned short> : mpl::true_ {};
+#endif
+
+    template <>
+    struct is_uint<unsigned int> : mpl::true_ {};
+
+    template <>
+    struct is_uint<unsigned long> : mpl::true_ {};
+
+#ifdef BOOST_HAS_LONG_LONG
+    template <>
+    struct is_uint<boost::ulong_long_type> : mpl::true_ {};
+#endif
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is a floating point type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_real : mpl::false_ {};
+
+    template <typename T>
+    struct is_real<T const> : is_uint<T> {};
+
+    template <>
+    struct is_real<float> : mpl::true_ {};
+
+    template <>
+    struct is_real<double> : mpl::true_ {};
+
+    template <>
+    struct is_real<long double> : mpl::true_ {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // customization points for numeric operations
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, typename Enable = void>
+    struct absolute_value;
+
+    template <typename T, typename Enable = void>
+    struct is_negative;
+
+    template <typename T, typename Enable = void>
+    struct is_zero;
+
+    template <typename T, typename Enable = void>
+    struct pow10_helper;
+
+    template <typename T, typename Enable = void>
+    struct is_nan;
+
+    template <typename T, typename Enable = void>
+    struct is_infinite;
+    
+    template <typename T, typename Enable = void>
+    struct check_overflow : mpl::false_ {};
+        
+    template <typename T>
+    struct check_overflow<T, typename enable_if_c<integer_traits<T>::is_integral>::type>
+        : mpl::true_ {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/optional_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,78 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_OPTIONAL_TRAITS_FEBRUARY_06_2007_1001AM)
+#define BOOST_SPIRIT_X3_OPTIONAL_TRAITS_FEBRUARY_06_2007_1001AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/unused.hpp>
+#include <boost/optional/optional.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T, typename Enable = void>
+    struct is_optional
+      : mpl::false_
+    {};
+
+    template <typename T>
+    struct is_optional<boost::optional<T>>
+      : mpl::true_
+    {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // build_optional
+    //
+    // Build a boost::optional from T. Return unused_type if T is unused_type.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct build_optional
+    {
+        typedef boost::optional<T> type;
+    };
+
+    template <typename T>
+    struct build_optional<boost::optional<T> >
+    {
+        typedef boost::optional<T> type;
+    };
+
+    template <>
+    struct build_optional<unused_type>
+    {
+        typedef unused_type type;
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // optional_value
+    //
+    // Get the optional's value_type. Handles unused_type as well.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct optional_value : mpl::identity<T> {};
+
+    template <typename T>
+    struct optional_value<boost::optional<T> >
+      : mpl::identity<T> {};
+
+    template <>
+    struct optional_value<unused_type>
+      : mpl::identity<unused_type> {};
+
+    template <>
+    struct optional_value<unused_type const>
+      : mpl::identity<unused_type> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/print_attribute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,150 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+================================================_==============================*/
+#if !defined(BOOST_SPIRIT_X3_PRINT_ATTRIBUTE_JANUARY_20_2013_0814AM)
+#define BOOST_SPIRIT_X3_PRINT_ATTRIBUTE_JANUARY_20_2013_0814AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/optional/optional.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/for_each.hpp>
+#include <boost/spirit/home/x3/support/traits/attribute_category.hpp>
+#include <boost/spirit/home/x3/support/traits/is_variant.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Out, typename T>
+    void print_attribute(Out& out, T const& val);
+
+    template <typename Out>
+    inline void print_attribute(Out&, unused_type) {}
+
+    ///////////////////////////////////////////////////////////////////////////
+    namespace detail
+    {
+        template <typename Out>
+        struct print_fusion_sequence
+        {
+            print_fusion_sequence(Out& out)
+              : out(out), is_first(true) {}
+
+            typedef void result_type;
+
+            template <typename T>
+            void operator()(T const& val) const
+            {
+                if (is_first)
+                    is_first = false;
+                else
+                    out << ", ";
+                x3::traits::print_attribute(out, val);
+            }
+
+            Out& out;
+            mutable bool is_first;
+        };
+
+        // print elements in a variant
+        template <typename Out>
+        struct print_visitor : static_visitor<>
+        {
+            print_visitor(Out& out) : out(out) {}
+
+            template <typename T>
+            void operator()(T const& val) const
+            {
+                x3::traits::print_attribute(out, val);
+            }
+
+            Out& out;
+        };
+    }
+
+    template <typename Out, typename T, typename Enable = void>
+    struct print_attribute_debug
+    {
+        // for plain data types
+        template <typename T_>
+        static void call(Out& out, T_ const& val, unused_attribute)
+        {
+            out << "unused";
+        }
+
+        // for plain data types
+        template <typename T_>
+        static void call(Out& out, T_ const& val, plain_attribute)
+        {
+            out << val;
+        }
+
+        // for fusion data types
+        template <typename T_>
+        static void call(Out& out, T_ const& val, tuple_attribute)
+        {
+            out << '[';
+            fusion::for_each(val, detail::print_fusion_sequence<Out>(out));
+            out << ']';
+        }
+
+        // stl container
+        template <typename T_>
+        static void call(Out& out, T_ const& val, container_attribute)
+        {
+            out << '[';
+            if (!traits::is_empty(val))
+            {
+                bool first = true;
+                typename container_iterator<T_ const>::type iend = traits::end(val);
+                for (typename container_iterator<T_ const>::type i = traits::begin(val);
+                     !traits::compare(i, iend); traits::next(i))
+                {
+                    if (!first)
+                        out << ", ";
+                    first = false;
+                    x3::traits::print_attribute(out, traits::deref(i));
+                }
+            }
+            out << ']';
+        }
+
+        // for variant types
+        template <typename T_>
+        static void call(Out& out, T_ const& val, variant_attribute)
+        {
+            apply_visitor(detail::print_visitor<Out>(out), val);
+        }
+
+        // for optional types
+        template <typename T_>
+        static void call(Out& out, T_ const& val, optional_attribute)
+        {
+            if (val)
+                x3::traits::print_attribute(out, *val);
+            else
+                out << "[empty]";
+        }
+
+        // main entry point
+        static void call(Out& out, T const& val)
+        {
+            call(out, val, typename attribute_category<T>::type());
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Out, typename T>
+    inline void print_attribute(Out& out, T const& val)
+    {
+        print_attribute_debug<Out, T>::call(out, val);
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/print_token.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,79 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+================================================_==============================*/
+#if !defined(BOOST_SPIRIT_X3_PRINT_TOKEN_JANUARY_20_2013_0814AM)
+#define BOOST_SPIRIT_X3_PRINT_TOKEN_JANUARY_20_2013_0814AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <cctype>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // generate debug output for lookahead token (character) stream
+    namespace detail
+    {
+        struct token_printer_debug_for_chars
+        {
+            template<typename Out, typename Char>
+            static void print(Out& o, Char c)
+            {
+                using namespace std;    // allow for ADL to find the proper iscntrl
+
+                switch (c)
+                {
+                    case '\a': o << "\\a"; break;
+                    case '\b': o << "\\b"; break;
+                    case '\f': o << "\\f"; break;
+                    case '\n': o << "\\n"; break;
+                    case '\r': o << "\\r"; break;
+                    case '\t': o << "\\t"; break;
+                    case '\v': o << "\\v"; break;
+                    default:
+                        if (c >= 0 && c < 127 && iscntrl(c))
+                            o << "\\" << std::oct << int(c);
+                        else
+                            o << Char(c);
+                }
+            }
+        };
+
+        // for token types where the comparison with char constants wouldn't work
+        struct token_printer_debug
+        {
+            template<typename Out, typename T>
+            static void print(Out& o, T const& val)
+            {
+                o << val;
+            }
+        };
+    }
+
+    template <typename T, typename Enable = void>
+    struct token_printer_debug
+      : mpl::if_<
+            mpl::and_<
+                is_convertible<T, char>, is_convertible<char, T> >
+          , detail::token_printer_debug_for_chars
+          , detail::token_printer_debug>::type
+    {};
+
+    template <typename Out, typename T>
+    inline void print_token(Out& out, T const& val)
+    {
+        // allow to customize the token printer routine
+        token_printer_debug<T>::print(out, val);
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/string_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,291 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    Copyright (c)      2010 Bryce Lelbach
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+================================================_==============================*/
+#if !defined(BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM)
+#define BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <string>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is a character type
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_char : mpl::false_ {};
+
+    template <typename T>
+    struct is_char<T const> : is_char<T> {};
+
+    template <>
+    struct is_char<char> : mpl::true_ {};
+
+    template <>
+    struct is_char<wchar_t> : mpl::true_ {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Determine if T is a string
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct is_string : mpl::false_ {};
+
+    template <typename T>
+    struct is_string<T const> : is_string<T> {};
+
+    template <>
+    struct is_string<char const*> : mpl::true_ {};
+
+    template <>
+    struct is_string<wchar_t const*> : mpl::true_ {};
+
+    template <>
+    struct is_string<char*> : mpl::true_ {};
+
+    template <>
+    struct is_string<wchar_t*> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<char[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<wchar_t[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<char const[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<wchar_t const[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<char(&)[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<wchar_t(&)[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<char const(&)[N]> : mpl::true_ {};
+
+    template <std::size_t N>
+    struct is_string<wchar_t const(&)[N]> : mpl::true_ {};
+
+    template <typename T, typename Traits, typename Allocator>
+    struct is_string<std::basic_string<T, Traits, Allocator> > : mpl::true_ {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Get the underlying char type of a string
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T>
+    struct char_type_of;
+
+    template <typename T>
+    struct char_type_of<T const> : char_type_of<T> {};
+
+    template <>
+    struct char_type_of<char> : mpl::identity<char> {};
+
+    template <>
+    struct char_type_of<wchar_t> : mpl::identity<wchar_t> {};
+
+    template <>
+    struct char_type_of<char const*> : mpl::identity<char const> {};
+
+    template <>
+    struct char_type_of<wchar_t const*> : mpl::identity<wchar_t const> {};
+
+    template <>
+    struct char_type_of<char*> : mpl::identity<char> {};
+
+    template <>
+    struct char_type_of<wchar_t*> : mpl::identity<wchar_t> {};
+
+    template <std::size_t N>
+    struct char_type_of<char[N]> : mpl::identity<char> {};
+
+    template <std::size_t N>
+    struct char_type_of<wchar_t[N]> : mpl::identity<wchar_t> {};
+
+    template <std::size_t N>
+    struct char_type_of<char const[N]> : mpl::identity<char const> {};
+
+    template <std::size_t N>
+    struct char_type_of<wchar_t const[N]> : mpl::identity<wchar_t const> {};
+
+    template <std::size_t N>
+    struct char_type_of<char(&)[N]> : mpl::identity<char> {};
+
+    template <std::size_t N>
+    struct char_type_of<wchar_t(&)[N]> : mpl::identity<wchar_t> {};
+
+    template <std::size_t N>
+    struct char_type_of<char const(&)[N]> : mpl::identity<char const> {};
+
+    template <std::size_t N>
+    struct char_type_of<wchar_t const(&)[N]> : mpl::identity<wchar_t const> {};
+
+    template <typename T, typename Traits, typename Allocator>
+    struct char_type_of<std::basic_string<T, Traits, Allocator> >
+      : mpl::identity<T> {};
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Get the C string from a string
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename String>
+    struct extract_c_string;
+
+    template <typename String>
+    struct extract_c_string
+    {
+        typedef typename char_type_of<String>::type char_type;
+
+        template <typename T>
+        static T const* call (T* str)
+        {
+            return (T const*)str;
+        }
+
+        template <typename T>
+        static T const* call (T const* str)
+        {
+            return str;
+        }
+    };
+
+    // Forwarder that strips const
+    template <typename T>
+    struct extract_c_string<T const>
+    {
+        typedef typename extract_c_string<T>::char_type char_type;
+
+        static typename extract_c_string<T>::char_type const* call (T const str)
+        {
+            return extract_c_string<T>::call(str);
+        }
+    };
+
+    // Forwarder that strips references
+    template <typename T>
+    struct extract_c_string<T&>
+    {
+        typedef typename extract_c_string<T>::char_type char_type;
+
+        static typename extract_c_string<T>::char_type const* call (T& str)
+        {
+            return extract_c_string<T>::call(str);
+        }
+    };
+
+    // Forwarder that strips const references
+    template <typename T>
+    struct extract_c_string<T const&>
+    {
+        typedef typename extract_c_string<T>::char_type char_type;
+
+        static typename extract_c_string<T>::char_type const* call (T const& str)
+        {
+            return extract_c_string<T>::call(str);
+        }
+    };
+
+    template <typename T, typename Traits, typename Allocator>
+    struct extract_c_string<std::basic_string<T, Traits, Allocator> >
+    {
+        typedef T char_type;
+
+        typedef std::basic_string<T, Traits, Allocator> string;
+
+        static T const* call (string const& str)
+        {
+            return str.c_str();
+        }
+    };
+
+    template <typename T>
+    typename extract_c_string<T*>::char_type const*
+    get_c_string(T* str)
+    {
+        return extract_c_string<T*>::call(str);
+    }
+
+    template <typename T>
+    typename extract_c_string<T const*>::char_type const*
+    get_c_string(T const* str)
+    {
+        return extract_c_string<T const*>::call(str);
+    }
+
+    template <typename String>
+    typename extract_c_string<String>::char_type const*
+    get_c_string(String& str)
+    {
+        return extract_c_string<String>::call(str);
+    }
+
+    template <typename String>
+    typename extract_c_string<String>::char_type const*
+    get_c_string(String const& str)
+    {
+        return extract_c_string<String>::call(str);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Get the begin/end iterators from a string
+    ///////////////////////////////////////////////////////////////////////////
+
+    // Implementation for C-style strings.
+
+    template <typename T>
+    inline T const* get_string_begin(T const* str) { return str; }
+
+    template <typename T>
+    inline T* get_string_begin(T* str) { return str; }
+
+    template <typename T>
+    inline T const* get_string_end(T const* str)
+    {
+        T const* last = str;
+        while (*last)
+            last++;
+        return last;
+    }
+
+    template <typename T>
+    inline T* get_string_end(T* str)
+    {
+        T* last = str;
+        while (*last)
+            last++;
+        return last;
+    }
+
+    // Implementation for containers (includes basic_string).
+    template <typename T, typename Str>
+    inline typename Str::const_iterator get_string_begin(Str const& str)
+    { return str.begin(); }
+
+    template <typename T, typename Str>
+    inline typename Str::iterator
+    get_string_begin(Str& str)
+    { return str.begin(); }
+
+    template <typename T, typename Str>
+    inline typename Str::const_iterator get_string_end(Str const& str)
+    { return str.end(); }
+
+    template <typename T, typename Str>
+    inline typename Str::iterator
+    get_string_end(Str& str)
+    { return str.end(); }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/transform_attribute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2012 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ATTRIBUTE_TRANSFORM_JAN_8_2012_0721PM)
+#define BOOST_SPIRIT_X3_ATTRIBUTE_TRANSFORM_JAN_8_2012_0721PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  transform_attribute
+    //
+    //  Sometimes the user needs to transform the attribute types for certain
+    //  attributes. This template can be used as a customization point, where
+    //  the user is able specify specific transformation rules for any attribute
+    //  type.
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Exposed, typename Transformed, typename Tag
+      , typename Enable = void>
+    struct transform_attribute;
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Tag, typename Transformed, typename Exposed>
+    typename transform_attribute<Exposed, Transformed, Tag>::type
+    pre_transform(Exposed& attr)
+    {
+        return transform_attribute<Exposed, Transformed, Tag>::pre(attr);
+    }
+
+    template <typename Tag, typename Transformed, typename Exposed>
+    typename transform_attribute<Exposed, Transformed, Tag>::type
+    pre_transform(Exposed const& attr)
+    {
+        return transform_attribute<Exposed const, Transformed, Tag>::pre(attr);
+    }
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/tuple_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,52 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+================================================_==============================*/
+#if !defined(BOOST_SPIRIT_X3_TUPLE_TRAITS_JANUARY_2012_1132PM)
+#define BOOST_SPIRIT_X3_TUPLE_TRAITS_JANUARY_2012_1132PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/size.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename A, typename B>
+    struct has_same_size
+      : mpl::bool_<(
+            fusion::result_of::size<A>::value ==
+            fusion::result_of::size<B>::value
+        )>
+    {};
+
+    template <typename T, std::size_t N>
+    struct has_size
+      : mpl::bool_<(fusion::result_of::size<T>::value == N)>
+    {};
+
+    template <typename A, typename B>
+    struct is_same_size_sequence
+      : mpl::and_<
+            fusion::traits::is_sequence<A>
+          , fusion::traits::is_sequence<B>
+          , has_same_size<A, B>
+        >
+    {};
+
+    template <typename Seq>
+    struct is_size_one_sequence
+      : mpl::and_<
+            fusion::traits::is_sequence<Seq>
+          , has_size<Seq, 1>
+        >
+    {};
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/value_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_VALUE_TRAITS_MAY_07_2013_0203PM)
+#define BOOST_SPIRIT_X3_VALUE_TRAITS_MAY_07_2013_0203PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/utility/value_init.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename T, typename Enable = void>
+    struct value_initialize
+    {
+        static T call()
+        {
+            return boost::value_initialized<T>();
+        }
+    };
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/variant_find_substitute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_VARIANT_FIND_SUBSTITUTE_APR_18_2014_930AM)
+#define BOOST_SPIRIT_X3_VARIANT_FIND_SUBSTITUTE_APR_18_2014_930AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/is_substitute.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Variant, typename Attribute>
+    struct variant_find_substitute
+    {
+        // Get the type from the variant that can be a substitute for Attribute.
+        // If none is found, just return Attribute
+
+        typedef Variant variant_type;
+        typedef typename variant_type::types types;
+        typedef typename mpl::end<types>::type end;
+
+        typedef typename
+            mpl::find_if<types, is_same<mpl::_1, Attribute> >::type
+        iter_1;
+
+        typedef typename
+            mpl::eval_if<
+                is_same<iter_1, end>,
+                mpl::find_if<types, traits::is_substitute<mpl::_1, Attribute> >,
+                mpl::identity<iter_1>
+            >::type
+        iter;
+
+        typedef typename
+            mpl::eval_if<
+                is_same<iter, end>,
+                mpl::identity<Attribute>,
+                mpl::deref<iter>
+            >::type
+        type;
+    };
+    
+    template <typename Variant>
+    struct variant_find_substitute<Variant, Variant>
+        : mpl::identity<Variant> {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/traits/variant_has_substitute.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,56 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_VARIANT_HAS_SUBSTITUTE_APR_18_2014_925AM)
+#define BOOST_SPIRIT_X3_VARIANT_HAS_SUBSTITUTE_APR_18_2014_925AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/x3/support/traits/is_substitute.hpp>
+
+namespace boost { namespace spirit { namespace x3 { namespace traits
+{
+    template <typename Variant, typename Attribute>
+    struct variant_has_substitute_impl
+    {
+        // Find a type from the variant that can be a substitute for Attribute.
+        // return true_ if one is found, else false_
+
+        typedef Variant variant_type;
+        typedef typename variant_type::types types;
+        typedef typename mpl::end<types>::type end;
+
+        typedef typename
+            mpl::find_if<types, is_same<mpl::_1, Attribute>>::type
+        iter_1;
+
+        typedef typename
+            mpl::eval_if<
+                is_same<iter_1, end>,
+                mpl::find_if<types, traits::is_substitute<mpl::_1, Attribute>>,
+                mpl::identity<iter_1>
+            >::type
+        iter;
+
+        typedef mpl::not_<is_same<iter, end>> type;
+    };
+
+    template <typename Variant, typename Attribute>
+    struct variant_has_substitute
+        : variant_has_substitute_impl<Variant, Attribute>::type {};
+
+    template <typename Attribute>
+    struct variant_has_substitute<unused_type, Attribute> : mpl::true_ {};
+
+    template <typename Attribute>
+    struct variant_has_substitute<unused_type const, Attribute> : mpl::true_ {};
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/unused.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,93 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_UNUSED_APRIL_16_2006_0616PM)
+#define BOOST_SPIRIT_X3_UNUSED_APRIL_16_2006_0616PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <ostream>
+#include <istream>
+#include <boost/mpl/identity.hpp>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable: 4522) // multiple assignment operators specified warning
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace x3
+{
+    struct unused_type
+    {
+        unused_type()
+        {
+        }
+
+        template <typename T>
+        unused_type(T const&)
+        {
+        }
+
+        template <typename T>
+        unused_type const&
+        operator=(T const&) const
+        {
+            return *this;
+        }
+
+        template <typename T>
+        unused_type&
+        operator=(T const&)
+        {
+            return *this;
+        }
+
+        unused_type const&
+        operator=(unused_type const&) const
+        {
+            return *this;
+        }
+
+        unused_type&
+        operator=(unused_type const&)
+        {
+            return *this;
+        }
+
+        // unused_type can also masquerade as an empty context (see context.hpp)
+
+        template <typename ID>
+        struct get_result : mpl::identity<unused_type> {};
+
+        template <typename ID>
+        unused_type get(ID) const
+        {
+            return unused_type();
+        }
+    };
+
+    unused_type const unused = unused_type();
+
+    inline std::ostream& operator<<(std::ostream& out, unused_type const&)
+    {
+        return out;
+    }
+
+    inline std::istream& operator>>(std::istream& in, unused_type&)
+    {
+        return in;
+    }
+}}}
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/detail/testing.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_DETAIL_TESTING_JUNE_05_2014_00422PM)
+#define BOOST_SPIRIT_X3_DETAIL_TESTING_JUNE_05_2014_00422PM
+
+namespace boost { namespace spirit { namespace x3 { namespace testing
+{
+
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/error_reporting.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,241 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_ERROR_REPORTING_MAY_19_2014_00405PM)
+#define BOOST_SPIRIT_X3_ERROR_REPORTING_MAY_19_2014_00405PM
+
+#include <boost/filesystem/path.hpp>
+#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
+#include <ostream>
+
+// Clang-style error handling utilities
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Iterator>
+    class error_handler
+    {
+    public:
+
+        typedef Iterator iterator_type;
+
+        error_handler(
+            Iterator first, Iterator last, std::ostream& err_out
+          , std::string file = "", int tabs = 4)
+          : err_out(err_out)
+          , file(file)
+          , tabs(tabs)
+          , pos_cache(first, last) {}
+
+        typedef void result_type;
+
+        void operator()(Iterator err_pos, std::string const& error_message) const;
+        void operator()(Iterator err_first, Iterator err_last, std::string const& error_message) const;
+        void operator()(position_tagged pos, std::string const& message) const
+        {
+            auto where = pos_cache.position_of(pos);
+            (*this)(
+                where.begin()
+              , where.end()
+              , message
+            );
+        }
+
+        template <typename AST>
+        void tag(AST& ast, Iterator first, Iterator last)
+        {
+            return pos_cache.annotate(ast, first, last);
+        }
+//
+//        void operator()(
+//            Iterator first
+//          , Iterator last
+//          , Iterator err_op
+//          , Iterator err_first
+//          , Iterator err_last
+//          , std::string const& error_message
+//        ) const;
+
+    private:
+
+        void print_file_line(std::size_t line) const;
+        void print_line(Iterator& line_start, Iterator last) const;
+        void print_indicator(Iterator& line_start, Iterator last, char ind) const;
+        void skip_whitespace(Iterator& err_pos, Iterator last) const;
+        void skip_non_whitespace(Iterator& err_pos, Iterator last) const;
+        Iterator get_line_start(Iterator first, Iterator pos) const;
+        std::size_t position(Iterator i) const;
+
+        std::ostream& err_out;
+        std::string file;
+        int tabs;
+        position_cache<std::vector<Iterator>> pos_cache;
+    };
+
+    template <typename Iterator>
+    void error_handler<Iterator>::print_file_line(std::size_t line) const
+    {
+        namespace fs = boost::filesystem;
+
+        if (file != "")
+            err_out << "In file " << fs::path(file).generic_string() << ", ";
+        else
+            err_out << "In ";
+
+        err_out << "line " << line << ':' << std::endl;
+    }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::print_line(Iterator& start, Iterator last) const
+    {
+        for (; start != last; ++start)
+        {
+            auto c = *start;
+            if (c == '\r' || c == '\n')
+                break;
+            else
+                err_out << c;
+        }
+        err_out << std::endl;
+   }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::print_indicator(Iterator& start, Iterator last, char ind) const
+    {
+        for (; start != last; ++start)
+        {
+            auto c = *start;
+            if (c == '\r' || c == '\n')
+                break;
+            else if (c == '\t')
+                for (int i = 0; i < tabs; ++i)
+                    err_out << ind;
+            else
+                err_out << ind;
+        }
+    }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::skip_whitespace(Iterator& err_pos, Iterator last) const
+    {
+        // make sure err_pos does not point to white space
+        while (err_pos != last)
+        {
+            char c = *err_pos;
+            if (std::isspace(c))
+                ++err_pos;
+            else
+                break;
+        }
+    }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::skip_non_whitespace(Iterator& err_pos, Iterator last) const
+    {
+        // make sure err_pos does not point to white space
+        while (err_pos != last)
+        {
+            char c = *err_pos;
+            if (std::isspace(c))
+                break;
+            else
+                ++err_pos;
+        }
+    }
+
+    template <class Iterator>
+    inline Iterator error_handler<Iterator>::get_line_start(Iterator first, Iterator pos) const
+    {
+        Iterator latest = first;
+        for (Iterator i = first; i != pos; ++i)
+            if (*i == '\r' || *i == '\n')
+                latest = i;
+        return latest;
+    }
+
+    template <typename Iterator>
+    std::size_t error_handler<Iterator>::position(Iterator i) const
+    {
+        // $$$ asumes iterator is similar to line_pos_iterator $$$
+        return i.position();
+    }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::operator()(
+        Iterator err_pos, std::string const& error_message) const
+    {
+        Iterator first = pos_cache.first();
+        Iterator last = pos_cache.last();
+
+        // make sure err_pos does not point to white space
+        skip_whitespace(err_pos, last);
+
+        print_file_line(position(err_pos));
+        err_out << error_message << std::endl;
+
+        Iterator start = get_line_start(first, err_pos);
+        if (start != first)
+            ++start;
+        Iterator i = start;
+        print_line(i, last);
+        print_indicator(start, err_pos, '_');
+        err_out << "^_" << std::endl;
+    }
+
+    template <typename Iterator>
+    void error_handler<Iterator>::operator()(
+        Iterator err_first, Iterator err_last, std::string const& error_message) const
+    {
+        Iterator first = pos_cache.first();
+        Iterator last = pos_cache.last();
+
+        // make sure err_pos does not point to white space
+        skip_whitespace(err_first, last);
+
+        print_file_line(position(err_first));
+        err_out << error_message << std::endl;
+
+        Iterator start = get_line_start(first, err_first);
+        if (start != first)
+            ++start;
+        Iterator i = start;
+        print_line(i, last);
+        print_indicator(start, err_first, ' ');
+        print_indicator(start, err_last, '~');
+        err_out << " <<-- Here" << std::endl;
+    }
+//
+//    template <typename Iterator>
+//    void error_handler<Iterator>::operator()(
+//        Iterator first
+//      , Iterator last
+//      , Iterator err_op
+//      , Iterator err_first
+//      , Iterator err_last
+//      , std::string const& error_message
+//    ) const
+//    {
+//        // make sure err_pos does not point to white space
+//        skip_whitespace(err_first, last);
+//
+//        print_file_line(position(err_pos));
+//        err_out << error_message << std::endl;
+//
+//        Iterator start = get_line_start(first, err_first);
+//        if (start != first)
+//            ++start;
+//        Iterator i = start;
+//        print_line(i, last);
+//        print_indicator(start, err_first, ' ');
+//        print_indicator(start, err_op, '~');
+//        err_out << '^';
+//        print_indicator(++start, err_last, '~');
+//        err_out << " <<-- Here" << std::endl;
+//    }
+
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/integer_sequence.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,94 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2014 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_SPIRIT_X3_INTEGER_SEQUENCE_HPP_INCLUDED
+#define BOOST_SPIRIT_X3_INTEGER_SEQUENCE_HPP_INCLUDED
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <cstddef>
+#include <boost/type_traits/integral_constant.hpp>
+
+// This is a standard (c++1y) compatible integer_sequence implementation,
+// it's needed for now, and it could be replaced with std::integer_sequence
+// once the new standard is available everywhere.
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T, T... Ns>
+    struct integer_sequence
+    {
+        typedef T value_type;
+        
+        static constexpr std::size_t size() noexcept
+        {
+            return sizeof...(Ns);
+        }
+    };
+}}}
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    template <typename T, typename S1, typename S2, T N>
+    struct accum_integer_sequence;
+
+    template <typename T, T... N1, T... N2, T N>
+    struct accum_integer_sequence<T, integer_sequence<T, N1...>, integer_sequence<T, N2...>, N>
+    {
+        typedef integer_sequence<T, N1..., (N + N2)...> type;
+    };
+
+    template <typename N>
+    struct make_integer_sequence_impl
+    {
+        typedef typename N::value_type T;
+        static T const n = N::value;
+        static T const m = n / 2;
+        typedef typename
+            make_integer_sequence_impl<integral_constant<T, m>>::type
+        part1;
+        typedef typename
+            make_integer_sequence_impl<integral_constant<T, n - m>>::type
+        part2;
+        typedef typename
+            accum_integer_sequence<T, part1, part2, m>::type
+        type;
+    };
+    
+    template <typename T>
+    struct make_integer_sequence_impl<integral_constant<T, 0>>
+    {
+        typedef integer_sequence<T> type;
+    };
+    
+    template <typename T>
+    struct make_integer_sequence_impl<integral_constant<T, 1>>
+    {
+        typedef integer_sequence<T, 0> type;
+    };
+}}}}
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <std::size_t... Ns>
+    using index_sequence = integer_sequence<std::size_t, Ns...>;
+
+    template <typename T, T N>
+    using make_integer_sequence = typename detail::make_integer_sequence_impl<
+        integral_constant<T, N>>::type;
+
+    template <std::size_t N>
+    using make_index_sequence = make_integer_sequence<std::size_t, N>;
+
+    template <typename... T>
+    using index_sequence_for = make_index_sequence<sizeof...(T)>;
+}}}
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/is_callable.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2014 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_SPIRIT_X3_IS_CALLABLE_HPP_INCLUDED
+#define BOOST_SPIRIT_X3_IS_CALLABLE_HPP_INCLUDED
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/utility/result_of.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/spirit/home/x3/support/utility/sfinae.hpp>
+
+
+namespace boost { namespace spirit { namespace x3 { namespace detail
+{
+    template <typename Sig, typename Enable = void>
+    struct is_callable_impl
+      : mpl::false_
+    {};
+
+    template <typename F, typename... A>
+    struct is_callable_impl<F(A...), typename disable_if_substitution_failure<
+        typename result_of<F(A...)>::type>::type>
+      : mpl::true_
+    {};
+}}}}
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Sig>
+    struct is_callable;
+
+    template <typename F, typename... A>
+    struct is_callable<F(A...)>
+      : detail::is_callable_impl<F(A...)>
+    {};
+}}}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/lambda_visitor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_LAMBDA_VISITOR_MAY_19_2014_1116AM)
+#define BOOST_SPIRIT_X3_LAMBDA_VISITOR_MAY_19_2014_1116AM
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename RT, typename... Lambdas>
+    struct lambda_visitor;
+
+    template <typename RT, typename F, typename... Lambdas>
+    struct lambda_visitor<RT, F, Lambdas...> : F, lambda_visitor<RT, Lambdas...>
+    {
+        typedef lambda_visitor<RT , Lambdas...> base_type;
+        using F::operator();
+        using base_type::operator();
+        lambda_visitor(F f, Lambdas... lambdas)
+          : F(f), base_type(lambdas...)
+        {}
+    };
+
+    template <typename RT, typename F>
+    struct lambda_visitor<RT, F> : F
+    {
+        typedef RT result_type;
+        using F::operator();
+        lambda_visitor(F f)
+          : F(f)
+        {}
+    };
+
+    template <typename RT>
+    struct lambda_visitor<RT>
+    {
+        typedef RT result_type;
+    };
+
+    template <typename RT, typename... Lambdas>
+    lambda_visitor<RT, Lambdas...> make_lambda_visitor(Lambdas... lambdas)
+    {
+        return { lambdas... };
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/sfinae.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustin Berge
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SFINAE_MAY_20_2013_0840AM)
+#define BOOST_SPIRIT_X3_SFINAE_MAY_20_2013_0840AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename Expr, typename T = void>
+    struct disable_if_substitution_failure
+    {
+        typedef T type;
+    };
+    template <typename Expr, typename T>
+    struct lazy_disable_if_substitution_failure
+    {
+        typedef typename T::type type;
+    };
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/testing.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,69 @@
+/*=============================================================================
+    Copyright (c) 2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_TESTING_JUNE_05_2014_00422PM)
+#define BOOST_SPIRIT_X3_TESTING_JUNE_05_2014_00422PM
+
+namespace boost { namespace spirit { namespace x3 { namespace testing
+{
+    ////////////////////////////////////////////////////////////////////////////
+    //
+    //  Test utility
+    //
+    //  The test function accepts a file loaded in memory. The 'test_file'
+    //  range param points to the data contained in the file. This file
+    //  contains two parts.
+    //
+    //      1) The source input for testing
+    //      2) The expected result.
+    //
+    //  The first part of the file is sent to the generator function
+    //  'gen' which returns a string. This generated string is then compared
+    //  to the contents of the second (expected result) part.
+    //
+    //  The second part is demarcated by the string parameter 'demarcation'
+    //  which defaults to "<**expected**>". The expected template may include
+    //  embedded regular expressions marked-up within re_prefix and re_suffix
+    //  parameter tags. For example, given the default RE markup ("<%" and
+    //  "%>"), this template:
+    //
+    //      <%[0-9]+%>
+    //
+    //  will match any integer in the source input being tested. The function
+    //  will return the first non-matching position. The flag full_match
+    //  indicates a full match. It is possible for returned pos to be
+    //  at the end of in (in.end()) while still returning full_match ==
+    //  false. In that case, we have a partial match.
+    //
+    //  Here's an example of a test file:
+    //
+    //      Hello World, I am Joel. This is a test.
+    //
+    //      <**expected**>
+    //      Hello World, I am <%[a-zA-Z]+%>. This is a test.
+    //
+    ////////////////////////////////////////////////////////////////////////////
+
+    template <typename Iterator>
+    struct test_result
+    {
+        Iterator pos;
+        bool full_match;
+    };
+
+    template <typename Range, typename F>
+    test_result<typename Range::const_iterator>
+    test(
+        Range test_file
+      , F gen
+      , char const* demarcation = "<**expected**>"
+      , char const* re_prefix = "<%"
+      , char const* re_suffix = "%>"
+   );
+
+}}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/unrefcv.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+/*//////////////////////////////////////////////////////////////////////////////
+    Copyright (c) 2014 Jamboree
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////*/
+#ifndef BOOST_SPIRIT_X3_UNREFCV_HPP_INCLUDED
+#define BOOST_SPIRIT_X3_UNREFCV_HPP_INCLUDED
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename T>
+    struct unrefcv : remove_cv<typename remove_reference<T>::type> {};
+
+    template <typename T>
+    using unrefcv_t = typename unrefcv<T>::type;
+}}}
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/utility/utf8.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,72 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_UC_TYPES_NOVEMBER_23_2008_0840PM)
+#define BOOST_SPIRIT_X3_UC_TYPES_NOVEMBER_23_2008_0840PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/foreach.hpp>
+#include <boost/regex/pending/unicode_iterator.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <string>
+
+namespace boost { namespace spirit { namespace x3
+{
+    typedef ::boost::uint32_t ucs4_char;
+    typedef char utf8_char;
+    typedef std::basic_string<ucs4_char> ucs4_string;
+    typedef std::basic_string<utf8_char> utf8_string;
+
+    template <typename Char>
+    inline utf8_string to_utf8(Char value)
+    {
+        // always store as UTF8
+        utf8_string result;
+        typedef std::back_insert_iterator<utf8_string> insert_iter;
+        insert_iter out_iter(result);
+        utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+        typedef typename make_unsigned<Char>::type UChar;
+        *utf8_iter = (UChar)value;
+        return result;
+    }
+
+    template <typename Char>
+    inline utf8_string to_utf8(Char const* str)
+    {
+        // always store as UTF8
+        utf8_string result;
+        typedef std::back_insert_iterator<utf8_string> insert_iter;
+        insert_iter out_iter(result);
+        utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+        typedef typename make_unsigned<Char>::type UChar;
+        while (*str)
+            *utf8_iter++ = (UChar)*str++;
+        return result;
+    }
+
+    template <typename Char, typename Traits, typename Allocator>
+    inline utf8_string
+    to_utf8(std::basic_string<Char, Traits, Allocator> const& str)
+    {
+        // always store as UTF8
+        utf8_string result;
+        typedef std::back_insert_iterator<utf8_string> insert_iter;
+        insert_iter out_iter(result);
+        utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+        typedef typename make_unsigned<Char>::type UChar;
+        BOOST_FOREACH(Char ch, str)
+        {
+            *utf8_iter++ = (UChar)ch;
+        }
+        return result;
+    }
+}}}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/include/qi_copy.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,17 @@
+/*=============================================================================
+    Copyright (c) 2001-2012 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_INCLUDE_SUPPORT_COPY
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_COPY
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/copy.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/include/support_auto.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,17 @@
+/*=============================================================================
+    Copyright (c) 2001-2012 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_INCLUDE_SUPPORT_AUTO
+#define BOOST_SPIRIT_INCLUDE_SUPPORT_AUTO
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/auto.hpp>
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/strong_typedef.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#ifndef BOOST_STRONG_TYPEDEF_HPP
-#define BOOST_STRONG_TYPEDEF_HPP
-
-// MS compatible compilers support #pragma once
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// strong_typedef.hpp:
-
-// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.
-
-// macro used to implement a strong typedef.  strong typedef
-// guarentees that two types are distinguised even though the
-// share the same underlying implementation.  typedef does not create
-// a new type.  BOOST_STRONG_TYPEDEF(T, D) creates a new type named D
-// that operates as a type T.
-
-#include <boost/config.hpp>
-#include <boost/operators.hpp>
-
-#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x590
-    #define BOOST_STRONG_TYPEDEF(T, D)                              \
-    struct D                                                        \
-        : boost::totally_ordered1< D                                \
-        , boost::totally_ordered2< D, T                             \
-        > >                                                         \
-    {                                                               \
-        T t;                                                        \
-        explicit D(const T t_) : t(t_) {};                          \
-        D(){};                                                      \
-        D(const D & t_) : t(t_.t){}                                 \
-        D & operator=(const D & rhs) { t = rhs.t; return *this;}    \
-        D & operator=(const T & rhs) { t = rhs; return *this;}      \
-        operator const T & () const {return t; }                    \
-        operator T & () { return t; }                               \
-        bool operator==(const D & rhs) const { return t == rhs.t; } \
-        bool operator<(const D & rhs) const { return t < rhs.t; }   \
-    };
-#else
-    #define BOOST_STRONG_TYPEDEF(T, D)                              \
-    struct D                                                        \
-        : boost::totally_ordered1< D                                \
-        , boost::totally_ordered2< D, T                             \
-        > >                                                         \
-    {                                                               \
-        T t;                                                        \
-        explicit D(const T t_) : t(t_) {};                          \
-        D(){};                                                      \
-        D(const D & t_) : t(t_.t){}                                 \
-        D & operator=(const D & rhs) { t = rhs.t; return *this;}    \
-        D & operator=(const T & rhs) { t = rhs; return *this;}      \
-        /*operator const T & () const {return t; }*/                \
-        operator T & () { return t; }                               \
-        bool operator==(const D & rhs) const { return t == rhs.t; } \
-        bool operator<(const D & rhs) const { return t < rhs.t; }   \
-    };
-#endif // !defined(__BORLANDC) || __BORLANDC__ >= 0x590
-
-#endif // BOOST_STRONG_TYPEDEF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/system/detail/error_code.ipp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,467 @@
+//  error_code support implementation file  ----------------------------------//
+
+//  Copyright Beman Dawes 2002, 2006
+//  Copyright (c) Microsoft Corporation 2014
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+//----------------------------------------------------------------------------//
+
+#include <boost/config/warning_disable.hpp>
+
+#include <boost/system/config.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/cerrno.hpp>
+#include <vector>
+#include <cstdlib>
+#include <cassert>
+
+#include <cstring> // for strerror/strerror_r
+
+# if defined( BOOST_WINDOWS_API )
+#   include <windows.h>
+#   if !BOOST_PLAT_WINDOWS_RUNTIME
+#     include <boost/system/detail/local_free_on_destruction.hpp>
+#   endif
+#   ifndef ERROR_INCORRECT_SIZE
+#     define ERROR_INCORRECT_SIZE ERROR_BAD_ARGUMENTS
+#   endif
+# endif
+
+//----------------------------------------------------------------------------//
+namespace boost
+{
+    namespace system
+    {
+
+namespace
+{
+
+  //  standard error categories  ---------------------------------------------//
+
+  class generic_error_category : public error_category
+  {
+  public:
+    generic_error_category(){}
+    const char *   name() const BOOST_SYSTEM_NOEXCEPT;
+    std::string    message( int ev ) const;
+  };
+
+  class system_error_category : public error_category
+  {
+  public:
+    system_error_category(){}
+    const char *        name() const BOOST_SYSTEM_NOEXCEPT;
+    std::string         message( int ev ) const;
+    error_condition     default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT;
+  };
+
+  //  generic_error_category implementation  ---------------------------------//
+
+  const char * generic_error_category::name() const BOOST_SYSTEM_NOEXCEPT
+  {
+    return "generic";
+  }
+
+  std::string generic_error_category::message( int ev ) const
+  {
+    using namespace boost::system::errc;
+#if defined(__PGI)
+      using boost::system::errc::invalid_argument;
+#endif
+
+    static std::string unknown_err( "Unknown error" );
+  // strerror_r is preferred because it is always thread safe,
+  // however, we fallback to strerror in certain cases because:
+  //   -- Windows doesn't provide strerror_r.
+  //   -- HP and Sun do provide strerror_r on newer systems, but there is
+  //      no way to tell if is available at runtime and in any case their
+  //      versions of strerror are thread safe anyhow.
+  //   -- Linux only sometimes provides strerror_r.
+  //   -- Tru64 provides strerror_r only when compiled -pthread.
+  //   -- VMS doesn't provide strerror_r, but on this platform, strerror is
+  //      thread safe.
+  # if defined(BOOST_WINDOWS_API) || defined(__hpux) || defined(__sun)\
+     || (defined(__linux) && (!defined(__USE_XOPEN2K) || defined(BOOST_SYSTEM_USE_STRERROR)))\
+     || (defined(__osf__) && !defined(_REENTRANT))\
+     || (defined(__INTEGRITY))\
+     || (defined(__vms))\
+     || (defined(__QNXNTO__))
+      const char * c_str = std::strerror( ev );
+      return  c_str
+        ? std::string( c_str )
+        : unknown_err;
+  # else  // use strerror_r
+      char buf[64];
+      char * bp = buf;
+      std::size_t sz = sizeof(buf);
+  #  if defined(__CYGWIN__) || defined(__USE_GNU)
+      // Oddball version of strerror_r
+      const char * c_str = strerror_r( ev, bp, sz );
+      return  c_str
+        ? std::string( c_str )
+        : unknown_err;
+  #  else
+      // POSIX version of strerror_r
+      int result;
+      for (;;)
+      {
+        // strerror_r returns 0 on success, otherwise ERANGE if buffer too small,
+        // invalid_argument if ev not a valid error number
+  #  if defined (__sgi)
+        const char * c_str = strerror( ev );
+        result = 0;
+      return  c_str
+        ? std::string( c_str )
+        : unknown_err;
+  #  else
+        result = strerror_r( ev, bp, sz );
+  #  endif
+        if (result == 0 )
+          break;
+        else
+        {
+  #  if defined(__linux)
+          // Linux strerror_r returns -1 on error, with error number in errno
+          result = errno;
+  #  endif
+          if ( result !=  ERANGE ) break;
+          if ( sz > sizeof(buf) ) std::free( bp );
+          sz *= 2;
+          if ( (bp = static_cast<char*>(std::malloc( sz ))) == 0 )
+            return std::string( "ENOMEM" );
+        }
+      }
+      std::string msg;
+#   ifndef BOOST_NO_EXCEPTIONS
+      try
+#   endif
+      {
+        msg = ( ( result == invalid_argument ) ? "Unknown error" : bp );
+      }
+
+#   ifndef BOOST_NO_EXCEPTIONS
+      // See ticket #2098
+      catch(...)
+      {
+        // just eat the exception
+      }
+#   endif
+
+      if ( sz > sizeof(buf) ) std::free( bp );
+      sz = 0;
+      return msg;
+  #  endif   // else POSIX version of strerror_r
+  # endif  // else use strerror_r
+  }
+  //  system_error_category implementation  --------------------------------//
+
+  const char * system_error_category::name() const BOOST_SYSTEM_NOEXCEPT
+  {
+    return "system";
+  }
+
+  error_condition system_error_category::default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT
+  {
+    using namespace boost::system::errc;
+#if defined(__PGI)
+      using boost::system::errc::invalid_argument;
+#endif
+
+# if defined(BOOST_WINDOWS_API)
+#   if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY & WINAPI_PARTITION_APP) != 0)
+    // When using the Windows Runtime, most system errors are reported as HRESULTs.
+    // We want to map the common Win32 errors to their equivalent error condition,
+    // whether or not they are reported via an HRESULT.
+    if ( ev < 0 ) // Check for failed HRESULTs only.
+      if ( HRESULT_FACILITY( ev ) == FACILITY_WIN32 )
+        ev = HRESULT_CODE( ev );
+#   endif
+# endif
+
+    switch ( ev )
+    {
+    case 0: return make_error_condition( success );
+# if defined(BOOST_POSIX_API)
+    // POSIX-like O/S -> posix_errno decode table  ---------------------------//
+    case E2BIG: return make_error_condition( argument_list_too_long );
+    case EACCES: return make_error_condition( permission_denied );
+    case EADDRINUSE: return make_error_condition( address_in_use );
+    case EADDRNOTAVAIL: return make_error_condition( address_not_available );
+    case EAFNOSUPPORT: return make_error_condition( address_family_not_supported );
+    case EAGAIN: return make_error_condition( resource_unavailable_try_again );
+#   if EALREADY != EBUSY  //  EALREADY and EBUSY are the same on QNX Neutrino
+    case EALREADY: return make_error_condition( connection_already_in_progress );
+#   endif
+    case EBADF: return make_error_condition( bad_file_descriptor );
+    case EBADMSG: return make_error_condition( bad_message );
+    case EBUSY: return make_error_condition( device_or_resource_busy );
+    case ECANCELED: return make_error_condition( operation_canceled );
+    case ECHILD: return make_error_condition( no_child_process );
+    case ECONNABORTED: return make_error_condition( connection_aborted );
+    case ECONNREFUSED: return make_error_condition( connection_refused );
+    case ECONNRESET: return make_error_condition( connection_reset );
+    case EDEADLK: return make_error_condition( resource_deadlock_would_occur );
+    case EDESTADDRREQ: return make_error_condition( destination_address_required );
+    case EDOM: return make_error_condition( argument_out_of_domain );
+    case EEXIST: return make_error_condition( file_exists );
+    case EFAULT: return make_error_condition( bad_address );
+    case EFBIG: return make_error_condition( file_too_large );
+    case EHOSTUNREACH: return make_error_condition( host_unreachable );
+    case EIDRM: return make_error_condition( identifier_removed );
+    case EILSEQ: return make_error_condition( illegal_byte_sequence );
+    case EINPROGRESS: return make_error_condition( operation_in_progress );
+    case EINTR: return make_error_condition( interrupted );
+    case EINVAL: return make_error_condition( invalid_argument );
+    case EIO: return make_error_condition( io_error );
+    case EISCONN: return make_error_condition( already_connected );
+    case EISDIR: return make_error_condition( is_a_directory );
+    case ELOOP: return make_error_condition( too_many_symbolic_link_levels );
+    case EMFILE: return make_error_condition( too_many_files_open );
+    case EMLINK: return make_error_condition( too_many_links );
+    case EMSGSIZE: return make_error_condition( message_size );
+    case ENAMETOOLONG: return make_error_condition( filename_too_long );
+    case ENETDOWN: return make_error_condition( network_down );
+    case ENETRESET: return make_error_condition( network_reset );
+    case ENETUNREACH: return make_error_condition( network_unreachable );
+    case ENFILE: return make_error_condition( too_many_files_open_in_system );
+    case ENOBUFS: return make_error_condition( no_buffer_space );
+    case ENODATA: return make_error_condition( no_message_available );
+    case ENODEV: return make_error_condition( no_such_device );
+    case ENOENT: return make_error_condition( no_such_file_or_directory );
+    case ENOEXEC: return make_error_condition( executable_format_error );
+    case ENOLCK: return make_error_condition( no_lock_available );
+    case ENOLINK: return make_error_condition( no_link );
+    case ENOMEM: return make_error_condition( not_enough_memory );
+    case ENOMSG: return make_error_condition( no_message );
+    case ENOPROTOOPT: return make_error_condition( no_protocol_option );
+    case ENOSPC: return make_error_condition( no_space_on_device );
+    case ENOSR: return make_error_condition( no_stream_resources );
+    case ENOSTR: return make_error_condition( not_a_stream );
+    case ENOSYS: return make_error_condition( function_not_supported );
+    case ENOTCONN: return make_error_condition( not_connected );
+    case ENOTDIR: return make_error_condition( not_a_directory );
+  # if ENOTEMPTY != EEXIST // AIX treats ENOTEMPTY and EEXIST as the same value
+    case ENOTEMPTY: return make_error_condition( directory_not_empty );
+  # endif // ENOTEMPTY != EEXIST
+  # if ENOTRECOVERABLE != ECONNRESET // the same on some Broadcom chips
+    case ENOTRECOVERABLE: return make_error_condition( state_not_recoverable );
+  # endif // ENOTRECOVERABLE != ECONNRESET
+    case ENOTSOCK: return make_error_condition( not_a_socket );
+    case ENOTSUP: return make_error_condition( not_supported );
+    case ENOTTY: return make_error_condition( inappropriate_io_control_operation );
+    case ENXIO: return make_error_condition( no_such_device_or_address );
+  # if EOPNOTSUPP != ENOTSUP
+    case EOPNOTSUPP: return make_error_condition( operation_not_supported );
+  # endif // EOPNOTSUPP != ENOTSUP
+    case EOVERFLOW: return make_error_condition( value_too_large );
+  # if EOWNERDEAD != ECONNABORTED // the same on some Broadcom chips
+    case EOWNERDEAD: return make_error_condition( owner_dead );
+  # endif // EOWNERDEAD != ECONNABORTED
+    case EPERM: return make_error_condition( operation_not_permitted );
+    case EPIPE: return make_error_condition( broken_pipe );
+    case EPROTO: return make_error_condition( protocol_error );
+    case EPROTONOSUPPORT: return make_error_condition( protocol_not_supported );
+    case EPROTOTYPE: return make_error_condition( wrong_protocol_type );
+    case ERANGE: return make_error_condition( result_out_of_range );
+    case EROFS: return make_error_condition( read_only_file_system );
+    case ESPIPE: return make_error_condition( invalid_seek );
+    case ESRCH: return make_error_condition( no_such_process );
+    case ETIME: return make_error_condition( stream_timeout );
+    case ETIMEDOUT: return make_error_condition( timed_out );
+    case ETXTBSY: return make_error_condition( text_file_busy );
+  # if EAGAIN != EWOULDBLOCK
+    case EWOULDBLOCK: return make_error_condition( operation_would_block );
+  # endif // EAGAIN != EWOULDBLOCK
+    case EXDEV: return make_error_condition( cross_device_link );
+  #else
+    // Windows system -> posix_errno decode table  ---------------------------//
+    // see WinError.h comments for descriptions of errors
+    case ERROR_ACCESS_DENIED: return make_error_condition( permission_denied );
+    case ERROR_ALREADY_EXISTS: return make_error_condition( file_exists );
+    case ERROR_BAD_UNIT: return make_error_condition( no_such_device );
+    case ERROR_BUFFER_OVERFLOW: return make_error_condition( filename_too_long );
+    case ERROR_BUSY: return make_error_condition( device_or_resource_busy );
+    case ERROR_BUSY_DRIVE: return make_error_condition( device_or_resource_busy );
+    case ERROR_CANNOT_MAKE: return make_error_condition( permission_denied );
+    case ERROR_CANTOPEN: return make_error_condition( io_error );
+    case ERROR_CANTREAD: return make_error_condition( io_error );
+    case ERROR_CANTWRITE: return make_error_condition( io_error );
+    case ERROR_CURRENT_DIRECTORY: return make_error_condition( permission_denied );
+    case ERROR_DEV_NOT_EXIST: return make_error_condition( no_such_device );
+    case ERROR_DEVICE_IN_USE: return make_error_condition( device_or_resource_busy );
+    case ERROR_DIR_NOT_EMPTY: return make_error_condition( directory_not_empty );
+    case ERROR_DIRECTORY: return make_error_condition( invalid_argument ); // WinError.h: "The directory name is invalid"
+    case ERROR_DISK_FULL: return make_error_condition( no_space_on_device );
+    case ERROR_FILE_EXISTS: return make_error_condition( file_exists );
+    case ERROR_FILE_NOT_FOUND: return make_error_condition( no_such_file_or_directory );
+    case ERROR_HANDLE_DISK_FULL: return make_error_condition( no_space_on_device );
+    case ERROR_INVALID_ACCESS: return make_error_condition( permission_denied );
+    case ERROR_INVALID_DRIVE: return make_error_condition( no_such_device );
+    case ERROR_INVALID_FUNCTION: return make_error_condition( function_not_supported );
+    case ERROR_INVALID_HANDLE: return make_error_condition( invalid_argument );
+    case ERROR_INVALID_NAME: return make_error_condition( invalid_argument );
+    case ERROR_LOCK_VIOLATION: return make_error_condition( no_lock_available );
+    case ERROR_LOCKED: return make_error_condition( no_lock_available );
+    case ERROR_NEGATIVE_SEEK: return make_error_condition( invalid_argument );
+    case ERROR_NOACCESS: return make_error_condition( permission_denied );
+    case ERROR_NOT_ENOUGH_MEMORY: return make_error_condition( not_enough_memory );
+    case ERROR_NOT_READY: return make_error_condition( resource_unavailable_try_again );
+    case ERROR_NOT_SAME_DEVICE: return make_error_condition( cross_device_link );
+    case ERROR_OPEN_FAILED: return make_error_condition( io_error );
+    case ERROR_OPEN_FILES: return make_error_condition( device_or_resource_busy );
+    case ERROR_OPERATION_ABORTED: return make_error_condition( operation_canceled );
+    case ERROR_OUTOFMEMORY: return make_error_condition( not_enough_memory );
+    case ERROR_PATH_NOT_FOUND: return make_error_condition( no_such_file_or_directory );
+    case ERROR_READ_FAULT: return make_error_condition( io_error );
+    case ERROR_RETRY: return make_error_condition( resource_unavailable_try_again );
+    case ERROR_SEEK: return make_error_condition( io_error );
+    case ERROR_SHARING_VIOLATION: return make_error_condition( permission_denied );
+    case ERROR_TOO_MANY_OPEN_FILES: return make_error_condition( too_many_files_open );
+    case ERROR_WRITE_FAULT: return make_error_condition( io_error );
+    case ERROR_WRITE_PROTECT: return make_error_condition( permission_denied );
+    case WSAEACCES: return make_error_condition( permission_denied );
+    case WSAEADDRINUSE: return make_error_condition( address_in_use );
+    case WSAEADDRNOTAVAIL: return make_error_condition( address_not_available );
+    case WSAEAFNOSUPPORT: return make_error_condition( address_family_not_supported );
+    case WSAEALREADY: return make_error_condition( connection_already_in_progress );
+    case WSAEBADF: return make_error_condition( bad_file_descriptor );
+    case WSAECONNABORTED: return make_error_condition( connection_aborted );
+    case WSAECONNREFUSED: return make_error_condition( connection_refused );
+    case WSAECONNRESET: return make_error_condition( connection_reset );
+    case WSAEDESTADDRREQ: return make_error_condition( destination_address_required );
+    case WSAEFAULT: return make_error_condition( bad_address );
+    case WSAEHOSTUNREACH: return make_error_condition( host_unreachable );
+    case WSAEINPROGRESS: return make_error_condition( operation_in_progress );
+    case WSAEINTR: return make_error_condition( interrupted );
+    case WSAEINVAL: return make_error_condition( invalid_argument );
+    case WSAEISCONN: return make_error_condition( already_connected );
+    case WSAEMFILE: return make_error_condition( too_many_files_open );
+    case WSAEMSGSIZE: return make_error_condition( message_size );
+    case WSAENAMETOOLONG: return make_error_condition( filename_too_long );
+    case WSAENETDOWN: return make_error_condition( network_down );
+    case WSAENETRESET: return make_error_condition( network_reset );
+    case WSAENETUNREACH: return make_error_condition( network_unreachable );
+    case WSAENOBUFS: return make_error_condition( no_buffer_space );
+    case WSAENOPROTOOPT: return make_error_condition( no_protocol_option );
+    case WSAENOTCONN: return make_error_condition( not_connected );
+    case WSAENOTSOCK: return make_error_condition( not_a_socket );
+    case WSAEOPNOTSUPP: return make_error_condition( operation_not_supported );
+    case WSAEPROTONOSUPPORT: return make_error_condition( protocol_not_supported );
+    case WSAEPROTOTYPE: return make_error_condition( wrong_protocol_type );
+    case WSAETIMEDOUT: return make_error_condition( timed_out );
+    case WSAEWOULDBLOCK: return make_error_condition( operation_would_block );
+  #endif
+    default: return error_condition( ev, system_category() );
+    }
+  }
+
+# if !defined( BOOST_WINDOWS_API )
+
+  std::string system_error_category::message( int ev ) const
+  {
+    return generic_category().message( ev );
+  }
+# else
+
+  std::string system_error_category::message( int ev ) const
+  {
+#if defined(UNDER_CE) || BOOST_PLAT_WINDOWS_RUNTIME || defined(BOOST_NO_ANSI_APIS)
+    std::wstring buf(128, wchar_t());
+    for (;;)
+    {
+        DWORD retval = ::FormatMessageW(
+            FORMAT_MESSAGE_FROM_SYSTEM |
+            FORMAT_MESSAGE_IGNORE_INSERTS,
+            NULL,
+            ev,
+            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+            &buf[0],
+            buf.size(),
+            NULL
+        );
+        
+        if (retval > 0)
+        {
+            buf.resize(retval);
+            break;
+        }
+        else if ( ::GetLastError() != ERROR_INSUFFICIENT_BUFFER )
+        {
+            return std::string("Unknown error");
+        }
+        else
+        {
+            buf.resize(buf.size() + buf.size() / 2);
+        }
+    }
+    
+    int num_chars = (buf.size() + 1) * 2;
+    LPSTR narrow_buffer = (LPSTR)_alloca( num_chars );
+    if (::WideCharToMultiByte(CP_ACP, 0, buf.c_str(), -1, narrow_buffer, num_chars, NULL, NULL) == 0)
+    {
+        return std::string("Unknown error");
+    }
+
+    std::string str( narrow_buffer );
+#else
+    LPVOID lpMsgBuf = 0;
+    DWORD retval = ::FormatMessageA(
+        FORMAT_MESSAGE_ALLOCATE_BUFFER |
+        FORMAT_MESSAGE_FROM_SYSTEM |
+        FORMAT_MESSAGE_IGNORE_INSERTS,
+        NULL,
+        ev,
+        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+        (LPSTR) &lpMsgBuf,
+        0,
+        NULL
+    );
+    detail::local_free_on_destruction lfod(lpMsgBuf);
+    if (retval == 0)
+        return std::string("Unknown error");
+
+    std::string str( static_cast<LPCSTR>(lpMsgBuf) );
+# endif
+    while ( str.size()
+      && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
+        str.erase( str.size()-1 );
+    if ( str.size() && str[str.size()-1] == '.' )
+      { str.erase( str.size()-1 ); }
+    return str;
+  }
+# endif
+
+} // unnamed namespace
+
+
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+    BOOST_SYSTEM_DECL error_code throws; // "throw on error" special error_code;
+                                         //  note that it doesn't matter if this
+                                         //  isn't initialized before use since
+                                         //  the only use is to take its
+                                         //  address for comparison purposes
+# endif
+
+# ifdef BOOST_ERROR_CODE_HEADER_ONLY
+#   define BOOST_SYSTEM_LINKAGE inline
+# else
+#   define BOOST_SYSTEM_LINKAGE BOOST_SYSTEM_DECL
+# endif
+
+    BOOST_SYSTEM_LINKAGE const error_category & system_category() BOOST_SYSTEM_NOEXCEPT
+    {
+      static const system_error_category  system_category_const;
+      return system_category_const;
+    }
+
+    BOOST_SYSTEM_LINKAGE const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT
+    {
+      static const generic_error_category generic_category_const;
+      return generic_category_const;
+    }
+
+  } // namespace system
+} // namespace boost
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/system/detail/local_free_on_destruction.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+//  local_free_on_exit.hpp  ------------------------------------------------------------//
+
+//  Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//  Copyright (c) 2010 Beman Dawes
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  This is derived from boost/asio/detail/local_free_on_block_exit.hpp to avoid
+//  a dependency on asio. Thanks to Chris Kohlhoff for pointing it out.
+
+#ifndef BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
+#define BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
+
+namespace boost {
+namespace system {
+namespace detail {
+
+class local_free_on_destruction
+{
+public:
+  explicit local_free_on_destruction(void* p)
+    : p_(p) {}
+
+  ~local_free_on_destruction()
+  {
+    ::LocalFree(p_);
+  }
+
+private:
+  void* p_;
+  local_free_on_destruction(const local_free_on_destruction&);  // = deleted
+  local_free_on_destruction& operator=(const local_free_on_destruction&);  // = deleted
+};
+
+} // namespace detail
+} // namespace system
+} // namespace boost
+
+#endif  // BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/caller_context.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,59 @@
+// (C) Copyright 2013,2015 Vicente J. Botet Escriba
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_THREAD_CALL_CONTEXT_HPP
+#define BOOST_THREAD_CALL_CONTEXT_HPP
+
+#include <boost/thread/detail/config.hpp>
+#if defined BOOST_THREAD_USES_LOG_THREAD_ID
+#include <boost/thread/thread.hpp>
+#endif
+#include <boost/current_function.hpp>
+#include <boost/io/ios_state.hpp>
+#include <iomanip>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+
+  struct caller_context_t
+  {
+    const char * filename;
+    unsigned lineno;
+    const char * func;
+    caller_context_t(const char * filename, unsigned lineno, const char * func) :
+      filename(filename), lineno(lineno), func(func)
+    {
+    }
+  };
+
+#define BOOST_CONTEXTOF boost::caller_context_t(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION)
+
+  template <typename OStream>
+  OStream& operator<<(OStream& os, caller_context_t const& ctx)
+  {
+#if defined BOOST_THREAD_USES_LOG_THREAD_ID
+    {
+      io::ios_flags_saver ifs( os );
+      os << std::left << std::setw(14) << boost::this_thread::get_id() << " ";
+    }
+#endif
+    {
+      io::ios_flags_saver ifs(os);
+      os << std::setw(50) << ctx.filename << "["
+         << std::setw(4) << std::right << std::dec<< ctx.lineno << "] ";
+#if defined BOOST_THREAD_USES_LOG_CURRENT_FUNCTION
+      os << ctx.func << " " ;
+#endif
+    }
+    return os;
+  }
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,209 @@
+#ifndef BOOST_THREAD_CONCURRENT_DEQUE_ADAPTOR_HPP
+#define BOOST_THREAD_CONCURRENT_DEQUE_ADAPTOR_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/concurrent_queues/deque_base.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <typename Queue>
+  class deque_adaptor_copyable_only :
+    public boost::deque_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    deque_adaptor_copyable_only()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+    void push_back(const value_type& x) { queue.push_back(x); }
+
+    void pull_front(value_type& x) { queue.pull_front(x); };
+    value_type pull_front() { return queue.pull_front(); }
+
+    queue_op_status try_push_back(const value_type& x) { return queue.try_push_back(x); }
+    queue_op_status try_pull_front(value_type& x)  { return queue.try_pull_front(x); }
+
+    queue_op_status nonblocking_push_back(const value_type& x) { return queue.nonblocking_push_back(x); }
+    queue_op_status nonblocking_pull_front(value_type& x)  { return queue.nonblocking_pull_front(x); }
+
+    queue_op_status wait_push_back(const value_type& x) { return queue.wait_push_back(x); }
+    queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); }
+
+  };
+  template <typename Queue>
+  class deque_adaptor_movable_only :
+    public boost::deque_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+
+    deque_adaptor_movable_only()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+
+    void pull_front(value_type& x) { queue.pull_front(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull_front() { return queue.pull_front(); }
+
+    queue_op_status try_pull_front(value_type& x)  { return queue.try_pull_front(x); }
+
+    queue_op_status nonblocking_pull_front(value_type& x)  { return queue.nonblocking_pull_front(x); }
+
+    queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); }
+
+    void push_back(BOOST_THREAD_RV_REF(value_type) x) { queue.push_back(boost::move(x)); }
+    queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push_back(boost::move(x)); }
+    queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push_back(boost::move(x)); }
+    queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push_back(boost::move(x)); }
+  };
+
+  template <typename Queue>
+  class deque_adaptor_copyable_and_movable :
+    public boost::deque_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+
+    deque_adaptor_copyable_and_movable()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+
+    void push_back(const value_type& x) { queue.push_back(x); }
+
+    void pull_front(value_type& x) { queue.pull_front(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull_front() { return queue.pull_front(); }
+
+    queue_op_status try_push_back(const value_type& x) { return queue.try_push_back(x); }
+    queue_op_status try_pull_front(value_type& x)  { return queue.try_pull_front(x); }
+
+    queue_op_status nonblocking_push_back(const value_type& x) { return queue.nonblocking_push_back(x); }
+    queue_op_status nonblocking_pull_front(value_type& x)  { return queue.nonblocking_pull_front(x); }
+
+    queue_op_status wait_push_back(const value_type& x) { return queue.wait_push_back(x); }
+    queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); }
+
+    void push_back(BOOST_THREAD_RV_REF(value_type) x) { queue.push_back(boost::move(x)); }
+    queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push_back(boost::move(x)); }
+    queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push_back(boost::move(x)); }
+    queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push_back(boost::move(x)); }
+  };
+
+
+  template <class Q, class T,
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+#if defined __GNUC__ && ! defined __clang__
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // __GNUC__
+#elif defined _MSC_VER
+#if _MSC_VER < 1700
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // _MSC_VER
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif
+#else
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = has_move_emulation_enabled<T>::value
+#endif
+      >
+  struct deque_adaptor;
+
+  template <class Q, class T>
+  struct deque_adaptor<Q, T, true, true> {
+    typedef deque_adaptor_copyable_and_movable<Q> type;
+  };
+  template <class Q, class T>
+  struct deque_adaptor<Q, T, true, false> {
+    typedef deque_adaptor_copyable_only<Q> type;
+  };
+  template <class Q, class T>
+  struct deque_adaptor<Q, T, false, true> {
+    typedef deque_adaptor_movable_only<Q> type;
+  };
+
+}
+
+  template <typename Queue>
+  class deque_adaptor :
+    public detail::deque_adaptor<Queue, typename Queue::value_type>::type
+  {
+  public:
+      typedef typename Queue::value_type value_type;
+      typedef typename Queue::size_type size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~deque_adaptor() {};
+  };
+}
+using concurrent::deque_adaptor;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,202 @@
+#ifndef BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
+#define BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/type_traits/conditional.hpp>
+#include <boost/type_traits/is_copy_constructible.hpp>
+
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <typename ValueType, class SizeType>
+  class deque_base_copyable_only
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+
+    // Constructors/Assignment/Destructors
+    virtual ~deque_base_copyable_only() {};
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void push_back(const value_type& x) = 0;
+
+    virtual void pull_front(value_type&) = 0;
+    virtual value_type pull_front() = 0;
+
+    virtual queue_op_status try_push_back(const value_type& x) = 0;
+    virtual queue_op_status try_pull_front(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
+    virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
+
+    virtual queue_op_status wait_push_back(const value_type& x) = 0;
+    virtual queue_op_status wait_pull_front(value_type& elem) = 0;
+
+  };
+
+  template <typename ValueType, class SizeType>
+  class deque_base_movable_only
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~deque_base_movable_only() {};
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void pull_front(value_type&) = 0;
+    // enable_if is_nothrow_movable<value_type>
+    virtual value_type pull_front() = 0;
+
+    virtual queue_op_status try_pull_front(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
+
+    virtual queue_op_status wait_pull_front(value_type& elem) = 0;
+
+    virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+  };
+
+
+  template <typename ValueType, class SizeType>
+  class deque_base_copyable_and_movable
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~deque_base_copyable_and_movable() {};
+
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void push_back(const value_type& x) = 0;
+
+    virtual void pull_front(value_type&) = 0;
+    // enable_if is_nothrow_copy_movable<value_type>
+    virtual value_type pull_front() = 0;
+
+    virtual queue_op_status try_push_back(const value_type& x) = 0;
+    virtual queue_op_status try_pull_front(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
+    virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
+
+    virtual queue_op_status wait_push_back(const value_type& x) = 0;
+    virtual queue_op_status wait_pull_front(value_type& elem) = 0;
+
+    virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
+  };
+
+  template <class T, class ST,
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+#if defined __GNUC__ && ! defined __clang__
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // __GNUC__
+#elif defined _MSC_VER
+#if _MSC_VER < 1700
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // _MSC_VER
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif
+#else
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = has_move_emulation_enabled<T>::value
+#endif
+      >
+  struct deque_base;
+
+  template <class T, class ST>
+  struct deque_base<T, ST, true, true> {
+    typedef deque_base_copyable_and_movable<T, ST> type;
+  };
+  template <class T, class ST>
+  struct deque_base<T, ST, true, false> {
+    typedef deque_base_copyable_only<T, ST> type;
+  };
+  template <class T, class ST>
+  struct deque_base<T, ST, false, true> {
+    typedef deque_base_movable_only<T, ST> type;
+  };
+
+}
+
+  template <class ValueType, class SizeType=std::size_t>
+  class deque_base :
+    public detail::deque_base<ValueType, SizeType>::type
+  {
+  public:
+      typedef ValueType value_type;
+      typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~deque_base() {};
+  };
+
+}
+using concurrent::deque_base;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/deque_views.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,165 @@
+#ifndef BOOST_THREAD_QUEUE_VIEWS_HPP
+#define BOOST_THREAD_QUEUE_VIEWS_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/concurrent_queues/deque_base.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+
+  template <typename Queue>
+  class deque_back_view
+  {
+   Queue* queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    deque_back_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {}
+
+    // Observers
+    bool empty() const  { return queue->empty(); }
+    bool full() const { return queue->full(); }
+    size_type size() const { return queue->size(); }
+    bool closed() const { return queue->closed(); }
+
+    // Modifiers
+    void close() { queue->close(); }
+
+    void push(const value_type& x) { queue->push_back(x); }
+
+    void pull(value_type& x) { queue->pull_back(x); }
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull()  { return queue->pull_back(); }
+
+    queue_op_status try_push(const value_type& x) { return queue->try_push_back(x); }
+
+    queue_op_status try_pull(value_type& x) { return queue->try_pull_back(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push_back(x); }
+
+    queue_op_status nonblocking_pull(value_type& x) { return queue->nonblocking_pull_back(x); }
+
+    queue_op_status wait_push(const value_type& x) { return queue->wait_push_back(x); }
+    queue_op_status wait_pull(value_type& x) { return queue->wait_pull_back(x); }
+
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push_back(boost::move(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push_back(boost::move(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push_back(boost::move(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push_back(boost::move(x)); }
+  };
+
+  template <typename Queue>
+  class deque_front_view
+  {
+   Queue* queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    deque_front_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {}
+
+    // Observers
+    bool empty() const  { return queue->empty(); }
+    bool full() const { return queue->full(); }
+    size_type size() const { return queue->size(); }
+    bool closed() const { return queue->closed(); }
+
+    // Modifiers
+    void close() { queue->close(); }
+
+    void push(const value_type& x) { queue->push_front(x); }
+
+    void pull(value_type& x) { queue->pull_front(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull()  { return queue->pull_front(); }
+
+    queue_op_status try_push(const value_type& x) { return queue->try_push_front(x); }
+
+    queue_op_status try_pull(value_type& x) { return queue->try_pull_front(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push_front(x); }
+
+    queue_op_status nonblocking_pull(value_type& x) { return queue->nonblocking_pull_front(x); }
+
+    queue_op_status wait_push(const value_type& x) { return queue->wait_push_front(x); }
+    queue_op_status wait_pull(value_type& x) { return queue->wait_pull_front(x); }
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push_front(forward<value_type>(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push_front(forward<value_type>(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push_front(forward<value_type>(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push_front(forward<value_type>(x)); }
+
+  };
+
+#if ! defined BOOST_NO_CXX11_TEMPLATE_ALIASES
+
+  template <class T>
+  using deque_back = deque_back_view<deque_base<T> > ;
+  template <class T>
+  using deque_front = deque_front_view<deque_base<T> > ;
+
+#else
+
+  template <class T>
+  struct deque_back : deque_back_view<deque_base<T> >
+  {
+    typedef deque_back_view<deque_base<T> > base_type;
+    deque_back(deque_base<T>& q) BOOST_NOEXCEPT : base_type(q) {}
+  };
+  template <class T>
+  struct deque_front : deque_front_view<deque_base<T> >
+  {
+    typedef deque_front_view<deque_base<T> > base_type;
+    deque_front(deque_base<T>& q) BOOST_NOEXCEPT : base_type(q) {}
+
+  };
+
+#endif
+
+//  template <class Queue>
+//  deque_back_view<Queue> back(Queue & q) { return deque_back_view<Queue>(q); }
+//  template <class Queue>
+//  deque_front_view<Queue> front(Queue & q) { return deque_front_view<Queue>(q); }
+//#if 0
+//  template <class T>
+//  deque_back<T> back(deque_base<T> & q) { return deque_back<T>(q); }
+//  template <class T>
+//  deque_front<T> front(deque_base<T> & q) { return deque_front<T>(q); }
+//#else
+//  template <class T>
+//  typename deque_back<T>::type back(deque_base<T> & q) { return typename deque_back<T>::type(q); }
+//  template <class T>
+//  typename deque_front<T>::type front(deque_base<T> & q) { return typename deque_front<T>::type(q); }
+//#endif
+}
+
+using concurrent::deque_back_view;
+using concurrent::deque_front_view;
+using concurrent::deque_back;
+using concurrent::deque_front;
+//using concurrent::back;
+//using concurrent::front;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/detail/sync_deque_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,223 @@
+#ifndef BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_DEQUE_BASE_HPP
+#define BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_DEQUE_BASE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/time_point.hpp>
+#include <boost/chrono/system_clocks.hpp>
+#include <boost/throw_exception.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <class ValueType, class Queue>
+  class sync_deque_base
+  {
+  public:
+    typedef ValueType value_type;
+    typedef Queue underlying_queue_type;
+    typedef typename Queue::size_type size_type;
+    typedef queue_op_status op_status;
+
+    typedef typename chrono::steady_clock clock;
+    typedef typename clock::duration duration;
+    typedef typename clock::time_point time_point;
+
+    // Constructors/Assignment/Destructors
+    BOOST_THREAD_NO_COPYABLE(sync_deque_base)
+    inline sync_deque_base();
+    //template <typename Range>
+    //inline explicit sync_deque(Range range);
+    inline ~sync_deque_base();
+
+    // Observers
+    inline bool empty() const;
+    inline bool full() const;
+    inline size_type size() const;
+    inline bool closed() const;
+
+    // Modifiers
+    inline void close();
+
+    inline underlying_queue_type underlying_queue() {
+      lock_guard<mutex> lk(mtx_);
+      return boost::move(data_);
+    }
+
+  protected:
+    mutable mutex mtx_;
+    condition_variable not_empty_;
+    underlying_queue_type data_;
+    bool closed_;
+
+    inline bool empty(unique_lock<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.empty();
+    }
+    inline bool empty(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.empty();
+    }
+
+    inline size_type size(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.size();
+    }
+    inline bool closed(unique_lock<mutex>& lk) const;
+    inline bool closed(lock_guard<mutex>& lk) const;
+
+    inline void throw_if_closed(unique_lock<mutex>&);
+    inline void throw_if_closed(lock_guard<mutex>&);
+
+    inline void wait_until_not_empty(unique_lock<mutex>& lk);
+    inline bool wait_until_not_empty_or_closed(unique_lock<mutex>& lk);
+    inline queue_op_status wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&);
+
+    inline void notify_not_empty_if_needed(unique_lock<mutex>& )
+    {
+      not_empty_.notify_one();
+    }
+    inline void notify_not_empty_if_needed(lock_guard<mutex>& )
+    {
+      not_empty_.notify_one();
+    }
+
+  };
+
+  template <class ValueType, class Queue>
+  sync_deque_base<ValueType, Queue>::sync_deque_base() :
+    data_(), closed_(false)
+  {
+    BOOST_ASSERT(data_.empty());
+  }
+
+  template <class ValueType, class Queue>
+  sync_deque_base<ValueType, Queue>::~sync_deque_base()
+  {
+  }
+
+  template <class ValueType, class Queue>
+  void sync_deque_base<ValueType, Queue>::close()
+  {
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;
+    }
+    not_empty_.notify_all();
+  }
+
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::closed() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return closed(lk);
+  }
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::closed(unique_lock<mutex>&) const
+  {
+    return closed_;
+  }
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::closed(lock_guard<mutex>&) const
+  {
+    return closed_;
+  }
+
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::empty() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return empty(lk);
+  }
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::full() const
+  {
+    return false;
+  }
+
+  template <class ValueType, class Queue>
+  typename sync_deque_base<ValueType, Queue>::size_type sync_deque_base<ValueType, Queue>::size() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return size(lk);
+  }
+
+  template <class ValueType, class Queue>
+  void sync_deque_base<ValueType, Queue>::throw_if_closed(unique_lock<mutex>& lk)
+  {
+    if (closed(lk))
+    {
+      BOOST_THROW_EXCEPTION( sync_deque_is_closed() );
+    }
+  }
+  template <class ValueType, class Queue>
+  void sync_deque_base<ValueType, Queue>::throw_if_closed(lock_guard<mutex>& lk)
+  {
+    if (closed(lk))
+    {
+      BOOST_THROW_EXCEPTION( sync_deque_is_closed() );
+    }
+  }
+
+  template <class ValueType, class Queue>
+  void sync_deque_base<ValueType, Queue>::wait_until_not_empty(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) break;
+      throw_if_closed(lk);
+      not_empty_.wait(lk);
+    }
+  }
+  template <class ValueType, class Queue>
+  bool sync_deque_base<ValueType, Queue>::wait_until_not_empty_or_closed(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) break;
+      if (closed(lk)) return true;
+      not_empty_.wait(lk);
+    }
+     return false;
+  }
+
+  template <class ValueType, class Queue>
+  queue_op_status sync_deque_base<ValueType, Queue>::wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&tp)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) return queue_op_status::success;
+      throw_if_closed(lk);
+      if (not_empty_.wait_until(lk, tp) == cv_status::timeout ) return queue_op_status::timeout;
+    }
+  }
+
+
+} // detail
+} // concurrent
+} // boost
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/detail/sync_queue_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,223 @@
+#ifndef BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_QUEUE_BASE_HPP
+#define BOOST_THREAD_CONCURRENT_QUEUES_DETAIL_SYNC_QUEUE_BASE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/time_point.hpp>
+#include <boost/chrono/system_clocks.hpp>
+#include <boost/throw_exception.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <class ValueType, class Queue>
+  class sync_queue_base
+  {
+  public:
+    typedef ValueType value_type;
+    typedef Queue underlying_queue_type;
+    typedef typename Queue::size_type size_type;
+    typedef queue_op_status op_status;
+
+    typedef typename chrono::steady_clock clock;
+    typedef typename clock::duration duration;
+    typedef typename clock::time_point time_point;
+
+    // Constructors/Assignment/Destructors
+    BOOST_THREAD_NO_COPYABLE(sync_queue_base)
+    inline sync_queue_base();
+    //template <typename Range>
+    //inline explicit sync_queue(Range range);
+    inline ~sync_queue_base();
+
+    // Observers
+    inline bool empty() const;
+    inline bool full() const;
+    inline size_type size() const;
+    inline bool closed() const;
+
+    // Modifiers
+    inline void close();
+
+    inline underlying_queue_type underlying_queue() {
+      lock_guard<mutex> lk(mtx_);
+      return boost::move(data_);
+    }
+
+  protected:
+    mutable mutex mtx_;
+    condition_variable not_empty_;
+    underlying_queue_type data_;
+    bool closed_;
+
+    inline bool empty(unique_lock<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.empty();
+    }
+    inline bool empty(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.empty();
+    }
+
+    inline size_type size(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return data_.size();
+    }
+    inline bool closed(unique_lock<mutex>& lk) const;
+    inline bool closed(lock_guard<mutex>& lk) const;
+
+    inline void throw_if_closed(unique_lock<mutex>&);
+    inline void throw_if_closed(lock_guard<mutex>&);
+
+    inline void wait_until_not_empty(unique_lock<mutex>& lk);
+    inline bool wait_until_not_empty_or_closed(unique_lock<mutex>& lk);
+    inline queue_op_status wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&);
+
+    inline void notify_not_empty_if_needed(unique_lock<mutex>& )
+    {
+      not_empty_.notify_one();
+    }
+    inline void notify_not_empty_if_needed(lock_guard<mutex>& )
+    {
+      not_empty_.notify_one();
+    }
+
+  };
+
+  template <class ValueType, class Queue>
+  sync_queue_base<ValueType, Queue>::sync_queue_base() :
+    data_(), closed_(false)
+  {
+    BOOST_ASSERT(data_.empty());
+  }
+
+  template <class ValueType, class Queue>
+  sync_queue_base<ValueType, Queue>::~sync_queue_base()
+  {
+  }
+
+  template <class ValueType, class Queue>
+  void sync_queue_base<ValueType, Queue>::close()
+  {
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;
+    }
+    not_empty_.notify_all();
+  }
+
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::closed() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return closed(lk);
+  }
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::closed(unique_lock<mutex>&) const
+  {
+    return closed_;
+  }
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::closed(lock_guard<mutex>&) const
+  {
+    return closed_;
+  }
+
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::empty() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return empty(lk);
+  }
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::full() const
+  {
+    return false;
+  }
+
+  template <class ValueType, class Queue>
+  typename sync_queue_base<ValueType, Queue>::size_type sync_queue_base<ValueType, Queue>::size() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return size(lk);
+  }
+
+  template <class ValueType, class Queue>
+  void sync_queue_base<ValueType, Queue>::throw_if_closed(unique_lock<mutex>& lk)
+  {
+    if (closed(lk))
+    {
+      BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+    }
+  }
+  template <class ValueType, class Queue>
+  void sync_queue_base<ValueType, Queue>::throw_if_closed(lock_guard<mutex>& lk)
+  {
+    if (closed(lk))
+    {
+      BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+    }
+  }
+
+  template <class ValueType, class Queue>
+  void sync_queue_base<ValueType, Queue>::wait_until_not_empty(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) break;
+      throw_if_closed(lk);
+      not_empty_.wait(lk);
+    }
+  }
+  template <class ValueType, class Queue>
+  bool sync_queue_base<ValueType, Queue>::wait_until_not_empty_or_closed(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) break;
+      if (closed(lk)) return true;
+      not_empty_.wait(lk);
+    }
+     return false;
+  }
+
+  template <class ValueType, class Queue>
+  queue_op_status sync_queue_base<ValueType, Queue>::wait_until_not_empty_until(unique_lock<mutex>& lk, time_point const&tp)
+  {
+    for (;;)
+    {
+      if (! empty(lk)) return queue_op_status::success;
+      throw_if_closed(lk);
+      if (not_empty_.wait_until(lk, tp) == cv_status::timeout ) return queue_op_status::timeout;
+    }
+  }
+
+
+} // detail
+} // concurrent
+} // boost
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,209 @@
+#ifndef BOOST_THREAD_QUEUE_ADAPTOR_HPP
+#define BOOST_THREAD_QUEUE_ADAPTOR_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/concurrent_queues/queue_base.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <typename Queue>
+  class queue_adaptor_copyable_only :
+    public boost::queue_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    queue_adaptor_copyable_only()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+    void push(const value_type& x) { queue.push(x); }
+
+    void pull(value_type& x) { queue.pull(x); };
+    value_type pull() { return queue.pull(); }
+
+    queue_op_status try_push(const value_type& x) { return queue.try_push(x); }
+    queue_op_status try_pull(value_type& x)  { return queue.try_pull(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue.nonblocking_push(x); }
+    queue_op_status nonblocking_pull(value_type& x)  { return queue.nonblocking_pull(x); }
+
+    queue_op_status wait_push(const value_type& x) { return queue.wait_push(x); }
+    queue_op_status wait_pull(value_type& x) { return queue.wait_pull(x); }
+
+  };
+  template <typename Queue>
+  class queue_adaptor_movable_only :
+    public boost::queue_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+
+    queue_adaptor_movable_only()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+
+    void pull(value_type& x) { queue.pull(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull() { return queue.pull(); }
+
+    queue_op_status try_pull(value_type& x)  { return queue.try_pull(x); }
+
+    queue_op_status nonblocking_pull(value_type& x)  { return queue.nonblocking_pull(x); }
+
+    queue_op_status wait_pull(value_type& x) { return queue.wait_pull(x); }
+
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue.push(boost::move(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push(boost::move(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push(boost::move(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push(boost::move(x)); }
+  };
+
+  template <typename Queue>
+  class queue_adaptor_copyable_and_movable :
+    public boost::queue_base<typename Queue::value_type, typename Queue::size_type>
+  {
+      Queue queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+
+    queue_adaptor_copyable_and_movable()  {}
+
+    // Observers
+    bool empty() const  { return queue.empty(); }
+    bool full() const { return queue.full(); }
+    size_type size() const { return queue.size(); }
+    bool closed() const { return queue.closed(); }
+
+    // Modifiers
+    void close() { queue.close(); }
+
+
+    void push(const value_type& x) { queue.push(x); }
+
+    void pull(value_type& x) { queue.pull(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull() { return queue.pull(); }
+
+    queue_op_status try_push(const value_type& x) { return queue.try_push(x); }
+    queue_op_status try_pull(value_type& x)  { return queue.try_pull(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue.nonblocking_push(x); }
+    queue_op_status nonblocking_pull(value_type& x)  { return queue.nonblocking_pull(x); }
+
+    queue_op_status wait_push(const value_type& x) { return queue.wait_push(x); }
+    queue_op_status wait_pull(value_type& x) { return queue.wait_pull(x); }
+
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue.push(boost::move(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push(boost::move(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push(boost::move(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push(boost::move(x)); }
+  };
+
+
+  template <class Q, class T,
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+#if defined __GNUC__ && ! defined __clang__
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // __GNUC__
+#elif defined _MSC_VER
+#if _MSC_VER < 1700
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // _MSC_VER
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif
+#else
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = has_move_emulation_enabled<T>::value
+#endif
+      >
+  struct queue_adaptor;
+
+  template <class Q, class T>
+  struct queue_adaptor<Q, T, true, true> {
+    typedef queue_adaptor_copyable_and_movable<Q> type;
+  };
+  template <class Q, class T>
+  struct queue_adaptor<Q, T, true, false> {
+    typedef queue_adaptor_copyable_only<Q> type;
+  };
+  template <class Q, class T>
+  struct queue_adaptor<Q, T, false, true> {
+    typedef queue_adaptor_movable_only<Q> type;
+  };
+
+}
+
+  template <typename Queue>
+  class queue_adaptor :
+    public detail::queue_adaptor<Queue, typename Queue::value_type>::type
+  {
+  public:
+      typedef typename Queue::value_type value_type;
+      typedef typename Queue::size_type size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~queue_adaptor() {};
+  };
+}
+using concurrent::queue_adaptor;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,202 @@
+#ifndef BOOST_THREAD_QUEUE_BASE_HPP
+#define BOOST_THREAD_QUEUE_BASE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/type_traits/conditional.hpp>
+#include <boost/type_traits/is_copy_constructible.hpp>
+
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+
+  template <typename ValueType, class SizeType>
+  class queue_base_copyable_only
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+
+    // Constructors/Assignment/Destructors
+    virtual ~queue_base_copyable_only() {};
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void push(const value_type& x) = 0;
+
+    virtual void pull(value_type&) = 0;
+    virtual value_type pull() = 0;
+
+    virtual queue_op_status try_push(const value_type& x) = 0;
+    virtual queue_op_status try_pull(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_push(const value_type& x) = 0;
+    virtual queue_op_status nonblocking_pull(value_type&) = 0;
+
+    virtual queue_op_status wait_push(const value_type& x) = 0;
+    virtual queue_op_status wait_pull(ValueType& elem) = 0;
+
+  };
+
+  template <typename ValueType, class SizeType>
+  class queue_base_movable_only
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~queue_base_movable_only() {};
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void pull(value_type&) = 0;
+    // enable_if is_nothrow_movable<value_type>
+    virtual value_type pull() = 0;
+
+    virtual queue_op_status try_pull(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_pull(value_type&) = 0;
+
+    virtual queue_op_status wait_pull(value_type& elem) = 0;
+
+    virtual void push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+  };
+
+
+  template <typename ValueType, class SizeType>
+  class queue_base_copyable_and_movable
+  {
+  public:
+    typedef ValueType value_type;
+    typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~queue_base_copyable_and_movable() {};
+
+
+    // Observers
+    virtual bool empty() const = 0;
+    virtual bool full() const = 0;
+    virtual size_type size() const = 0;
+    virtual bool closed() const = 0;
+
+    // Modifiers
+    virtual void close() = 0;
+
+    virtual void push(const value_type& x) = 0;
+
+    virtual void pull(value_type&) = 0;
+    // enable_if is_nothrow_copy_movable<value_type>
+    virtual value_type pull() = 0;
+
+    virtual queue_op_status try_push(const value_type& x) = 0;
+    virtual queue_op_status try_pull(value_type&) = 0;
+
+    virtual queue_op_status nonblocking_push(const value_type& x) = 0;
+    virtual queue_op_status nonblocking_pull(value_type&) = 0;
+
+    virtual queue_op_status wait_push(const value_type& x) = 0;
+    virtual queue_op_status wait_pull(value_type& elem) = 0;
+
+    virtual void push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+    virtual queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) = 0;
+  };
+
+  template <class T, class ST,
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+#if defined __GNUC__ && ! defined __clang__
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // __GNUC__
+#elif defined _MSC_VER
+#if _MSC_VER < 1700
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = true
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif // _MSC_VER
+#else
+          bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
+          bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
+#endif
+#else
+          bool Copyable = is_copy_constructible<T>::value,
+          bool Movable = has_move_emulation_enabled<T>::value
+#endif
+      >
+  struct queue_base;
+
+  template <class T, class ST>
+  struct queue_base<T, ST, true, true> {
+    typedef queue_base_copyable_and_movable<T, ST> type;
+  };
+  template <class T, class ST>
+  struct queue_base<T, ST, true, false> {
+    typedef queue_base_copyable_only<T, ST> type;
+  };
+  template <class T, class ST>
+  struct queue_base<T, ST, false, true> {
+    typedef queue_base_movable_only<T, ST> type;
+  };
+
+}
+
+  template <typename ValueType, class SizeType=std::size_t>
+  class queue_base :
+    public detail::queue_base<ValueType, SizeType>::type
+  {
+  public:
+      typedef ValueType value_type;
+      typedef SizeType size_type;
+    // Constructors/Assignment/Destructors
+    virtual ~queue_base() {};
+  };
+
+}
+using concurrent::queue_base;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_op_status.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,46 @@
+#ifndef BOOST_THREAD_QUEUE_OP_STATUS_HPP
+#define BOOST_THREAD_QUEUE_OP_STATUS_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(queue_op_status)
+  { success = 0, empty, full, closed, busy, timeout, not_ready }
+  BOOST_SCOPED_ENUM_DECLARE_END(queue_op_status)
+
+  struct sync_queue_is_closed : std::exception
+  {
+  };
+
+}
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  struct no_block_tag{};
+  BOOST_CONSTEXPR_OR_CONST no_block_tag no_block = {};
+#endif
+
+  using concurrent::queue_op_status;
+  using concurrent::sync_queue_is_closed;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/queue_views.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,155 @@
+#ifndef BOOST_THREAD_QUEUE_VIEWS_HPP
+#define BOOST_THREAD_QUEUE_VIEWS_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/concurrent_queues/queue_base.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+
+  template <typename Queue>
+  class queue_back_view
+  {
+   Queue* queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    queue_back_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {}
+
+    // Observers
+    bool empty() const  { return queue->empty(); }
+    bool full() const { return queue->full(); }
+    size_type size() const { return queue->size(); }
+    bool closed() const { return queue->closed(); }
+
+    // Modifiers
+    void close() { queue->close(); }
+
+    void push(const value_type& x) { queue->push(x); }
+
+    queue_op_status try_push(const value_type& x) { return queue->try_push(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push(x); }
+    queue_op_status wait_push(const value_type& x) { return queue->wait_push(x); }
+
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push(boost::move(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push(boost::move(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push(boost::move(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push(boost::move(x)); }
+  };
+
+  template <typename Queue>
+  class queue_front_view
+  {
+   Queue* queue;
+  public:
+    typedef typename Queue::value_type value_type;
+    typedef typename Queue::size_type size_type;
+
+    // Constructors/Assignment/Destructors
+    queue_front_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {}
+
+    // Observers
+    bool empty() const  { return queue->empty(); }
+    bool full() const { return queue->full(); }
+    size_type size() const { return queue->size(); }
+    bool closed() const { return queue->closed(); }
+
+    // Modifiers
+    void close() { queue->close(); }
+
+    void push(const value_type& x) { queue->push_front(x); }
+
+    void pull(value_type& x) { queue->pull(x); };
+    // enable_if is_nothrow_copy_movable<value_type>
+    value_type pull()  { return queue->pull(); }
+
+    queue_op_status try_push(const value_type& x) { return queue->try_push_front(x); }
+
+    queue_op_status try_pull(value_type& x) { return queue->try_pull(x); }
+
+    queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push_front(x); }
+
+    queue_op_status nonblocking_pull(value_type& x) { return queue->nonblocking_pull(x); }
+
+    queue_op_status wait_push(const value_type& x) { return queue->wait_push_front(x); }
+    queue_op_status wait_pull(value_type& x) { return queue->wait_pull(x); }
+    void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push_front(forward<value_type>(x)); }
+    queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push_front(forward<value_type>(x)); }
+    queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push_front(forward<value_type>(x)); }
+    queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push_front(forward<value_type>(x)); }
+
+  };
+
+#if ! defined BOOST_NO_CXX11_TEMPLATE_ALIASES
+
+  template <class T>
+  using queue_back = queue_back_view<queue_base<T> > ;
+  template <class T>
+  using queue_front = queue_front_view<queue_base<T> > ;
+
+#else
+
+  template <class T>
+  struct queue_back : queue_back_view<queue_base<T> >
+  {
+    typedef queue_back_view<queue_base<T> > base_type;
+    queue_back(queue_base<T>& q) BOOST_NOEXCEPT : base_type(q) {}
+  };
+  template <class T>
+  struct queue_front : queue_front_view<queue_base<T> >
+  {
+    typedef queue_front_view<queue_base<T> > base_type;
+    queue_front(queue_base<T>& q) BOOST_NOEXCEPT : base_type(q) {}
+
+  };
+
+#endif
+
+//  template <class Queue>
+//  queue_back_view<Queue> back(Queue & q) { return queue_back_view<Queue>(q); }
+//  template <class Queue>
+//  queue_front_view<Queue> front(Queue & q) { return queue_front_view<Queue>(q); }
+//#if 0
+//  template <class T>
+//  queue_back<T> back(queue_base<T> & q) { return queue_back<T>(q); }
+//  template <class T>
+//  queue_front<T> front(queue_base<T> & q) { return queue_front<T>(q); }
+//#else
+//  template <class T>
+//  typename queue_back<T>::type back(queue_base<T> & q) { return typename queue_back<T>::type(q); }
+//  template <class T>
+//  typename queue_front<T>::type front(queue_base<T> & q) { return typename queue_front<T>::type(q); }
+//#endif
+}
+
+using concurrent::queue_back_view;
+using concurrent::queue_front_view;
+using concurrent::queue_back;
+using concurrent::queue_front;
+//using concurrent::back;
+//using concurrent::front;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_bounded_queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,725 @@
+#ifndef BOOST_THREAD_CONCURRENT_QUEUES_SYNC_BOUNDED_QUEUE_HPP
+#define BOOST_THREAD_CONCURRENT_QUEUES_SYNC_BOUNDED_QUEUE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
+#endif
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+  template <typename ValueType>
+  class sync_bounded_queue
+  {
+  public:
+    typedef ValueType value_type;
+    typedef std::size_t size_type;
+
+    // Constructors/Assignment/Destructors
+    BOOST_THREAD_NO_COPYABLE(sync_bounded_queue)
+    explicit sync_bounded_queue(size_type max_elems);
+    template <typename Range>
+    sync_bounded_queue(size_type max_elems, Range range);
+    ~sync_bounded_queue();
+
+    // Observers
+    inline bool empty() const;
+    inline bool full() const;
+    inline size_type capacity() const;
+    inline size_type size() const;
+    inline bool closed() const;
+
+    // Modifiers
+    inline void close();
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+    inline void push(const value_type& x);
+    inline void push(BOOST_THREAD_RV_REF(value_type) x);
+    inline bool try_push(const value_type& x);
+    inline bool try_push(BOOST_THREAD_RV_REF(value_type) x);
+    inline bool try_push(no_block_tag, const value_type& x);
+    inline bool try_push(no_block_tag, BOOST_THREAD_RV_REF(value_type) x);
+#endif
+    inline void push_back(const value_type& x);
+    inline void push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status try_push_back(const value_type& x);
+    inline queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status nonblocking_push_back(const value_type& x);
+    inline queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status wait_push_back(const value_type& x);
+    inline queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x);
+
+    // Observers/Modifiers
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+    inline void pull(value_type&);
+    // enable_if is_nothrow_copy_movable<value_type>
+    inline value_type pull();
+    inline shared_ptr<ValueType> ptr_pull();
+    inline bool try_pull(value_type&);
+    inline bool try_pull(no_block_tag,value_type&);
+    inline shared_ptr<ValueType> try_pull();
+#endif
+    inline void pull_front(value_type&);
+    // enable_if is_nothrow_copy_movable<value_type>
+    inline value_type pull_front();
+    inline queue_op_status try_pull_front(value_type&);
+    inline queue_op_status nonblocking_pull_front(value_type&);
+
+    inline queue_op_status wait_pull_front(ValueType& elem);
+
+  private:
+    mutable mutex mtx_;
+    condition_variable not_empty_;
+    condition_variable not_full_;
+    size_type waiting_full_;
+    size_type waiting_empty_;
+    value_type* data_;
+    size_type in_;
+    size_type out_;
+    size_type capacity_;
+    bool closed_;
+
+    inline size_type inc(size_type idx) const BOOST_NOEXCEPT
+    {
+      return (idx + 1) % capacity_;
+    }
+
+    inline bool empty(unique_lock<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return in_ == out_;
+    }
+    inline bool empty(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return in_ == out_;
+    }
+    inline bool full(unique_lock<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return (inc(in_) == out_);
+    }
+    inline bool full(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return (inc(in_) == out_);
+    }
+    inline size_type capacity(lock_guard<mutex>& ) const BOOST_NOEXCEPT
+    {
+      return capacity_-1;
+    }
+    inline size_type size(lock_guard<mutex>& lk) const BOOST_NOEXCEPT
+    {
+      if (full(lk)) return capacity(lk);
+      return ((out_+capacity(lk)-in_) % capacity(lk));
+    }
+
+    inline void throw_if_closed(unique_lock<mutex>&);
+    inline bool closed(unique_lock<mutex>&) const;
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+    inline bool try_pull(value_type& x, unique_lock<mutex>& lk);
+    inline shared_ptr<value_type> try_pull(unique_lock<mutex>& lk);
+    inline bool try_push(const value_type& x, unique_lock<mutex>& lk);
+    inline bool try_push(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+#endif
+    inline queue_op_status try_pull_front(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push_back(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+
+    inline queue_op_status wait_pull_front(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push_back(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+
+    inline void wait_until_not_empty(unique_lock<mutex>& lk);
+    inline void wait_until_not_empty(unique_lock<mutex>& lk, bool&);
+    inline size_type wait_until_not_full(unique_lock<mutex>& lk);
+    inline size_type wait_until_not_full(unique_lock<mutex>& lk, bool&);
+
+
+    inline void notify_not_empty_if_needed(unique_lock<mutex>& lk)
+    {
+      if (waiting_empty_ > 0)
+      {
+        --waiting_empty_;
+        lk.unlock();
+        not_empty_.notify_one();
+      }
+    }
+    inline void notify_not_full_if_needed(unique_lock<mutex>& lk)
+    {
+      if (waiting_full_ > 0)
+      {
+        --waiting_full_;
+        lk.unlock();
+        not_full_.notify_one();
+      }
+    }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+    inline void pull(value_type& elem, unique_lock<mutex>& lk)
+    {
+      elem = boost::move(data_[out_]);
+      out_ = inc(out_);
+      notify_not_full_if_needed(lk);
+    }
+    inline value_type pull(unique_lock<mutex>& lk)
+    {
+      value_type elem = boost::move(data_[out_]);
+      out_ = inc(out_);
+      notify_not_full_if_needed(lk);
+      return boost::move(elem);
+    }
+    inline boost::shared_ptr<value_type> ptr_pull(unique_lock<mutex>& lk)
+    {
+      shared_ptr<value_type> res = make_shared<value_type>(boost::move(data_[out_]));
+      out_ = inc(out_);
+      notify_not_full_if_needed(lk);
+      return res;
+    }
+#endif
+    inline void pull_front(value_type& elem, unique_lock<mutex>& lk)
+    {
+      elem = boost::move(data_[out_]);
+      out_ = inc(out_);
+      notify_not_full_if_needed(lk);
+    }
+    inline value_type pull_front(unique_lock<mutex>& lk)
+    {
+      value_type elem = boost::move(data_[out_]);
+      out_ = inc(out_);
+      notify_not_full_if_needed(lk);
+      return boost::move(elem);
+    }
+
+    inline void set_in(size_type in, unique_lock<mutex>& lk)
+    {
+      in_ = in;
+      notify_not_empty_if_needed(lk);
+    }
+
+    inline void push_at(const value_type& elem, size_type in_p_1, unique_lock<mutex>& lk)
+    {
+      data_[in_] = elem;
+      set_in(in_p_1, lk);
+    }
+
+    inline void push_at(BOOST_THREAD_RV_REF(value_type) elem, size_type in_p_1, unique_lock<mutex>& lk)
+    {
+      data_[in_] = boost::move(elem);
+      set_in(in_p_1, lk);
+    }
+  };
+
+  template <typename ValueType>
+  sync_bounded_queue<ValueType>::sync_bounded_queue(typename sync_bounded_queue<ValueType>::size_type max_elems) :
+    waiting_full_(0), waiting_empty_(0), data_(new value_type[max_elems + 1]), in_(0), out_(0), capacity_(max_elems + 1),
+        closed_(false)
+  {
+    BOOST_ASSERT_MSG(max_elems >= 1, "number of elements must be > 1");
+  }
+
+//  template <typename ValueType>
+//  template <typename Range>
+//  sync_bounded_queue<ValueType>::sync_bounded_queue(size_type max_elems, Range range) :
+//    waiting_full_(0), waiting_empty_(0), data_(new value_type[max_elems + 1]), in_(0), out_(0), capacity_(max_elems + 1),
+//        closed_(false)
+//  {
+//    BOOST_ASSERT_MSG(max_elems >= 1, "number of elements must be > 1");
+//    BOOST_ASSERT_MSG(max_elems == size(range), "number of elements must match range's size");
+//    try
+//    {
+//      typedef typename Range::iterator iterator_t;
+//      iterator_t first = boost::begin(range);
+//      iterator_t end = boost::end(range);
+//      size_type in = 0;
+//      for (iterator_t cur = first; cur != end; ++cur, ++in)
+//      {
+//        data_[in] = *cur;
+//      }
+//      set_in(in);
+//    }
+//    catch (...)
+//    {
+//      delete[] data_;
+//    }
+//  }
+
+  template <typename ValueType>
+  sync_bounded_queue<ValueType>::~sync_bounded_queue()
+  {
+    delete[] data_;
+  }
+
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::close()
+  {
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;
+    }
+    not_empty_.notify_all();
+    not_full_.notify_all();
+  }
+
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::closed() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return closed_;
+  }
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::closed(unique_lock<mutex>& ) const
+  {
+    return closed_;
+  }
+
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::empty() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return empty(lk);
+  }
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::full() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return full(lk);
+  }
+
+  template <typename ValueType>
+  typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::capacity() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return capacity(lk);
+  }
+
+  template <typename ValueType>
+  typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::size() const
+  {
+    lock_guard<mutex> lk(mtx_);
+    return size(lk);
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_pull(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (empty(lk))
+    {
+      throw_if_closed(lk);
+      return false;
+    }
+    pull(elem, lk);
+    return true;
+  }
+  template <typename ValueType>
+  shared_ptr<ValueType> sync_bounded_queue<ValueType>::try_pull(unique_lock<mutex>& lk)
+  {
+    if (empty(lk))
+    {
+      throw_if_closed(lk);
+      return shared_ptr<ValueType>();
+    }
+    return ptr_pull(lk);
+  }
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_pull(ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_pull(elem, lk);
+  }
+#endif
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_pull_front(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (empty(lk))
+    {
+      if (closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    pull_front(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_pull_front(ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_pull_front(elem, lk);
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_pull(no_block_tag,ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_, try_to_lock);
+      if (!lk.owns_lock())
+      {
+        return false;
+      }
+      return try_pull(elem, lk);
+  }
+  template <typename ValueType>
+  boost::shared_ptr<ValueType> sync_bounded_queue<ValueType>::try_pull()
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_pull(lk);
+  }
+#endif
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::nonblocking_pull_front(ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_, try_to_lock);
+      if (!lk.owns_lock())
+      {
+        return queue_op_status::busy;
+      }
+      return try_pull_front(elem, lk);
+  }
+
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::throw_if_closed(unique_lock<mutex>&)
+  {
+    if (closed_)
+    {
+      BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+    }
+  }
+
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::wait_until_not_empty(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (out_ != in_) break;
+      throw_if_closed(lk);
+      ++waiting_empty_;
+      not_empty_.wait(lk);
+    }
+  }
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::wait_until_not_empty(unique_lock<mutex>& lk, bool & closed)
+  {
+    for (;;)
+    {
+      if (out_ != in_) break;
+      if (closed_) {closed=true; return;}
+      ++waiting_empty_;
+      not_empty_.wait(lk);
+    }
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::pull(ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      wait_until_not_empty(lk);
+      pull(elem, lk);
+  }
+//  template <typename ValueType>
+//  void sync_bounded_queue<ValueType>::pull(ValueType& elem, bool & closed)
+//  {
+//      unique_lock<mutex> lk(mtx_);
+//      wait_until_not_empty(lk, closed);
+//      if (closed) {return;}
+//      pull(elem, lk);
+//  }
+
+  // enable if ValueType is nothrow movable
+  template <typename ValueType>
+  ValueType sync_bounded_queue<ValueType>::pull()
+  {
+      unique_lock<mutex> lk(mtx_);
+      wait_until_not_empty(lk);
+      return pull(lk);
+  }
+  template <typename ValueType>
+  boost::shared_ptr<ValueType> sync_bounded_queue<ValueType>::ptr_pull()
+  {
+      unique_lock<mutex> lk(mtx_);
+      wait_until_not_empty(lk);
+      return ptr_pull(lk);
+  }
+
+#endif
+
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::pull_front(ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      wait_until_not_empty(lk);
+      pull_front(elem, lk);
+  }
+
+  // enable if ValueType is nothrow movable
+  template <typename ValueType>
+  ValueType sync_bounded_queue<ValueType>::pull_front()
+  {
+      unique_lock<mutex> lk(mtx_);
+      wait_until_not_empty(lk);
+      return pull_front(lk);
+  }
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_pull_front(ValueType& elem, unique_lock<mutex>& lk)
+  {
+      if (empty(lk) && closed(lk)) {return queue_op_status::closed;}
+      wait_until_not_empty(lk);
+      pull_front(elem, lk);
+      return queue_op_status::success;
+  }
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_pull_front(ValueType& elem)
+  {
+    unique_lock<mutex> lk(mtx_);
+    return wait_pull_front(elem, lk);
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    throw_if_closed(lk);
+    size_type in_p_1 = inc(in_);
+    if (in_p_1 == out_)  // full()
+    {
+      return false;
+    }
+    push_at(elem, in_p_1, lk);
+    return true;
+  }
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(const ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_push(elem, lk);
+  }
+
+#endif
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_push_back(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (closed(lk)) return queue_op_status::closed;
+    size_type in_p_1 = inc(in_);
+    if (in_p_1 == out_)  // full()
+    {
+      return queue_op_status::full;
+    }
+    push_at(elem, in_p_1, lk);
+    return queue_op_status::success;
+  }
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(mtx_);
+    return try_push_back(elem, lk);
+  }
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_push_back(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (closed(lk)) return queue_op_status::closed;
+    push_at(elem, wait_until_not_full(lk), lk);
+    return queue_op_status::success;
+  }
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(mtx_);
+    return wait_push_back(elem, lk);
+  }
+
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(no_block_tag, const ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_, try_to_lock);
+      if (!lk.owns_lock()) return false;
+      return try_push(elem, lk);
+  }
+#endif
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::nonblocking_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(mtx_, try_to_lock);
+    if (!lk.owns_lock()) return queue_op_status::busy;
+    return try_push_back(elem, lk);
+  }
+
+  template <typename ValueType>
+  typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::wait_until_not_full(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      throw_if_closed(lk);
+      size_type in_p_1 = inc(in_);
+      if (in_p_1 != out_) // ! full()
+      {
+        return in_p_1;
+      }
+      ++waiting_full_;
+      not_full_.wait(lk);
+    }
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::push(const ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      push_at(elem, wait_until_not_full(lk), lk);
+  }
+#endif
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::push_back(const ValueType& elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      push_at(elem, wait_until_not_full(lk), lk);
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    throw_if_closed(lk);
+    size_type in_p_1 = inc(in_);
+    if (in_p_1 == out_) // full()
+    {
+      return false;
+    }
+    push_at(boost::move(elem), in_p_1, lk);
+    return true;
+  }
+
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_push(boost::move(elem), lk);
+  }
+#endif
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_push_back(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (closed(lk)) return queue_op_status::closed;
+    size_type in_p_1 = inc(in_);
+    if (in_p_1 == out_) // full()
+    {
+      return queue_op_status::full;
+    }
+    push_at(boost::move(elem), in_p_1, lk);
+    return queue_op_status::success;
+  }
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::try_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_push_back(boost::move(elem), lk);
+  }
+
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_push_back(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (closed(lk)) return queue_op_status::closed;
+    push_at(boost::move(elem), wait_until_not_full(lk), lk);
+    return queue_op_status::success;
+  }
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::wait_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      return try_push_back(boost::move(elem), lk);
+  }
+
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  bool sync_bounded_queue<ValueType>::try_push(no_block_tag, BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_, try_to_lock);
+      if (!lk.owns_lock())
+      {
+        return false;
+      }
+      return try_push(boost::move(elem), lk);
+  }
+#endif
+  template <typename ValueType>
+  queue_op_status sync_bounded_queue<ValueType>::nonblocking_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_, try_to_lock);
+      if (!lk.owns_lock())
+      {
+        return queue_op_status::busy;
+      }
+      return try_push_back(boost::move(elem), lk);
+  }
+
+#ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      push_at(boost::move(elem), wait_until_not_full(lk), lk);
+  }
+#endif
+  template <typename ValueType>
+  void sync_bounded_queue<ValueType>::push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(mtx_);
+      push_at(boost::move(elem), wait_until_not_full(lk), lk);
+  }
+
+  template <typename ValueType>
+  sync_bounded_queue<ValueType>& operator<<(sync_bounded_queue<ValueType>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    sbq.push_back(boost::move(elem));
+    return sbq;
+  }
+
+  template <typename ValueType>
+  sync_bounded_queue<ValueType>& operator<<(sync_bounded_queue<ValueType>& sbq, ValueType const&elem)
+  {
+    sbq.push_back(elem);
+    return sbq;
+  }
+
+  template <typename ValueType>
+  sync_bounded_queue<ValueType>& operator>>(sync_bounded_queue<ValueType>& sbq, ValueType &elem)
+  {
+    sbq.pull_front(elem);
+    return sbq;
+  }
+}
+using concurrent::sync_bounded_queue;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_deque.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,327 @@
+#ifndef BOOST_THREAD_CONCURRENT_QUEUES_SYNC_DEQUE_HPP
+#define BOOST_THREAD_CONCURRENT_QUEUES_SYNC_DEQUE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/concurrent_queues/detail/sync_queue_base.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/csbl/devector.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <boost/throw_exception.hpp>
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+  template <class ValueType, class Container = csbl::devector<ValueType> >
+  class sync_deque
+    : public detail::sync_queue_base<ValueType, Container >
+  {
+    typedef detail::sync_queue_base<ValueType, Container >  super;
+
+  public:
+    typedef ValueType value_type;
+    //typedef typename super::value_type value_type; // fixme
+    typedef typename super::underlying_queue_type underlying_queue_type;
+    typedef typename super::size_type size_type;
+    typedef typename super::op_status op_status;
+
+    // Constructors/Assignment/Destructors
+    BOOST_THREAD_NO_COPYABLE(sync_deque)
+    inline sync_deque();
+    //template <typename Range>
+    //inline explicit sync_deque(Range range);
+    inline ~sync_deque();
+
+    // Modifiers
+    inline void push_back(const value_type& x);
+    inline queue_op_status try_push_back(const value_type& x);
+    inline queue_op_status nonblocking_push_back(const value_type& x);
+    inline queue_op_status wait_push_back(const value_type& x);
+    inline void push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x);
+
+    // Observers/Modifiers
+    inline void pull_front(value_type&);
+    // enable_if is_nothrow_copy_movable<value_type>
+    inline value_type pull_front();
+
+    inline queue_op_status try_pull_front(value_type&);
+    inline queue_op_status nonblocking_pull_front(value_type&);
+    inline queue_op_status wait_pull_front(ValueType& elem);
+
+  private:
+
+    inline queue_op_status try_pull_front(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_pull_front(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push_back(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push_back(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+
+    inline void pull_front(value_type& elem, unique_lock<mutex>& )
+    {
+      elem = boost::move(super::data_.front());
+      super::data_.pop_front();
+    }
+    inline value_type pull_front(unique_lock<mutex>& )
+    {
+      value_type e = boost::move(super::data_.front());
+      super::data_.pop_front();
+      return boost::move(e);
+    }
+
+    inline void push_back(const value_type& elem, unique_lock<mutex>& lk)
+    {
+      super::data_.push_back(elem);
+      super::notify_not_empty_if_needed(lk);
+    }
+
+    inline void push_back(BOOST_THREAD_RV_REF(value_type) elem, unique_lock<mutex>& lk)
+    {
+      super::data_.push_back(boost::move(elem));
+      super::notify_not_empty_if_needed(lk);
+    }
+  };
+
+  template <class ValueType, class Container>
+  sync_deque<ValueType, Container>::sync_deque() :
+    super()
+  {
+  }
+
+//  template <class ValueType, class Container>
+//  template <class Range>
+//  explicit sync_deque<ValueType, Container>::sync_deque(Range range) :
+//    data_(), closed_(false)
+//  {
+//    try
+//    {
+//      typedef typename Range::iterator iterator_t;
+//      iterator_t first = boost::begin(range);
+//      iterator_t end = boost::end(range);
+//      for (iterator_t cur = first; cur != end; ++cur)
+//      {
+//        data_.push(boost::move(*cur));;
+//      }
+//      notify_not_empty_if_needed(lk);
+//    }
+//    catch (...)
+//    {
+//      delete[] data_;
+//    }
+//  }
+
+  template <class ValueType, class Container>
+  sync_deque<ValueType, Container>::~sync_deque()
+  {
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_pull_front(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    pull_front(elem, lk);
+    return queue_op_status::success;
+  }
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_pull_front(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+    }
+    bool has_been_closed = super::wait_until_not_empty_or_closed(lk);
+    if (has_been_closed) return queue_op_status::closed;
+    pull_front(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_pull_front(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_pull_front(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_pull_front(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_pull_front(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::nonblocking_pull_front(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock())
+    {
+      return queue_op_status::busy;
+    }
+    return try_pull_front(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_deque<ValueType, Container>::pull_front(ValueType& elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::wait_until_not_empty(lk);
+      pull_front(elem, lk);
+  }
+
+  // enable if ValueType is nothrow movable
+  template <class ValueType, class Container>
+  ValueType sync_deque<ValueType, Container>::pull_front()
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::wait_until_not_empty(lk);
+      return pull_front(lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_push_back(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push_back(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_push_back(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_push_back(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push_back(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_push_back(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::nonblocking_push_back(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock()) return queue_op_status::busy;
+    return try_push_back(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_deque<ValueType, Container>::push_back(const ValueType& elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::throw_if_closed(lk);
+      push_back(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_push_back(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push_back(boost::move(elem), lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::try_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_push_back(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_push_back(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push_back(boost::move(elem), lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::wait_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_push_back(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_deque<ValueType, Container>::nonblocking_push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock())
+    {
+      return queue_op_status::busy;
+    }
+    return try_push_back(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_deque<ValueType, Container>::push_back(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::throw_if_closed(lk);
+      push_back(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  sync_deque<ValueType, Container>& operator<<(sync_deque<ValueType, Container>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    sbq.push_back(boost::move(elem));
+    return sbq;
+  }
+
+  template <class ValueType, class Container>
+  sync_deque<ValueType, Container>& operator<<(sync_deque<ValueType, Container>& sbq, ValueType const&elem)
+  {
+    sbq.push_back(elem);
+    return sbq;
+  }
+
+  template <class ValueType, class Container>
+  sync_deque<ValueType, Container>& operator>>(sync_deque<ValueType, Container>& sbq, ValueType &elem)
+  {
+    sbq.pull_front(elem);
+    return sbq;
+  }
+
+}
+using concurrent::sync_deque;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_priority_queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,369 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_SYNC_PRIORITY_QUEUE
+#define BOOST_THREAD_SYNC_PRIORITY_QUEUE
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/concurrent_queues/detail/sync_queue_base.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/csbl/vector.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <boost/atomic.hpp>
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/time_point.hpp>
+
+#include <exception>
+#include <queue>
+#include <utility>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace detail {
+
+  template <
+    class Type,
+    class Container = csbl::vector<Type>,
+    class Compare = std::less<Type>
+  >
+  class priority_queue
+  {
+  private:
+      Container _elements;
+      Compare _compare;
+  public:
+      typedef Type value_type;
+      typedef typename Container::size_type size_type;
+
+      explicit priority_queue(const Compare& compare = Compare())
+          : _elements(), _compare(compare)
+      { }
+
+      size_type size() const
+      {
+          return _elements.size();
+      }
+
+      bool empty() const
+      {
+          return _elements.empty();
+      }
+
+      void push(Type const& element)
+      {
+          _elements.push_back(element);
+          std::push_heap(_elements.begin(), _elements.end(), _compare);
+      }
+      void push(BOOST_RV_REF(Type) element)
+      {
+          _elements.push_back(boost::move(element));
+          std::push_heap(_elements.begin(), _elements.end(), _compare);
+      }
+
+      void pop()
+      {
+          std::pop_heap(_elements.begin(), _elements.end(), _compare);
+          _elements.pop_back();
+      }
+      Type pull()
+      {
+          Type result = boost::move(_elements.front());
+          pop();
+          return boost::move(result);
+      }
+
+      Type const& top()
+      {
+          return _elements.front();
+      }
+  };
+}
+
+namespace concurrent
+{
+  template <class ValueType,
+            class Container = csbl::vector<ValueType>,
+            class Compare = std::less<typename Container::value_type> >
+  class sync_priority_queue
+    : public detail::sync_queue_base<ValueType, boost::detail::priority_queue<ValueType,Container,Compare> >
+  {
+    typedef detail::sync_queue_base<ValueType, boost::detail::priority_queue<ValueType,Container,Compare> >  super;
+
+  public:
+    typedef ValueType value_type;
+    //typedef typename super::value_type value_type; // fixme
+    typedef typename super::underlying_queue_type underlying_queue_type;
+    typedef typename super::size_type size_type;
+    typedef typename super::op_status op_status;
+
+    typedef chrono::steady_clock clock;
+  protected:
+
+  public:
+    sync_priority_queue() {}
+
+    ~sync_priority_queue()
+    {
+      if(!super::closed())
+      {
+        super::close();
+      }
+    }
+
+    void push(const ValueType& elem);
+    void push(BOOST_THREAD_RV_REF(ValueType) elem);
+
+    queue_op_status try_push(const ValueType& elem);
+    queue_op_status try_push(BOOST_THREAD_RV_REF(ValueType) elem);
+
+    ValueType pull();
+
+    void pull(ValueType&);
+
+    queue_op_status pull_until(const clock::time_point&, ValueType&);
+    queue_op_status pull_for(const clock::duration&, ValueType&);
+
+    queue_op_status try_pull(ValueType& elem);
+    queue_op_status wait_pull(ValueType& elem);
+    queue_op_status nonblocking_pull(ValueType&);
+
+  private:
+    void push(unique_lock<mutex>&, const ValueType& elem);
+    void push(lock_guard<mutex>&, const ValueType& elem);
+    void push(unique_lock<mutex>&, BOOST_THREAD_RV_REF(ValueType) elem);
+    void push(lock_guard<mutex>&, BOOST_THREAD_RV_REF(ValueType) elem);
+
+    queue_op_status try_push(unique_lock<mutex>&, const ValueType& elem);
+    queue_op_status try_push(unique_lock<mutex>&, BOOST_THREAD_RV_REF(ValueType) elem);
+
+    ValueType pull(unique_lock<mutex>&);
+    ValueType pull(lock_guard<mutex>&);
+
+    void pull(unique_lock<mutex>&, ValueType&);
+    void pull(lock_guard<mutex>&, ValueType&);
+
+    queue_op_status try_pull(lock_guard<mutex>& lk, ValueType& elem);
+    queue_op_status try_pull(unique_lock<mutex>& lk, ValueType& elem);
+
+    queue_op_status wait_pull(unique_lock<mutex>& lk, ValueType& elem);
+
+    queue_op_status nonblocking_pull(unique_lock<mutex>& lk, ValueType&);
+
+    sync_priority_queue(const sync_priority_queue&);
+    sync_priority_queue& operator= (const sync_priority_queue&);
+    sync_priority_queue(BOOST_THREAD_RV_REF(sync_priority_queue));
+    sync_priority_queue& operator= (BOOST_THREAD_RV_REF(sync_priority_queue));
+  }; //end class
+
+
+  //////////////////////
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(unique_lock<mutex>& lk, const T& elem)
+  {
+    super::throw_if_closed(lk);
+    super::data_.push(elem);
+    super::notify_not_empty_if_needed(lk);
+  }
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(lock_guard<mutex>& lk, const T& elem)
+  {
+    super::throw_if_closed(lk);
+    super::data_.push(elem);
+    super::notify_not_empty_if_needed(lk);
+  }
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(const T& elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    push(lk, elem);
+  }
+
+  //////////////////////
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(unique_lock<mutex>& lk, BOOST_THREAD_RV_REF(T) elem)
+  {
+    super::throw_if_closed(lk);
+    super::data_.push(boost::move(elem));
+    super::notify_not_empty_if_needed(lk);
+  }
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(lock_guard<mutex>& lk, BOOST_THREAD_RV_REF(T) elem)
+  {
+    super::throw_if_closed(lk);
+    super::data_.push(boost::move(elem));
+    super::notify_not_empty_if_needed(lk);
+  }
+  template <class T, class Container,class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::push(BOOST_THREAD_RV_REF(T) elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    push(lk, boost::move(elem));
+  }
+
+  //////////////////////
+  template <class T, class Container,class Cmp>
+  queue_op_status sync_priority_queue<T,Container,Cmp>::try_push(const T& elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(lk, elem);
+    return queue_op_status::success;
+  }
+
+  //////////////////////
+  template <class T, class Container,class Cmp>
+  queue_op_status sync_priority_queue<T,Container,Cmp>::try_push(BOOST_THREAD_RV_REF(T) elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(lk, boost::move(elem));
+
+    return queue_op_status::success;
+  }
+
+  //////////////////////
+  template <class T,class Container, class Cmp>
+  T sync_priority_queue<T,Container,Cmp>::pull(unique_lock<mutex>&)
+  {
+    return super::data_.pull();
+  }
+  template <class T,class Container, class Cmp>
+  T sync_priority_queue<T,Container,Cmp>::pull(lock_guard<mutex>&)
+  {
+    return super::data_.pull();
+  }
+
+  template <class T,class Container, class Cmp>
+  T sync_priority_queue<T,Container,Cmp>::pull()
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    super::wait_until_not_empty(lk);
+    return pull(lk);
+  }
+
+  //////////////////////
+  template <class T,class Container, class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::pull(unique_lock<mutex>&, T& elem)
+  {
+    elem = super::data_.pull();
+  }
+  template <class T,class Container, class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::pull(lock_guard<mutex>&, T& elem)
+  {
+    elem = super::data_.pull();
+  }
+
+  template <class T,class Container, class Cmp>
+  void sync_priority_queue<T,Container,Cmp>::pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    super::wait_until_not_empty(lk);
+    pull(lk, elem);
+  }
+
+  //////////////////////
+  template <class T, class Cont,class Cmp>
+  queue_op_status
+  sync_priority_queue<T,Cont,Cmp>::pull_until(const clock::time_point& tp, T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    if (queue_op_status::timeout == super::wait_until_not_empty_until(lk, tp))
+      return queue_op_status::timeout;
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  //////////////////////
+  template <class T, class Cont,class Cmp>
+  queue_op_status
+  sync_priority_queue<T,Cont,Cmp>::pull_for(const clock::duration& dura, T& elem)
+  {
+    return pull_until(clock::now() + dura, elem);
+  }
+
+  //////////////////////
+  template <class T, class Container,class Cmp>
+  queue_op_status
+  sync_priority_queue<T,Container,Cmp>::try_pull(unique_lock<mutex>& lk, T& elem)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  template <class T, class Container,class Cmp>
+  queue_op_status
+  sync_priority_queue<T,Container,Cmp>::try_pull(lock_guard<mutex>& lk, T& elem)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  template <class T, class Container,class Cmp>
+  queue_op_status
+  sync_priority_queue<T,Container,Cmp>::try_pull(T& elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    return try_pull(lk, elem);
+  }
+
+  //////////////////////
+  template <class T,class Container, class Cmp>
+  queue_op_status sync_priority_queue<T,Container,Cmp>::wait_pull(unique_lock<mutex>& lk, T& elem)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+    }
+    bool has_been_closed = super::wait_until_not_empty_or_closed(lk);
+    if (has_been_closed) return queue_op_status::closed;
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  template <class T,class Container, class Cmp>
+  queue_op_status sync_priority_queue<T,Container,Cmp>::wait_pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_pull(lk, elem);
+  }
+
+  //////////////////////
+
+  template <class T,class Container, class Cmp>
+  queue_op_status sync_priority_queue<T,Container,Cmp>::nonblocking_pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock()) return queue_op_status::busy;
+    return try_pull(lk, elem);
+  }
+
+
+
+} //end concurrent namespace
+
+using concurrent::sync_priority_queue;
+
+} //end boost namespace
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,328 @@
+#ifndef BOOST_THREAD_CONCURRENT_QUEUES_SYNC_QUEUE_HPP
+#define BOOST_THREAD_CONCURRENT_QUEUES_SYNC_QUEUE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2013-2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/concurrent_queues/detail/sync_queue_base.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/csbl/devector.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <boost/throw_exception.hpp>
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+  template <class ValueType, class Container = csbl::devector<ValueType> >
+  class sync_queue
+    : public detail::sync_queue_base<ValueType, Container >
+  {
+    typedef detail::sync_queue_base<ValueType, Container >  super;
+
+  public:
+    typedef ValueType value_type;
+    //typedef typename super::value_type value_type; // fixme
+    typedef typename super::underlying_queue_type underlying_queue_type;
+    typedef typename super::size_type size_type;
+    typedef typename super::op_status op_status;
+
+    // Constructors/Assignment/Destructors
+    BOOST_THREAD_NO_COPYABLE(sync_queue)
+    inline sync_queue();
+    //template <class Range>
+    //inline explicit sync_queue(Range range);
+    inline ~sync_queue();
+
+    // Modifiers
+
+    inline void push(const value_type& x);
+    inline queue_op_status try_push(const value_type& x);
+    inline queue_op_status nonblocking_push(const value_type& x);
+    inline queue_op_status wait_push(const value_type& x);
+    inline void push(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x);
+    inline queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x);
+
+    // Observers/Modifiers
+    inline void pull(value_type&);
+    // enable_if is_nothrow_copy_movable<value_type>
+    inline value_type pull();
+
+    inline queue_op_status try_pull(value_type&);
+    inline queue_op_status nonblocking_pull(value_type&);
+    inline queue_op_status wait_pull(ValueType& elem);
+
+  private:
+
+    inline queue_op_status try_pull(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_pull(value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push(const value_type& x, unique_lock<mutex>& lk);
+    inline queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+    inline queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
+
+    inline void pull(value_type& elem, unique_lock<mutex>& )
+    {
+      elem = boost::move(super::data_.front());
+      super::data_.pop_front();
+    }
+    inline value_type pull(unique_lock<mutex>& )
+    {
+      value_type e = boost::move(super::data_.front());
+      super::data_.pop_front();
+      return boost::move(e);
+    }
+
+    inline void push(const value_type& elem, unique_lock<mutex>& lk)
+    {
+      super::data_.push_back(elem);
+      super::notify_not_empty_if_needed(lk);
+    }
+
+    inline void push(BOOST_THREAD_RV_REF(value_type) elem, unique_lock<mutex>& lk)
+    {
+      super::data_.push_back(boost::move(elem));
+      super::notify_not_empty_if_needed(lk);
+    }
+  };
+
+  template <class ValueType, class Container>
+  sync_queue<ValueType, Container>::sync_queue() :
+    super()
+  {
+  }
+
+//  template <class ValueType, class Container>
+//  template <class Range>
+//  explicit sync_queue<ValueType, Container>::sync_queue(Range range) :
+//    data_(), closed_(false)
+//  {
+//    try
+//    {
+//      typedef typename Range::iterator iterator_t;
+//      iterator_t first = boost::begin(range);
+//      iterator_t end = boost::end(range);
+//      for (iterator_t cur = first; cur != end; ++cur)
+//      {
+//        data_.push(boost::move(*cur));;
+//      }
+//      notify_not_empty_if_needed(lk);
+//    }
+//    catch (...)
+//    {
+//      delete[] data_;
+//    }
+//  }
+
+  template <class ValueType, class Container>
+  sync_queue<ValueType, Container>::~sync_queue()
+  {
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_pull(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    pull(elem, lk);
+    return queue_op_status::success;
+  }
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_pull(ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+    }
+    bool has_been_closed = super::wait_until_not_empty_or_closed(lk);
+    if (has_been_closed) return queue_op_status::closed;
+    pull(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_pull(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_pull(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_pull(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_pull(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::nonblocking_pull(ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock())
+    {
+      return queue_op_status::busy;
+    }
+    return try_pull(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_queue<ValueType, Container>::pull(ValueType& elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::wait_until_not_empty(lk);
+      pull(elem, lk);
+  }
+
+  // enable if ValueType is nothrow movable
+  template <class ValueType, class Container>
+  ValueType sync_queue<ValueType, Container>::pull()
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::wait_until_not_empty(lk);
+      return pull(lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_push(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_push(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_push(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_push(const ValueType& elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(elem, lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_push(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_push(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::nonblocking_push(const ValueType& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock()) return queue_op_status::busy;
+    return try_push(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_queue<ValueType, Container>::push(const ValueType& elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::throw_if_closed(lk);
+      push(elem, lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_push(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(boost::move(elem), lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::try_push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return try_push(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_push(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
+  {
+    if (super::closed(lk)) return queue_op_status::closed;
+    push(boost::move(elem), lk);
+    return queue_op_status::success;
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::wait_push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_push(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  queue_op_status sync_queue<ValueType, Container>::nonblocking_push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (!lk.owns_lock())
+    {
+      return queue_op_status::busy;
+    }
+    return try_push(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  void sync_queue<ValueType, Container>::push(BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+      unique_lock<mutex> lk(super::mtx_);
+      super::throw_if_closed(lk);
+      push(boost::move(elem), lk);
+  }
+
+  template <class ValueType, class Container>
+  sync_queue<ValueType, Container>& operator<<(sync_queue<ValueType, Container>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
+  {
+    sbq.push(boost::move(elem));
+    return sbq;
+  }
+
+  template <class ValueType, class Container>
+  sync_queue<ValueType, Container>& operator<<(sync_queue<ValueType, Container>& sbq, ValueType const&elem)
+  {
+    sbq.push(elem);
+    return sbq;
+  }
+
+  template <class ValueType, class Container>
+  sync_queue<ValueType, Container>& operator>>(sync_queue<ValueType, Container>& sbq, ValueType &elem)
+  {
+    sbq.pull(elem);
+    return sbq;
+  }
+
+}
+using concurrent::sync_queue;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/concurrent_queues/sync_timed_queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,466 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_SYNC_TIMED_QUEUE_HPP
+#define BOOST_THREAD_SYNC_TIMED_QUEUE_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/concurrent_queues/sync_priority_queue.hpp>
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/time_point.hpp>
+#include <boost/chrono/system_clocks.hpp>
+#include <boost/chrono/chrono_io.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace concurrent
+{
+namespace detail
+{
+  template <class T, class Clock = chrono::steady_clock>
+  struct scheduled_type
+  {
+    typedef T value_type;
+    typedef Clock clock;
+    typedef typename clock::time_point time_point;
+    T data;
+    time_point time;
+
+    BOOST_THREAD_COPYABLE_AND_MOVABLE(scheduled_type)
+
+    scheduled_type(T const& pdata, time_point tp) : data(pdata), time(tp) {}
+    scheduled_type(BOOST_THREAD_RV_REF(T) pdata, time_point tp) : data(boost::move(pdata)), time(tp) {}
+
+    scheduled_type(scheduled_type const& other) : data(other.data), time(other.time) {}
+    scheduled_type& operator=(BOOST_THREAD_COPY_ASSIGN_REF(scheduled_type) other) {
+      data = other.data;
+      time = other.time;
+      return *this;
+    }
+
+    scheduled_type(BOOST_THREAD_RV_REF(scheduled_type) other) : data(boost::move(other.data)), time(other.time) {}
+    scheduled_type& operator=(BOOST_THREAD_RV_REF(scheduled_type) other) {
+      data = boost::move(other.data);
+      time = other.time;
+      return *this;
+    }
+
+    bool time_not_reached() const
+    {
+      return time > clock::now();
+    }
+
+    bool operator <(const scheduled_type<T> other) const
+    {
+      return this->time > other.time;
+    }
+  }; //end struct
+
+} //end detail namespace
+
+  template <class T, class Clock = chrono::steady_clock>
+  class sync_timed_queue
+    : private sync_priority_queue<detail::scheduled_type<T, Clock> >
+  {
+    typedef detail::scheduled_type<T> stype;
+    typedef sync_priority_queue<stype> super;
+  public:
+    typedef T value_type;
+    typedef Clock clock;
+    typedef typename clock::duration duration;
+    typedef typename clock::time_point time_point;
+    typedef typename super::underlying_queue_type underlying_queue_type;
+    typedef typename super::size_type size_type;
+    typedef typename super::op_status op_status;
+
+    sync_timed_queue() : super() {};
+    ~sync_timed_queue() {}
+
+    using super::size;
+    using super::empty;
+    using super::full;
+    using super::close;
+    using super::closed;
+
+    T pull();
+    void pull(T& elem);
+
+    template <class Duration>
+    queue_op_status pull_until(chrono::time_point<clock,Duration> const& tp, T& elem);
+    template <class Rep, class Period>
+    queue_op_status pull_for(chrono::duration<Rep,Period> const& dura, T& elem);
+
+    queue_op_status try_pull(T& elem);
+    queue_op_status wait_pull(T& elem);
+    queue_op_status nonblocking_pull(T& elem);
+
+    template <class Duration>
+    void push(const T& elem, chrono::time_point<clock,Duration> const& tp);
+    template <class Rep, class Period>
+    void push(const T& elem, chrono::duration<Rep,Period> const& dura);
+
+    template <class Duration>
+    void push(BOOST_THREAD_RV_REF(T) elem, chrono::time_point<clock,Duration> const& tp);
+    template <class Rep, class Period>
+    void push(BOOST_THREAD_RV_REF(T) elem, chrono::duration<Rep,Period> const& dura);
+
+    template <class Duration>
+    queue_op_status try_push(const T& elem, chrono::time_point<clock,Duration> const& tp);
+    template <class Rep, class Period>
+    queue_op_status try_push(const T& elem, chrono::duration<Rep,Period> const& dura);
+
+    template <class Duration>
+    queue_op_status try_push(BOOST_THREAD_RV_REF(T) elem, chrono::time_point<clock,Duration> const& tp);
+    template <class Rep, class Period>
+    queue_op_status try_push(BOOST_THREAD_RV_REF(T) elem, chrono::duration<Rep,Period> const& dura);
+
+  private:
+    T pull(unique_lock<mutex>&);
+    T pull(lock_guard<mutex>&);
+
+    void pull(unique_lock<mutex>&, T& elem);
+    void pull(lock_guard<mutex>&, T& elem);
+
+    queue_op_status try_pull(unique_lock<mutex>&, T& elem);
+    queue_op_status try_pull(lock_guard<mutex>&, T& elem);
+
+    queue_op_status wait_pull(unique_lock<mutex>& lk, T& elem);
+
+    bool wait_until_not_empty_time_reached_or_closed(unique_lock<mutex>&);
+    T pull_when_time_reached(unique_lock<mutex>&);
+    template <class Duration>
+    queue_op_status pull_when_time_reached_until(unique_lock<mutex>&, chrono::time_point<clock,Duration> const& tp, T& elem);
+    bool time_not_reached(unique_lock<mutex>&);
+    bool time_not_reached(lock_guard<mutex>&);
+    bool empty_or_time_not_reached(unique_lock<mutex>&);
+    bool empty_or_time_not_reached(lock_guard<mutex>&);
+
+    sync_timed_queue(const sync_timed_queue&);
+    sync_timed_queue& operator=(const sync_timed_queue&);
+    sync_timed_queue(BOOST_THREAD_RV_REF(sync_timed_queue));
+    sync_timed_queue& operator=(BOOST_THREAD_RV_REF(sync_timed_queue));
+  }; //end class
+
+
+  template <class T, class Clock>
+  template <class Duration>
+  void sync_timed_queue<T, Clock>::push(const T& elem, chrono::time_point<clock,Duration> const& tp)
+  {
+    super::push(stype(elem,tp));
+  }
+
+  template <class T, class Clock>
+  template <class Rep, class Period>
+  void sync_timed_queue<T, Clock>::push(const T& elem, chrono::duration<Rep,Period> const& dura)
+  {
+    push(elem, clock::now() + dura);
+  }
+
+  template <class T, class Clock>
+  template <class Duration>
+  void sync_timed_queue<T, Clock>::push(BOOST_THREAD_RV_REF(T) elem, chrono::time_point<clock,Duration> const& tp)
+  {
+    super::push(stype(boost::move(elem),tp));
+  }
+
+  template <class T, class Clock>
+  template <class Rep, class Period>
+  void sync_timed_queue<T, Clock>::push(BOOST_THREAD_RV_REF(T) elem, chrono::duration<Rep,Period> const& dura)
+  {
+    push(boost::move(elem), clock::now() + dura);
+  }
+
+
+
+  template <class T, class Clock>
+  template <class Duration>
+  queue_op_status sync_timed_queue<T, Clock>::try_push(const T& elem, chrono::time_point<clock,Duration> const& tp)
+  {
+    return super::try_push(stype(elem,tp));
+  }
+
+  template <class T, class Clock>
+  template <class Rep, class Period>
+  queue_op_status sync_timed_queue<T, Clock>::try_push(const T& elem, chrono::duration<Rep,Period> const& dura)
+  {
+    return try_push(elem,clock::now() + dura);
+  }
+
+  template <class T, class Clock>
+  template <class Duration>
+  queue_op_status sync_timed_queue<T, Clock>::try_push(BOOST_THREAD_RV_REF(T) elem, chrono::time_point<clock,Duration> const& tp)
+  {
+    return super::try_push(stype(boost::move(elem), tp));
+  }
+
+  template <class T, class Clock>
+  template <class Rep, class Period>
+  queue_op_status sync_timed_queue<T, Clock>::try_push(BOOST_THREAD_RV_REF(T) elem, chrono::duration<Rep,Period> const& dura)
+  {
+    return try_push(boost::move(elem), clock::now() + dura);
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  bool sync_timed_queue<T, Clock>::time_not_reached(unique_lock<mutex>&)
+  {
+    return super::data_.top().time_not_reached();
+  }
+
+  template <class T, class Clock>
+  bool sync_timed_queue<T, Clock>::time_not_reached(lock_guard<mutex>&)
+  {
+    return super::data_.top().time_not_reached();
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  bool sync_timed_queue<T, Clock>::wait_until_not_empty_time_reached_or_closed(unique_lock<mutex>& lk)
+  {
+    for (;;)
+    {
+      if (super::closed(lk)) return true;
+      while (! super::empty(lk)) {
+        if (! time_not_reached(lk)) return false;
+        super::not_empty_.wait_until(lk, super::data_.top().time);
+        if (super::closed(lk)) return true;
+      }
+      if (super::closed(lk)) return true;
+      super::not_empty_.wait(lk);
+    }
+    return false;
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  T sync_timed_queue<T, Clock>::pull_when_time_reached(unique_lock<mutex>& lk)
+  {
+    while (time_not_reached(lk))
+    {
+      super::throw_if_closed(lk);
+      super::not_empty_.wait_until(lk,super::data_.top().time);
+      super::wait_until_not_empty(lk);
+    }
+    return pull(lk);
+  }
+
+  template <class T, class Clock>
+  template <class Duration>
+  queue_op_status
+  sync_timed_queue<T, Clock>::pull_when_time_reached_until(unique_lock<mutex>& lk, chrono::time_point<clock,Duration> const& tp, T& elem)
+  {
+    chrono::time_point<clock,Duration> tpmin = (tp < super::data_.top().time) ? tp : super::data_.top().time;
+    while (time_not_reached(lk))
+    {
+      super::throw_if_closed(lk);
+      if (queue_op_status::timeout == super::not_empty_.wait_until(lk, tpmin)) {
+        if (time_not_reached(lk)) return queue_op_status::not_ready;
+        return queue_op_status::timeout;
+      }
+    }
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  bool sync_timed_queue<T, Clock>::empty_or_time_not_reached(unique_lock<mutex>& lk)
+  {
+    if ( super::empty(lk) ) return true;
+    if ( time_not_reached(lk) ) return true;
+    return false;
+  }
+  template <class T, class Clock>
+  bool sync_timed_queue<T, Clock>::empty_or_time_not_reached(lock_guard<mutex>& lk)
+  {
+    if ( super::empty(lk) ) return true;
+    if ( time_not_reached(lk) ) return true;
+    return false;
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  T sync_timed_queue<T, Clock>::pull(unique_lock<mutex>&)
+  {
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+    return boost::move(super::data_.pull().data);
+#else
+    return super::data_.pull().data;
+#endif
+  }
+
+  template <class T, class Clock>
+  T sync_timed_queue<T, Clock>::pull(lock_guard<mutex>&)
+  {
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+    return boost::move(super::data_.pull().data);
+#else
+    return super::data_.pull().data;
+#endif
+  }
+  template <class T, class Clock>
+  T sync_timed_queue<T, Clock>::pull()
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    super::wait_until_not_empty(lk);
+    return pull_when_time_reached(lk);
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  void sync_timed_queue<T, Clock>::pull(unique_lock<mutex>&, T& elem)
+  {
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+    elem = boost::move(super::data_.pull().data);
+#else
+    elem = super::data_.pull().data;
+#endif
+  }
+
+  template <class T, class Clock>
+  void sync_timed_queue<T, Clock>::pull(lock_guard<mutex>&, T& elem)
+  {
+#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+    elem = boost::move(super::data_.pull().data);
+#else
+    elem = super::data_.pull().data;
+#endif
+  }
+
+  template <class T, class Clock>
+  void sync_timed_queue<T, Clock>::pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    super::wait_until_not_empty(lk);
+    elem = pull_when_time_reached(lk);
+  }
+
+  //////////////////////
+  template <class T, class Clock>
+  template <class Duration>
+  queue_op_status
+  sync_timed_queue<T, Clock>::pull_until(chrono::time_point<clock,Duration> const& tp, T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+
+    if (queue_op_status::timeout == super::wait_until_not_empty_until(lk, tp))
+      return queue_op_status::timeout;
+    return pull_when_time_reached_until(lk, tp, elem);
+  }
+
+  //////////////////////
+  template <class T, class Clock>
+  template <class Rep, class Period>
+  queue_op_status
+  sync_timed_queue<T, Clock>::pull_for(chrono::duration<Rep,Period> const& dura, T& elem)
+  {
+    return pull_until(clock::now() + dura, elem);
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::try_pull(unique_lock<mutex>& lk, T& elem)
+  {
+    if ( super::empty(lk) )
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    if ( time_not_reached(lk) )
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::not_ready;
+    }
+
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::try_pull(lock_guard<mutex>& lk, T& elem)
+  {
+    if ( super::empty(lk) )
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::empty;
+    }
+    if ( time_not_reached(lk) )
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+      return queue_op_status::not_ready;
+    }
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::try_pull(T& elem)
+  {
+    lock_guard<mutex> lk(super::mtx_);
+    return try_pull(lk, elem);
+  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::wait_pull(unique_lock<mutex>& lk, T& elem)
+  {
+    if (super::empty(lk))
+    {
+      if (super::closed(lk)) return queue_op_status::closed;
+    }
+    bool has_been_closed = wait_until_not_empty_time_reached_or_closed(lk);
+    if (has_been_closed) return queue_op_status::closed;
+    pull(lk, elem);
+    return queue_op_status::success;
+  }
+
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::wait_pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_);
+    return wait_pull(lk, elem);
+  }
+
+//  ///////////////////////////
+//  template <class T, class Clock>
+//  queue_op_status sync_timed_queue<T, Clock>::wait_pull(unique_lock<mutex> &lk, T& elem)
+//  {
+//    if (super::empty(lk))
+//    {
+//      if (super::closed(lk)) return queue_op_status::closed;
+//    }
+//    bool has_been_closed = super::wait_until_not_empty_or_closed(lk);
+//    if (has_been_closed) return queue_op_status::closed;
+//    pull(lk, elem);
+//    return queue_op_status::success;
+//  }
+//  template <class T>
+//  queue_op_status sync_timed_queue<T, Clock>::wait_pull(T& elem)
+//  {
+//    unique_lock<mutex> lk(super::mtx_);
+//    return wait_pull(lk, elem);
+//  }
+
+  ///////////////////////////
+  template <class T, class Clock>
+  queue_op_status sync_timed_queue<T, Clock>::nonblocking_pull(T& elem)
+  {
+    unique_lock<mutex> lk(super::mtx_, try_to_lock);
+    if (! lk.owns_lock()) return queue_op_status::busy;
+    return try_pull(lk, elem);
+  }
+
+} //end concurrent namespace
+
+using concurrent::sync_timed_queue;
+
+} //end boost namespace
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/deque.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_DEQUE_HPP
+#define BOOST_CSBL_DEQUE_HPP
+
+#include <boost/config.hpp>
+// MSVC has some trouble instantiating a non_copyable type
+//C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(606) : error C2248: 'non_copyable::non_copyable' : cannot access private member declared in class 'non_copyable'
+//        ..\libs\thread\test\sync\mutual_exclusion\queue_views\single_thread_pass.cpp(24) : see declaration of 'non_copyable::non_copyable'
+//        ..\libs\thread\test\sync\mutual_exclusion\queue_views\single_thread_pass.cpp(23) : see declaration of 'non_copyable'
+//        C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(605) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
+//        with
+//        [
+//            _Ty=non_copyable
+//        ]
+#if defined BOOST_THREAD_USES_BOOST_DEQUE || defined BOOST_NO_CXX11_RVALUE_REFERENCES || (defined _MSC_VER && _MSC_FULL_VER < 180020827)
+#ifndef BOOST_THREAD_USES_BOOST_DEQUE
+#define BOOST_THREAD_USES_BOOST_DEQUE
+#endif
+#include <boost/container/deque.hpp>
+#else
+#include <deque>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_DEQUE
+    using ::boost::container::deque;
+
+#else
+    using ::std::deque;
+
+#endif
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/devector.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,100 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_DEVECTOR_HPP
+#define BOOST_CSBL_DEVECTOR_HPP
+
+#include <boost/config.hpp>
+
+#include <boost/thread/csbl/vector.hpp>
+#include <boost/move/detail/move_helpers.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    template <class T>
+    class devector
+    {
+      typedef vector<T> vector_type;
+      vector<T> data_;
+      std::size_t front_index_;
+
+      BOOST_COPYABLE_AND_MOVABLE(devector)
+
+      template <class U>
+      void priv_push_back(BOOST_FWD_REF(U) x)
+      { data_.push_back(boost::forward<U>(x)); }
+
+    public:
+      typedef typename vector_type::size_type size_type;
+      typedef typename vector_type::reference reference;
+      typedef typename vector_type::const_reference const_reference;
+
+
+      devector() : front_index_(0) {}
+      devector(devector const& x) BOOST_NOEXCEPT
+         :  data_(x.data_),
+            front_index_(x.front_index_)
+      {}
+      devector(BOOST_RV_REF(devector) x) BOOST_NOEXCEPT
+         :  data_(boost::move(x.data_)),
+            front_index_(x.front_index_)
+      {}
+
+      devector& operator=(BOOST_COPY_ASSIGN_REF(devector) x)
+      {
+         if (&x != this)
+         {
+           data_ = x.data_;
+           front_index_ = x.front_index_;
+         }
+         return *this;
+      }
+
+      devector& operator=(BOOST_RV_REF(devector) x)
+         BOOST_NOEXCEPT_IF(vector<T>::allocator_traits_type::propagate_on_container_move_assignment::value)
+      {
+        data_ = boost::move(x.data_);
+        front_index_ = x.front_index_;
+        return *this;
+      }
+
+      bool empty() const BOOST_NOEXCEPT
+      { return data_.size() == front_index_; }
+
+      size_type size() const BOOST_NOEXCEPT
+      { return data_.size() - front_index_; }
+
+      reference         front() BOOST_NOEXCEPT
+      { return data_[front_index_]; }
+
+      const_reference         front() const BOOST_NOEXCEPT
+      { return data_[front_index_]; }
+
+      reference         back() BOOST_NOEXCEPT
+      { return data_.back(); }
+
+      const_reference         back() const BOOST_NOEXCEPT
+      { return data_.back(); }
+
+      BOOST_MOVE_CONVERSION_AWARE_CATCH(push_back, T, void, priv_push_back)
+
+      void pop_front()
+      {
+        ++front_index_;
+        if (empty()) {
+          data_.clear();
+          front_index_=0;
+        }
+       }
+
+    };
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/functional.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_FUNCTIONAL_HPP
+#define BOOST_CSBL_FUNCTIONAL_HPP
+
+#include <boost/config.hpp>
+
+#include <functional>
+
+#if defined BOOST_THREAD_USES_BOOST_FUNCTIONAL || defined BOOST_NO_CXX11_HDR_FUNCTIONAL || defined BOOST_NO_CXX11_RVALUE_REFERENCES
+#ifndef BOOST_THREAD_USES_BOOST_FUNCTIONAL
+#define BOOST_THREAD_USES_BOOST_FUNCTIONAL
+#endif
+#include <boost/function.hpp>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_FUNCTIONAL
+    using ::boost::function;
+#else
+    // D.8.1, base (deprecated):
+    // 20.9.3, reference_wrapper:
+    // 20.9.4, arithmetic operations:
+    // 20.9.5, comparisons:
+    // 20.9.6, logical operations:
+    // 20.9.7, bitwise operations:
+    // 20.9.8, negators:
+    // 20.9.9, bind:
+    // D.9, binders (deprecated):
+    // D.8.2.1, adaptors (deprecated):
+    // D.8.2.2, adaptors (deprecated):
+    // 20.9.10, member function adaptors:
+    // 20.9.11 polymorphic function wrappers:
+    using ::std::function;
+    // 20.9.12, hash function primary template:
+#endif
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_LIST_HPP
+#define BOOST_CSBL_LIST_HPP
+
+#include <boost/config.hpp>
+
+#if defined BOOST_THREAD_USES_BOOST_LIST || defined BOOST_NO_CXX11_RVALUE_REFERENCES
+#ifndef BOOST_THREAD_USES_BOOST_LIST
+#define BOOST_THREAD_USES_BOOST_LIST
+#endif
+#include <boost/container/list.hpp>
+#else
+#include <list>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_LIST
+    using ::boost::container::list;
+#else
+    using ::std::list;
+#endif
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,61 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_HPP
+#define BOOST_CSBL_MEMORY_HPP
+
+// 20.7.2 Header <memory> synopsis
+
+// 20.7.3, pointer traits
+#include <boost/thread/csbl/memory/pointer_traits.hpp>
+
+// 20.7.4, pointer safety
+// 20.7.5, pointer alignment function
+
+// 20.7.6, allocator argument tag
+#include <boost/thread/csbl/memory/allocator_arg.hpp>
+
+// 20.7.8, allocator traits
+#include <boost/thread/csbl/memory/allocator_traits.hpp>
+
+// 20.7.7, uses_allocator
+#include <boost/thread/csbl/memory/scoped_allocator.hpp>
+
+// 20.7.9, the default allocator:
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::allocator;
+  }
+}
+// 20.7.10, raw storage iterator:
+// 20.7.11, temporary buffers:
+// 20.7.12, specialized algorithms:
+
+// 20.8.1 class template unique_ptr:
+// default_delete
+#include <boost/thread/csbl/memory/default_delete.hpp>
+#include <boost/thread/csbl/memory/unique_ptr.hpp>
+
+// 20.8.2.1, class bad_weak_ptr:
+// 20.8.2.2, class template shared_ptr:
+// 20.8.2.2.6, shared_ptr creation
+// 20.8.2.2.7, shared_ptr comparisons:
+// 20.8.2.2.8, shared_ptr specialized algorithms:
+// 20.8.2.2.9, shared_ptr casts:
+// 20.8.2.2.10, shared_ptr get_deleter:
+// 20.8.2.2.11, shared_ptr I/O:
+// 20.8.2.3, class template weak_ptr:
+// 20.8.2.3.6, weak_ptr specialized algorithms:
+// 20.8.2.3.7, class template owner_less:
+// 20.8.2.4, class template enable_shared_from_this:
+// 20.8.2.5, shared_ptr atomic access:
+// 20.8.2.6 hash support
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/allocator_arg.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_ALLOCATOR_ARG_HPP
+#define BOOST_CSBL_MEMORY_ALLOCATOR_ARG_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+// 20.7.6, allocator argument tag
+#if defined BOOST_NO_CXX11_ALLOCATOR
+#include <boost/container/scoped_allocator.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::container::allocator_arg_t;
+    using ::boost::container::allocator_arg;
+  }
+}
+#else
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::allocator_arg_t;
+    using ::std::allocator_arg;
+  }
+}
+#endif // BOOST_NO_CXX11_ALLOCATOR
+namespace boost
+{
+  using ::boost::csbl::allocator_arg_t;
+  using ::boost::csbl::allocator_arg;
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/allocator_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_ALLOCATOR_TRAITS_HPP
+#define BOOST_CSBL_MEMORY_ALLOCATOR_TRAITS_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+// 20.7.8, allocator traits
+#if defined BOOST_NO_CXX11_ALLOCATOR
+#include <boost/container/allocator_traits.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::container::allocator_traits;
+  }
+}
+#else
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::allocator_traits;
+  }
+}
+#endif // BOOST_NO_CXX11_POINTER_TRAITS
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_CONFIG_HPP
+#define BOOST_CSBL_MEMORY_CONFIG_HPP
+
+#include <boost/config.hpp>
+
+#include <memory>
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/default_delete.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_DEFAULT_DELETE_HPP
+#define BOOST_CSBL_MEMORY_DEFAULT_DELETE_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+// 20.8.1 class template unique_ptr:
+// default_delete
+
+#if defined BOOST_NO_CXX11_SMART_PTR
+#include <boost/move/unique_ptr.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::movelib::default_delete;
+  }
+}
+#else
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::default_delete;
+  }
+}
+#endif // defined  BOOST_NO_CXX11_SMART_PTR
+
+namespace boost
+{
+  using ::boost::csbl::default_delete;
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/pointer_traits.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_POINTER_TRAITS_HPP
+#define BOOST_CSBL_MEMORY_POINTER_TRAITS_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+// 20.7.3, pointer traits
+#if defined BOOST_NO_CXX11_ALLOCATOR
+#include <boost/intrusive/pointer_traits.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::intrusive::pointer_traits;
+  }
+}
+#else
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::pointer_traits;
+  }
+}
+#endif // BOOST_NO_CXX11_ALLOCATOR
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/scoped_allocator.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_SCOPED_ALLOCATOR_HPP
+#define BOOST_CSBL_MEMORY_SCOPED_ALLOCATOR_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+// 20.7.7, uses_allocator
+#if defined BOOST_NO_CXX11_ALLOCATOR
+#include <boost/container/scoped_allocator.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::container::uses_allocator;
+  }
+}
+#else
+namespace boost
+{
+  namespace csbl
+  {
+    using ::std::uses_allocator;
+  }
+}
+#endif // BOOST_NO_CXX11_POINTER_TRAITS
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/shared_ptr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,42 @@
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2014/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_MEMORY_SHARED_PTR_HPP
+#define BOOST_CSBL_MEMORY_SHARED_PTR_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+#if defined BOOST_NO_CXX11_SMART_PTR
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::shared_ptr;
+    using ::boost::make_shared;
+  }
+}
+
+#else
+
+#include <boost/shared_ptr.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using std::shared_ptr;
+    using std::make_shared;
+  }
+}
+
+#endif
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/memory/unique_ptr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+// Copyright (C) 2013-2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation using interprocess::unique_ptr.
+// 2014/09 Vicente J. Botet Escriba
+//   Adaptation to movelib::unique_ptr
+
+#ifndef BOOST_CSBL_MEMORY_UNIQUE_PTR_HPP
+#define BOOST_CSBL_MEMORY_UNIQUE_PTR_HPP
+
+#include <boost/thread/csbl/memory/config.hpp>
+
+#include <boost/move/unique_ptr.hpp>
+#include <boost/move/make_unique.hpp>
+
+namespace boost
+{
+  namespace csbl
+  {
+    using ::boost::movelib::unique_ptr;
+    using ::boost::movelib::make_unique;
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/queue.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_QUEUE_HPP
+#define BOOST_CSBL_QUEUE_HPP
+
+#include <boost/config.hpp>
+// MSVC has some trouble instantiating a non_copyable type
+//C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(606) : error C2248: 'non_copyable::non_copyable' : cannot access private member declared in class 'non_copyable'
+//        ..\libs\thread\test\sync\mutual_exclusion\queue_views\single_thread_pass.cpp(24) : see declaration of 'non_copyable::non_copyable'
+//        ..\libs\thread\test\sync\mutual_exclusion\queue_views\single_thread_pass.cpp(23) : see declaration of 'non_copyable'
+//        C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0(605) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
+//        with
+//        [
+//            _Ty=non_copyable
+//        ]
+#if defined BOOST_THREAD_USES_BOOST_QUEUE || defined BOOST_NO_CXX11_RVALUE_REFERENCES || (defined _MSC_VER && _MSC_FULL_VER < 180020827)
+#ifndef BOOST_THREAD_USES_BOOST_QUEUE
+#define BOOST_THREAD_USES_BOOST_QUEUE
+#endif
+#include <boost/container/queue.hpp>
+#else
+#include <queue>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_QUEUE
+    using ::boost::container::queue;
+
+#else
+    using ::std::queue;
+
+#endif
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/tuple.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,49 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_TUPLE_HPP
+#define BOOST_CSBL_TUPLE_HPP
+
+#include <boost/config.hpp>
+
+#if defined BOOST_THREAD_USES_BOOST_TUPLE || defined BOOST_NO_CXX11_HDR_TUPLE || defined BOOST_NO_CXX11_RVALUE_REFERENCES
+#include <boost/tuple/tuple.hpp>
+#ifndef BOOST_THREAD_USES_BOOST_TUPLE
+#define BOOST_THREAD_USES_BOOST_TUPLE
+#endif
+
+#else
+#include <tuple>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_TUPLE
+    using ::boost::tuple;
+    using ::boost::get;
+    using ::boost::make_tuple;
+    //using ::boost::tuple_size;
+#else
+    // 20.4.2, class template tuple:
+    using ::std::tuple;
+    using ::std::get;
+    using ::std::make_tuple;
+    using ::std::tuple_size;
+    // 20.4.2.4, tuple creation functions:
+    // 20.4.2.5, tuple helper classes:
+    // 20.4.2.6, element access:
+    // 20.4.2.7, relational operators:
+    // 20.4.2.8, allocator-related traits
+    // 20.4.2.9, specialized algorithms:
+#endif
+
+  }
+}
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/csbl/vector.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/10 Vicente J. Botet Escriba
+//   Creation.
+
+#ifndef BOOST_CSBL_VECTOR_HPP
+#define BOOST_CSBL_VECTOR_HPP
+
+#include <boost/config.hpp>
+
+#if defined BOOST_THREAD_USES_BOOST_VECTOR || defined BOOST_NO_CXX11_RVALUE_REFERENCES || defined BOOST_MSVC
+#ifndef BOOST_THREAD_USES_BOOST_VECTOR
+#define BOOST_THREAD_USES_BOOST_VECTOR
+#endif
+#include <boost/container/vector.hpp>
+#else
+#include <vector>
+#endif
+
+namespace boost
+{
+  namespace csbl
+  {
+#if defined BOOST_THREAD_USES_BOOST_VECTOR
+    using ::boost::container::vector;
+#else
+    using ::std::vector;
+#endif
+
+  }
+}
+#endif // header
--- a/DEPENDENCIES/generic/include/boost/thread/detail/async_func.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,571 +0,0 @@
-// Copyright (C) 2012 Vicente J. Botet Escriba
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// 2013/04 Vicente J. Botet Escriba
-//    Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
-//    Make use of Boost.Move
-//    Make use of Boost.Tuple (movable)
-// 2012/11 Vicente J. Botet Escriba
-//    Adapt to boost libc++ implementation
-
-//===----------------------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-// The async_func code is based on the one from libcxx.
-//===----------------------------------------------------------------------===//
-
-#ifndef BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
-#define BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
-
-#include <boost/config.hpp>
-
-#include <boost/utility/result_of.hpp>
-#include <boost/thread/detail/move.hpp>
-#include <boost/thread/detail/invoke.hpp>
-#include <boost/thread/detail/make_tuple_indices.hpp>
-
-#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
-    ! defined(BOOST_NO_CXX11_HDR_TUPLE)
-#include <tuple>
-#else
-#include <boost/tuple/tuple.hpp>
-#endif
-
-namespace boost
-{
-  namespace detail
-  {
-
-#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
-    ! defined(BOOST_NO_CXX11_HDR_TUPLE)
-
-    template <class Fp, class ... Args>
-    class async_func
-    {
-      std::tuple<Fp, Args...> f_;
-
-    public:
-      BOOST_THREAD_MOVABLE_ONLY( async_func)
-      //typedef typename invoke_of<_Fp, _Args...>::type Rp;
-      typedef typename result_of<Fp(Args...)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args)... args)
-      : f_(boost::move(f), boost::move(args)...)
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f) : f_(boost::move(f.f_))
-      {}
-
-      result_type operator()()
-      {
-        typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
-        return execute(Index());
-      }
-    private:
-      template <size_t ...Indices>
-      result_type
-      execute(tuple_indices<Indices...>)
-      {
-        return invoke(boost::move(std::get<0>(f_)), boost::move(std::get<Indices>(f_))...);
-      }
-    };
-    //BOOST_THREAD_DCL_MOVABLE_BEG(X) async_func<Fp> BOOST_THREAD_DCL_MOVABLE_END
-#else
-    template <class Fp,
-    class T0 = tuples::null_type, class T1 = tuples::null_type, class T2 = tuples::null_type,
-    class T3 = tuples::null_type, class T4 = tuples::null_type, class T5 = tuples::null_type,
-    class T6 = tuples::null_type, class T7 = tuples::null_type, class T8 = tuples::null_type
-    , class T9 = tuples::null_type
-    >
-    class async_func;
-
-    template <class Fp,
-    class T0 , class T1 , class T2 ,
-    class T3 , class T4 , class T5 ,
-    class T6 , class T7 , class T8 >
-    class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-      T4 v4_;
-      T5 v5_;
-      T6 v6_;
-      T7 v7_;
-      T8 v8_;
-      //::boost::tuple<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8> f_;
-
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7, T8)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-          , BOOST_THREAD_RV_REF(T4) a4
-          , BOOST_THREAD_RV_REF(T5) a5
-          , BOOST_THREAD_RV_REF(T6) a6
-          , BOOST_THREAD_RV_REF(T7) a7
-          , BOOST_THREAD_RV_REF(T8) a8
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      , v4_(boost::move(a4))
-      , v5_(boost::move(a5))
-      , v6_(boost::move(a6))
-      , v7_(boost::move(a7))
-      , v8_(boost::move(a8))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      , v4_(boost::move(f.a4))
-      , v5_(boost::move(f.a5))
-      , v6_(boost::move(f.a6))
-      , v7_(boost::move(f.a7))
-      , v8_(boost::move(f.a8))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-            , boost::move(v4_)
-            , boost::move(v5_)
-            , boost::move(v6_)
-            , boost::move(v7_)
-            , boost::move(v8_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
-    class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-      T4 v4_;
-      T5 v5_;
-      T6 v6_;
-      T7 v7_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-          , BOOST_THREAD_RV_REF(T4) a4
-          , BOOST_THREAD_RV_REF(T5) a5
-          , BOOST_THREAD_RV_REF(T6) a6
-          , BOOST_THREAD_RV_REF(T7) a7
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      , v4_(boost::move(a4))
-      , v5_(boost::move(a5))
-      , v6_(boost::move(a6))
-      , v7_(boost::move(a7))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      , v4_(boost::move(f.a4))
-      , v5_(boost::move(f.a5))
-      , v6_(boost::move(f.a6))
-      , v7_(boost::move(f.a7))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-            , boost::move(v4_)
-            , boost::move(v5_)
-            , boost::move(v6_)
-            , boost::move(v7_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6>
-    class async_func<Fp, T0, T1, T2, T3, T4, T5, T6>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-      T4 v4_;
-      T5 v5_;
-      T6 v6_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-          , BOOST_THREAD_RV_REF(T4) a4
-          , BOOST_THREAD_RV_REF(T5) a5
-          , BOOST_THREAD_RV_REF(T6) a6
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      , v4_(boost::move(a4))
-      , v5_(boost::move(a5))
-      , v6_(boost::move(a6))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      , v4_(boost::move(f.a4))
-      , v5_(boost::move(f.a5))
-      , v6_(boost::move(f.a6))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-            , boost::move(v4_)
-            , boost::move(v5_)
-            , boost::move(v6_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5>
-    class async_func<Fp, T0, T1, T2, T3, T4, T5>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-      T4 v4_;
-      T5 v5_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-          , BOOST_THREAD_RV_REF(T4) a4
-          , BOOST_THREAD_RV_REF(T5) a5
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      , v4_(boost::move(a4))
-      , v5_(boost::move(a5))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      , v4_(boost::move(f.a4))
-      , v5_(boost::move(f.a5))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-            , boost::move(v4_)
-            , boost::move(v5_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2, class T3, class T4>
-    class async_func<Fp, T0, T1, T2, T3, T4>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-      T4 v4_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3, T4)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-          , BOOST_THREAD_RV_REF(T4) a4
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      , v4_(boost::move(a4))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      , v4_(boost::move(f.a4))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-            , boost::move(v4_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2, class T3>
-    class async_func<Fp, T0, T1, T2, T3>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-      T3 v3_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2, T3)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-          , BOOST_THREAD_RV_REF(T3) a3
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      , v3_(boost::move(a3))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      , v3_(boost::move(f.a3))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-            , boost::move(v3_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1, class T2>
-    class async_func<Fp, T0, T1, T2>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-      T2 v2_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1, T2)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-          , BOOST_THREAD_RV_REF(T2) a2
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      , v2_(boost::move(a2))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      , v2_(boost::move(f.a2))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-            , boost::move(v2_)
-        );
-      }
-    };
-    template <class Fp, class T0, class T1>
-    class async_func<Fp, T0, T1>
-    {
-      Fp fp_;
-      T0 v0_;
-      T1 v1_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0, T1)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-          , BOOST_THREAD_RV_REF(T1) a1
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      , v1_(boost::move(a1))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      , v1_(boost::move(f.a1))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-            , boost::move(v1_)
-        );
-      }
-    };
-    template <class Fp, class T0>
-    class async_func<Fp, T0>
-    {
-      Fp fp_;
-      T0 v0_;
-    public:
-      BOOST_THREAD_MOVABLE_ONLY(async_func)
-      typedef typename result_of<Fp(T0)>::type result_type;
-
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_RV_REF(Fp) f
-          , BOOST_THREAD_RV_REF(T0) a0
-      )
-      : fp_(boost::move(f))
-      , v0_(boost::move(a0))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_RV_REF(async_func) f)
-      : fp_(boost::move(f.fp))
-      , v0_(boost::move(f.a0))
-      {}
-
-      result_type operator()()
-      {
-        return invoke(boost::move(fp_)
-            , boost::move(v0_)
-        );
-      }
-    };
-    template <class Fp>
-    class async_func<Fp>
-    {
-      Fp fp_;
-    public:
-      BOOST_THREAD_COPYABLE_AND_MOVABLE(async_func)
-      typedef typename result_of<Fp()>::type result_type;
-      BOOST_SYMBOL_VISIBLE
-      explicit async_func(BOOST_THREAD_FWD_REF(Fp) f)
-      : fp_(boost::move(f))
-      {}
-
-      BOOST_SYMBOL_VISIBLE
-      async_func(BOOST_THREAD_FWD_REF(async_func) f)
-      : fp_(boost::move(f.fp_))
-      {}
-      result_type operator()()
-      {
-        return fp_();
-      }
-    };
-#endif
-
-  }
-}
-
-#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/function_wrapper.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,93 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+//    Make use of Boost.Move
+
+#ifndef BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP
+#define BOOST_THREAD_DETAIL_FUNCTION_WRAPPER_HPP
+
+#include <boost/config.hpp>
+#include <boost/thread/detail/memory.hpp>
+#include <boost/thread/detail/move.hpp>
+
+#include <boost/thread/csbl/memory/unique_ptr.hpp>
+
+#include <memory>
+#include <functional>
+
+namespace boost
+{
+  namespace detail
+  {
+    class function_wrapper
+    {
+      struct impl_base
+      {
+        virtual void call()=0;
+        virtual ~impl_base()
+        {
+        }
+      };
+      typedef boost::csbl::unique_ptr<impl_base> impl_base_type;
+      impl_base_type impl;
+      template <typename F>
+      struct impl_type: impl_base
+      {
+        F f;
+        impl_type(F const &f_)
+          : f(f_)
+        {}
+        impl_type(BOOST_THREAD_RV_REF(F) f_)
+          : f(boost::move(f_))
+        {}
+
+        void call()
+        {
+          if (impl) f();
+        }
+      };
+    public:
+      BOOST_THREAD_MOVABLE_ONLY(function_wrapper)
+
+//#if ! defined  BOOST_NO_CXX11_RVALUE_REFERENCES
+      template<typename F>
+      function_wrapper(F const& f):
+      impl(new impl_type<F>(f))
+      {}
+//#endif
+      template<typename F>
+      function_wrapper(BOOST_THREAD_RV_REF(F) f):
+      impl(new impl_type<F>(boost::forward<F>(f)))
+      {}
+      function_wrapper(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT :
+      impl(other.impl)
+      {
+        other.impl = 0;
+      }
+      function_wrapper()
+        : impl(0)
+      {
+      }
+      ~function_wrapper()
+      {
+      }
+
+      function_wrapper& operator=(BOOST_THREAD_RV_REF(function_wrapper) other) BOOST_NOEXCEPT
+      {
+        impl=other.impl;
+        other.impl=0;
+        return *this;
+      }
+
+      void operator()()
+      { impl->call();}
+
+    };
+  }
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/invoker.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,754 @@
+// Copyright (C) 2012 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// 2013/04 Vicente J. Botet Escriba
+//    Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
+//    Make use of Boost.Move
+//    Make use of Boost.Tuple (movable)
+// 2012/11 Vicente J. Botet Escriba
+//    Adapt to boost libc++ implementation
+
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+// The invoker code is based on the one from libcxx.
+//===----------------------------------------------------------------------===//
+
+#ifndef BOOST_THREAD_DETAIL_INVOKER_HPP
+#define BOOST_THREAD_DETAIL_INVOKER_HPP
+
+#include <boost/config.hpp>
+
+#include <boost/utility/result_of.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/detail/invoke.hpp>
+#include <boost/thread/detail/make_tuple_indices.hpp>
+#include <boost/thread/csbl/tuple.hpp>
+#include <boost/tuple/tuple.hpp>
+
+#include <boost/thread/detail/variadic_header.hpp>
+
+namespace boost
+{
+  namespace detail
+  {
+
+#if defined(BOOST_THREAD_PROVIDES_INVOKE) && ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && ! defined(BOOST_NO_CXX11_HDR_TUPLE)
+
+    template <class Fp, class ... Args>
+    class invoker
+    {
+      //typedef typename decay<Fp>::type Fpd;
+      //typedef tuple<typename decay<Args>::type...> Argsd;
+
+      //csbl::tuple<Fpd, Argsd...> f_;
+      csbl::tuple<Fp, Args...> f_;
+
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker)
+      //typedef typename invoke_of<_Fp, _Args...>::type Rp;
+      typedef typename result_of<Fp(Args...)>::type result_type;
+
+      template <class F, class ... As>
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args)
+      : f_(boost::forward<F>(f), boost::forward<As>(args)...)
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f) : f_(boost::move(BOOST_THREAD_RV(f).f_))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker( const invoker& f) : f_(f.f_)
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker& operator=(BOOST_THREAD_RV_REF(invoker) f)
+      {
+        f_ = boost::move(BOOST_THREAD_RV(f).f_);
+      }
+
+      BOOST_SYMBOL_VISIBLE
+      invoker& operator=( BOOST_THREAD_COPY_ASSIGN_REF(invoker) f)
+      {
+        f_ = f.f_;
+      }
+
+      result_type operator()()
+      {
+        typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
+        return execute(Index());
+      }
+    private:
+      template <size_t ...Indices>
+      result_type
+      execute(tuple_indices<Indices...>)
+      {
+        return invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
+      }
+    };
+
+    template <class R, class Fp, class ... Args>
+    class invoker_ret
+    {
+      //typedef typename decay<Fp>::type Fpd;
+      //typedef tuple<typename decay<Args>::type...> Argsd;
+
+      //csbl::tuple<Fpd, Argsd...> f_;
+      csbl::tuple<Fp, Args...> f_;
+
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE( invoker_ret)
+      typedef R result_type;
+
+      template <class F, class ... As>
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker_ret(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(As)... args)
+      : f_(boost::forward<F>(f), boost::forward<As>(args)...)
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker_ret(BOOST_THREAD_RV_REF(invoker_ret) f) : f_(boost::move(BOOST_THREAD_RV(f).f_))
+      {}
+
+      result_type operator()()
+      {
+        typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
+        return execute(Index());
+      }
+    private:
+      template <size_t ...Indices>
+      result_type
+      execute(tuple_indices<Indices...>)
+      {
+        return invoke<R>(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
+      }
+    };
+  //BOOST_THREAD_DCL_MOVABLE_BEG(X) invoker<Fp> BOOST_THREAD_DCL_MOVABLE_END
+#else
+
+#if ! defined BOOST_MSVC && defined(BOOST_THREAD_PROVIDES_INVOKE)
+
+#define BOOST_THREAD_RV_REF_ARG_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(Arg##n)
+#define BOOST_THREAD_RV_REF_A_T(z, n, unused) BOOST_PP_COMMA_IF(n) BOOST_THREAD_RV_REF(A##n)
+#define BOOST_THREAD_RV_REF_ARG(z, n, unused) , BOOST_THREAD_RV_REF(Arg##n) arg##n
+#define BOOST_THREAD_FWD_REF_A(z, n, unused)   , BOOST_THREAD_FWD_REF(A##n) arg##n
+#define BOOST_THREAD_FWD_REF_ARG(z, n, unused) , BOOST_THREAD_FWD_REF(Arg##n) arg##n
+#define BOOST_THREAD_FWD_PARAM(z, n, unused) , boost::forward<Arg##n>(arg##n)
+#define BOOST_THREAD_FWD_PARAM_A(z, n, unused) , boost::forward<A##n>(arg##n)
+#define BOOST_THREAD_DCL(z, n, unused) Arg##n v##n;
+#define BOOST_THREAD_MOVE_PARAM(z, n, unused) , v##n(boost::move(arg##n))
+#define BOOST_THREAD_FORWARD_PARAM_A(z, n, unused) , v##n(boost::forward<A##n>(arg##n))
+#define BOOST_THREAD_MOVE_RHS_PARAM(z, n, unused) , v##n(boost::move(x.v##n))
+#define BOOST_THREAD_MOVE_DCL(z, n, unused) , boost::move(v##n)
+#define BOOST_THREAD_MOVE_DCL_T(z, n, unused) BOOST_PP_COMMA_IF(n) boost::move(v##n)
+#define BOOST_THREAD_ARG_DEF(z, n, unused) , class Arg##n = tuples::null_type
+
+  template  <class Fp, class Arg = tuples::null_type
+    BOOST_PP_REPEAT(BOOST_THREAD_MAX_ARGS, BOOST_THREAD_ARG_DEF, ~)
+    >
+    class invoker;
+
+#define BOOST_THREAD_ASYNC_FUNCT(z, n, unused) \
+    template <class Fp BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class Arg) > \
+    class invoker<Fp BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Arg)> \
+    { \
+      Fp fp_; \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \
+    public: \
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \
+      typedef typename result_of<Fp(BOOST_PP_ENUM_PARAMS(n, Arg))>::type result_type; \
+      \
+      template <class F BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class A) > \
+      BOOST_SYMBOL_VISIBLE \
+      explicit invoker(BOOST_THREAD_FWD_REF(F) f \
+          BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \
+      ) \
+      : fp_(boost::forward<F>(f)) \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \
+      {} \
+      \
+      BOOST_SYMBOL_VISIBLE \
+      invoker(BOOST_THREAD_RV_REF(invoker) x) \
+      : fp_(boost::move(x.fp_)) \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \
+      {} \
+      \
+      result_type operator()() { \
+        return invoke(boost::move(fp_) \
+            BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL, ~) \
+        ); \
+      } \
+    }; \
+    \
+    template <class R BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class Arg) > \
+    class invoker<R(*)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_ARG_T, ~)) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Arg)> \
+    { \
+      typedef R(*Fp)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_ARG_T, ~)); \
+      Fp fp_; \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_DCL, ~) \
+    public: \
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker) \
+      typedef typename result_of<Fp(BOOST_PP_ENUM_PARAMS(n, Arg))>::type result_type; \
+      \
+      template <class R2 BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class A) > \
+      BOOST_SYMBOL_VISIBLE \
+      explicit invoker(R2(*f)(BOOST_PP_REPEAT(n, BOOST_THREAD_RV_REF_A_T, ~))  \
+          BOOST_PP_REPEAT(n, BOOST_THREAD_FWD_REF_A, ~) \
+      ) \
+      : fp_(f) \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_FORWARD_PARAM_A, ~) \
+      {} \
+      \
+      BOOST_SYMBOL_VISIBLE \
+      invoker(BOOST_THREAD_RV_REF(invoker) x) \
+      : fp_(x.fp_) \
+      BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_RHS_PARAM, ~) \
+      {} \
+      \
+      result_type operator()() { \
+        return fp_( \
+            BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL_T, ~) \
+        ); \
+      } \
+    };
+
+    BOOST_PP_REPEAT(BOOST_THREAD_MAX_ARGS, BOOST_THREAD_ASYNC_FUNCT, ~)
+
+    #undef BOOST_THREAD_RV_REF_ARG_T
+    #undef BOOST_THREAD_RV_REF_ARG
+    #undef BOOST_THREAD_FWD_REF_ARG
+    #undef BOOST_THREAD_FWD_REF_A
+    #undef BOOST_THREAD_FWD_PARAM
+    #undef BOOST_THREAD_FWD_PARAM_A
+    #undef BOOST_THREAD_DCL
+    #undef BOOST_THREAD_MOVE_PARAM
+    #undef BOOST_THREAD_MOVE_RHS_PARAM
+    #undef BOOST_THREAD_MOVE_DCL
+    #undef BOOST_THREAD_ARG_DEF
+    #undef BOOST_THREAD_ASYNC_FUNCT
+
+#else
+
+    template <class Fp,
+    class T0 = tuples::null_type, class T1 = tuples::null_type, class T2 = tuples::null_type,
+    class T3 = tuples::null_type, class T4 = tuples::null_type, class T5 = tuples::null_type,
+    class T6 = tuples::null_type, class T7 = tuples::null_type, class T8 = tuples::null_type
+    , class T9 = tuples::null_type
+    >
+    class invoker;
+
+    template <class Fp,
+    class T0 , class T1 , class T2 ,
+    class T3 , class T4 , class T5 ,
+    class T6 , class T7 , class T8 >
+    class invoker<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+      T4 v4_;
+      T5 v5_;
+      T6 v6_;
+      T7 v7_;
+      T8 v8_;
+      //::boost::tuple<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8> f_;
+
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7, T8)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+          , BOOST_THREAD_RV_REF(T4) a4
+          , BOOST_THREAD_RV_REF(T5) a5
+          , BOOST_THREAD_RV_REF(T6) a6
+          , BOOST_THREAD_RV_REF(T7) a7
+          , BOOST_THREAD_RV_REF(T8) a8
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      , v4_(boost::move(a4))
+      , v5_(boost::move(a5))
+      , v6_(boost::move(a6))
+      , v7_(boost::move(a7))
+      , v8_(boost::move(a8))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
+      , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
+      , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
+      , v7_(boost::move(BOOST_THREAD_RV(f).v7_))
+      , v8_(boost::move(BOOST_THREAD_RV(f).v8_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+            , boost::move(v4_)
+            , boost::move(v5_)
+            , boost::move(v6_)
+            , boost::move(v7_)
+            , boost::move(v8_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
+    class invoker<Fp, T0, T1, T2, T3, T4, T5, T6, T7>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+      T4 v4_;
+      T5 v5_;
+      T6 v6_;
+      T7 v7_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+          , BOOST_THREAD_RV_REF(T4) a4
+          , BOOST_THREAD_RV_REF(T5) a5
+          , BOOST_THREAD_RV_REF(T6) a6
+          , BOOST_THREAD_RV_REF(T7) a7
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      , v4_(boost::move(a4))
+      , v5_(boost::move(a5))
+      , v6_(boost::move(a6))
+      , v7_(boost::move(a7))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
+      , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
+      , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
+      , v7_(boost::move(BOOST_THREAD_RV(f).v7_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+            , boost::move(v4_)
+            , boost::move(v5_)
+            , boost::move(v6_)
+            , boost::move(v7_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6>
+    class invoker<Fp, T0, T1, T2, T3, T4, T5, T6>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+      T4 v4_;
+      T5 v5_;
+      T6 v6_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+          , BOOST_THREAD_RV_REF(T4) a4
+          , BOOST_THREAD_RV_REF(T5) a5
+          , BOOST_THREAD_RV_REF(T6) a6
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      , v4_(boost::move(a4))
+      , v5_(boost::move(a5))
+      , v6_(boost::move(a6))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
+      , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
+      , v6_(boost::move(BOOST_THREAD_RV(f).v6_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+            , boost::move(v4_)
+            , boost::move(v5_)
+            , boost::move(v6_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5>
+    class invoker<Fp, T0, T1, T2, T3, T4, T5>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+      T4 v4_;
+      T5 v5_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+          , BOOST_THREAD_RV_REF(T4) a4
+          , BOOST_THREAD_RV_REF(T5) a5
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      , v4_(boost::move(a4))
+      , v5_(boost::move(a5))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
+      , v5_(boost::move(BOOST_THREAD_RV(f).v5_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+            , boost::move(v4_)
+            , boost::move(v5_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2, class T3, class T4>
+    class invoker<Fp, T0, T1, T2, T3, T4>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+      T4 v4_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3, T4)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+          , BOOST_THREAD_RV_REF(T4) a4
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      , v4_(boost::move(a4))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      , v4_(boost::move(BOOST_THREAD_RV(f).v4_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+            , boost::move(v4_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2, class T3>
+    class invoker<Fp, T0, T1, T2, T3>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+      T3 v3_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2, T3)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+          , BOOST_THREAD_RV_REF(T3) a3
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      , v3_(boost::move(a3))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      , v3_(boost::move(BOOST_THREAD_RV(f).v3_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+            , boost::move(v3_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1, class T2>
+    class invoker<Fp, T0, T1, T2>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+      T2 v2_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1, T2)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+          , BOOST_THREAD_RV_REF(T2) a2
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      , v2_(boost::move(a2))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      , v2_(boost::move(BOOST_THREAD_RV(f).v2_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+            , boost::move(v2_)
+        );
+      }
+    };
+    template <class Fp, class T0, class T1>
+    class invoker<Fp, T0, T1>
+    {
+      Fp fp_;
+      T0 v0_;
+      T1 v1_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0, T1)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+          , BOOST_THREAD_RV_REF(T1) a1
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      , v1_(boost::move(a1))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      , v1_(boost::move(BOOST_THREAD_RV(f).v1_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+            , boost::move(v1_)
+        );
+      }
+    };
+    template <class Fp, class T0>
+    class invoker<Fp, T0>
+    {
+      Fp fp_;
+      T0 v0_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp(T0)>::type result_type;
+
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f
+          , BOOST_THREAD_RV_REF(T0) a0
+      )
+      : fp_(boost::move(f))
+      , v0_(boost::move(a0))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(BOOST_THREAD_RV(f).fp))
+      , v0_(boost::move(BOOST_THREAD_RV(f).v0_))
+      {}
+
+      result_type operator()()
+      {
+        return invoke(boost::move(fp_)
+            , boost::move(v0_)
+        );
+      }
+    };
+    template <class Fp>
+    class invoker<Fp>
+    {
+      Fp fp_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp()>::type result_type;
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(BOOST_THREAD_FWD_REF(Fp) f)
+      : fp_(boost::move(f))
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(boost::move(f.fp_))
+      {}
+      result_type operator()()
+      {
+        return fp_();
+      }
+    };
+    template <class R>
+    class invoker<R(*)()>
+    {
+      typedef R(*Fp)();
+      Fp fp_;
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(invoker)
+      typedef typename result_of<Fp()>::type result_type;
+      BOOST_SYMBOL_VISIBLE
+      explicit invoker(Fp f)
+      : fp_(f)
+      {}
+
+      BOOST_SYMBOL_VISIBLE
+      invoker(BOOST_THREAD_RV_REF(invoker) f)
+      : fp_(f.fp_)
+      {}
+      result_type operator()()
+      {
+        return fp_();
+      }
+    };
+#endif
+#endif
+
+  }
+}
+
+#include <boost/thread/detail/variadic_footer.hpp>
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/nullary_function.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,234 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+//    Make use of Boost.Move
+
+#ifndef BOOST_THREAD_DETAIL_NULLARY_FUNCTION_HPP
+#define BOOST_THREAD_DETAIL_NULLARY_FUNCTION_HPP
+
+#include <boost/config.hpp>
+#include <boost/thread/detail/memory.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/csbl/memory/shared_ptr.hpp>
+#include <boost/type_traits/decay.hpp>
+
+namespace boost
+{
+  namespace detail
+  {
+
+    template <typename F>
+    class nullary_function;
+    template <>
+    class nullary_function<void()>
+    {
+      struct impl_base
+      {
+        virtual void call()=0;
+        virtual ~impl_base()
+        {
+        }
+      };
+      csbl::shared_ptr<impl_base> impl;
+      template <typename F>
+      struct impl_type: impl_base
+      {
+        F f;
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        impl_type(F &f_)
+          : f(f_)
+        {}
+#endif
+        impl_type(BOOST_THREAD_RV_REF(F) f_)
+          : f(boost::move(f_))
+        {}
+
+        void call()
+        {
+          f();
+        }
+      };
+      struct impl_type_ptr: impl_base
+      {
+        void (*f)();
+        impl_type_ptr(void (*f_)())
+          : f(f_)
+        {}
+        void call()
+        {
+          f();
+        }
+      };
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(nullary_function)
+
+      explicit nullary_function(void (*f)()):
+      impl(new impl_type_ptr(f))
+      {}
+
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+      template<typename F>
+      explicit nullary_function(F& f):
+      impl(new impl_type<F>(f))
+      {}
+#endif
+      template<typename F>
+      nullary_function(BOOST_THREAD_RV_REF(F) f):
+      impl(new impl_type<typename decay<F>::type>(thread_detail::decay_copy(boost::forward<F>(f))))
+      {}
+
+      nullary_function()
+        : impl()
+      {
+      }
+      nullary_function(nullary_function const& other) BOOST_NOEXCEPT :
+      impl(other.impl)
+      {
+      }
+      nullary_function(BOOST_THREAD_RV_REF(nullary_function) other) BOOST_NOEXCEPT :
+#if defined BOOST_NO_CXX11_SMART_PTR
+      impl(BOOST_THREAD_RV(other).impl)
+      {
+        BOOST_THREAD_RV(other).impl.reset();
+      }
+#else
+      impl(boost::move(other.impl))
+      {
+      }
+#endif
+      ~nullary_function()
+      {
+      }
+
+      nullary_function& operator=(BOOST_THREAD_COPY_ASSIGN_REF(nullary_function) other) BOOST_NOEXCEPT
+      {
+        impl=other.impl;
+        return *this;
+      }
+      nullary_function& operator=(BOOST_THREAD_RV_REF(nullary_function) other) BOOST_NOEXCEPT
+      {
+#if defined BOOST_NO_CXX11_SMART_PTR
+        impl=BOOST_THREAD_RV(other).impl;
+        BOOST_THREAD_RV(other).impl.reset();
+#else
+        impl = boost::move(other.impl);
+#endif
+        return *this;
+      }
+
+
+      void operator()()
+      { if (impl) impl->call();}
+
+    };
+
+    template <typename R>
+    class nullary_function<R()>
+    {
+      struct impl_base
+      {
+        virtual R call()=0;
+        virtual ~impl_base()
+        {
+        }
+      };
+      csbl::shared_ptr<impl_base> impl;
+      template <typename F>
+      struct impl_type: impl_base
+      {
+        F f;
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+        impl_type(F &f_)
+          : f(f_)
+        {}
+#endif
+        impl_type(BOOST_THREAD_RV_REF(F) f_)
+          : f(boost::move(f_))
+        {}
+
+        R call()
+        {
+          return f();
+        }
+      };
+      struct impl_type_ptr: impl_base
+      {
+        R (*f)();
+        impl_type_ptr(R (*f_)())
+          : f(f_)
+        {}
+
+        R call()
+        {
+          return f();
+        }
+      };
+    public:
+      BOOST_THREAD_COPYABLE_AND_MOVABLE(nullary_function)
+
+      nullary_function(R (*f)()):
+      impl(new impl_type_ptr(f))
+      {}
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+      template<typename F>
+      nullary_function(F& f):
+      impl(new impl_type<F>(f))
+      {}
+#endif
+      template<typename F>
+      nullary_function(BOOST_THREAD_RV_REF(F) f):
+      impl(new impl_type<typename decay<F>::type>(thread_detail::decay_copy(boost::forward<F>(f))))
+      {}
+
+      nullary_function(nullary_function const& other) BOOST_NOEXCEPT :
+      impl(other.impl)
+      {
+      }
+      nullary_function(BOOST_THREAD_RV_REF(nullary_function) other) BOOST_NOEXCEPT :
+#if defined BOOST_NO_CXX11_SMART_PTR
+      impl(BOOST_THREAD_RV(other).impl)
+      {
+        BOOST_THREAD_RV(other).impl.reset();
+      }
+#else
+      impl(boost::move(other.impl))
+      {
+      }
+#endif
+      nullary_function()
+        : impl()
+      {
+      }
+      ~nullary_function()
+      {
+      }
+
+      nullary_function& operator=(BOOST_THREAD_COPY_ASSIGN_REF(nullary_function) other) BOOST_NOEXCEPT
+      {
+        impl=other.impl;
+        return *this;
+      }
+      nullary_function& operator=(BOOST_THREAD_RV_REF(nullary_function) other) BOOST_NOEXCEPT
+      {
+#if defined BOOST_NO_CXX11_SMART_PTR
+        impl=BOOST_THREAD_RV(other).impl;
+        BOOST_THREAD_RV(other).impl.reset();
+#else
+        impl = boost::move(other.impl);
+#endif
+        return *this;
+      }
+
+      R operator()()
+      { if (impl) return impl->call(); else return R();}
+
+    };
+  }
+  //BOOST_THREAD_DCL_MOVABLE_BEG(F) detail::nullary_function<F> BOOST_THREAD_DCL_MOVABLE_END
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/variadic_footer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,10 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if defined BOOST_NO_CXX11_VARIADIC_TEMPLATES
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/detail/variadic_header.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,19 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+//#if defined BOOST_NO_CXX11_VARIADIC_TEMPLATES
+
+#include <boost/preprocessor/facilities/intercept.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#ifndef BOOST_THREAD_MAX_ARGS
+#define BOOST_THREAD_MAX_ARGS 9
+#endif
+
+//#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/exceptional_ptr.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// (C) Copyright 2014 Vicente J. Botet Escriba
+
+#ifndef BOOST_THREAD_EXCEPTIONAL_PTR_HPP
+#define BOOST_THREAD_EXCEPTIONAL_PTR_HPP
+
+#include <boost/thread/detail/move.hpp>
+#include <boost/exception_ptr.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+  struct exceptional_ptr {
+    exception_ptr ptr_;
+
+    exceptional_ptr() : ptr_() {}
+    explicit exceptional_ptr(exception_ptr ex) : ptr_(ex) {}
+    template <class E>
+    explicit exceptional_ptr(BOOST_FWD_REF(E) ex) : ptr_(boost::copy_exception(boost::forward<E>(ex))) {}
+  };
+
+  template <class E>
+  inline exceptional_ptr make_exceptional(BOOST_FWD_REF(E) ex) {
+    return exceptional_ptr(boost::forward<E>(ex));
+  }
+
+  inline exceptional_ptr make_exceptional(exception_ptr ex)
+  {
+    return exceptional_ptr(ex);
+  }
+
+  inline exceptional_ptr make_exceptional()
+  {
+    return exceptional_ptr();
+  }
+
+} // namespace boost
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+
+#ifndef BOOST_THREAD_EXECUTOR_HPP
+#define BOOST_THREAD_EXECUTOR_HPP
+
+#include <boost/thread/executors/executor.hpp>
+#include <boost/thread/executors/executor_adaptor.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/basic_thread_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,311 @@
+// Copyright (C) 2013-2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+//    first implementation of a simple pool thread using a vector of threads and a sync_queue.
+
+#ifndef BOOST_THREAD_EXECUTORS_BASIC_THREAD_POOL_HPP
+#define BOOST_THREAD_EXECUTORS_BASIC_THREAD_POOL_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/scoped_thread.hpp>
+#include <boost/thread/concurrent_queues/sync_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+#include <boost/thread/csbl/vector.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  class basic_thread_pool
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+  private:
+    /// the kind of stored threads are scoped threads to ensure that the threads are joined.
+    /// A move aware vector type
+    typedef scoped_thread<> thread_t;
+    typedef csbl::vector<thread_t> thread_vector;
+
+    /// the thread safe work queue
+    concurrent::sync_queue<work > work_queue;
+    /// A move aware vector
+    thread_vector threads;
+
+  public:
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      try
+      {
+        work task;
+        if (work_queue.try_pull(task) == queue_op_status::success)
+        {
+          task();
+          return true;
+        }
+        return false;
+      }
+      catch (...)
+      {
+        std::terminate();
+        return false;
+      }
+    }
+    /**
+     * Effects: schedule one task or yields
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    void schedule_one_or_yield()
+    {
+        if ( ! try_executing_one())
+        {
+          this_thread::yield();
+        }
+    }
+  private:
+
+    /**
+     * The main loop of the worker threads
+     */
+    void worker_thread()
+    {
+      try
+      {
+        for(;;)
+        {
+          work task;
+          queue_op_status st = work_queue.wait_pull(task);
+          if (st == queue_op_status::closed) return;
+          task();
+        }
+      }
+      catch (...)
+      {
+        std::terminate();
+        return;
+      }
+    }
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <class AtThreadEntry>
+    void worker_thread1(AtThreadEntry& at_thread_entry)
+    {
+      at_thread_entry(*this);
+      worker_thread();
+    }
+#endif
+    void worker_thread2(void(*at_thread_entry)(basic_thread_pool&))
+    {
+      at_thread_entry(*this);
+      worker_thread();
+    }
+    template <class AtThreadEntry>
+    void worker_thread3(BOOST_THREAD_FWD_REF(AtThreadEntry) at_thread_entry)
+    {
+      at_thread_entry(*this);
+      worker_thread();
+    }
+    static void do_nothing_at_thread_entry(basic_thread_pool&) {}
+
+  public:
+    /// basic_thread_pool is not copyable.
+    BOOST_THREAD_NO_COPYABLE(basic_thread_pool)
+
+    /**
+     * \b Effects: creates a thread pool that runs closures on \c thread_count threads.
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     */
+    basic_thread_pool(unsigned const thread_count = thread::hardware_concurrency()+1)
+    {
+      try
+      {
+        threads.reserve(thread_count);
+        for (unsigned i = 0; i < thread_count; ++i)
+        {
+#if 1
+          thread th (&basic_thread_pool::worker_thread, this);
+          threads.push_back(thread_t(boost::move(th)));
+#else
+          threads.push_back(thread_t(&basic_thread_pool::worker_thread, this)); // do not compile
+#endif
+        }
+      }
+      catch (...)
+      {
+        close();
+        throw;
+      }
+    }
+    /**
+     * \b Effects: creates a thread pool that runs closures on \c thread_count threads
+     * and executes the at_thread_entry function at the entry of each created thread. .
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     */
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <class AtThreadEntry>
+    basic_thread_pool( unsigned const thread_count, AtThreadEntry& at_thread_entry)
+    {
+      try
+      {
+        threads.reserve(thread_count);
+        for (unsigned i = 0; i < thread_count; ++i)
+        {
+          thread th (&basic_thread_pool::worker_thread1<AtThreadEntry>, this, at_thread_entry);
+          threads.push_back(thread_t(boost::move(th)));
+          //threads.push_back(thread_t(&basic_thread_pool::worker_thread, this)); // do not compile
+        }
+      }
+      catch (...)
+      {
+        close();
+        throw;
+      }
+    }
+#endif
+    basic_thread_pool( unsigned const thread_count, void(*at_thread_entry)(basic_thread_pool&))
+    {
+      try
+      {
+        threads.reserve(thread_count);
+        for (unsigned i = 0; i < thread_count; ++i)
+        {
+          thread th (&basic_thread_pool::worker_thread2, this, at_thread_entry);
+          threads.push_back(thread_t(boost::move(th)));
+          //threads.push_back(thread_t(&basic_thread_pool::worker_thread, this)); // do not compile
+        }
+      }
+      catch (...)
+      {
+        close();
+        throw;
+      }
+    }
+    template <class AtThreadEntry>
+    basic_thread_pool( unsigned const thread_count, BOOST_THREAD_FWD_REF(AtThreadEntry) at_thread_entry)
+    {
+      try
+      {
+        threads.reserve(thread_count);
+        for (unsigned i = 0; i < thread_count; ++i)
+        {
+          thread th (&basic_thread_pool::worker_thread3<AtThreadEntry>, this, boost::forward<AtThreadEntry>(at_thread_entry));
+          threads.push_back(thread_t(boost::move(th)));
+          //threads.push_back(thread_t(&basic_thread_pool::worker_thread, this)); // do not compile
+        }
+      }
+      catch (...)
+      {
+        close();
+        throw;
+      }
+    }
+    /**
+     * \b Effects: Destroys the thread pool.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c basic_thread_pool destructor.
+     */
+    ~basic_thread_pool()
+    {
+      // signal to all the worker threads that there will be no more submissions.
+      close();
+      // joins all the threads as the threads were scoped_threads
+    }
+
+    /**
+     * \b Effects: join all the threads.
+     */
+    void join()
+    {
+      for (unsigned i = 0; i < threads.size(); ++i)
+      {
+        threads[i].join();
+      }
+    }
+
+    /**
+     * \b Effects: close the \c basic_thread_pool for submissions.
+     * The worker threads will work until there is no more closures to run.
+     */
+    void close()
+    {
+      work_queue.close();
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed()
+    {
+      return work_queue.closed();
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c basic_thread_pool will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work_queue.push(work(closure));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work_queue.push(work(closure));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work_queue.push(work(boost::forward<Closure>(closure)));
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+
+  };
+}
+using executors::basic_thread_pool;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/detail/priority_executor_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,77 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_DETAIL_PRIORITY_EXECUTOR_BASE_HPP
+#define BOOST_THREAD_EXECUTORS_DETAIL_PRIORITY_EXECUTOR_BASE_HPP
+
+#include <boost/atomic.hpp>
+#include <boost/function.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/thread/concurrent_queues/sync_timed_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+
+namespace boost
+{
+namespace executors
+{
+namespace detail
+{
+  template <class Queue>
+  class priority_executor_base
+  {
+  public:
+    //typedef boost::function<void()> work;
+    typedef executors::work_pq work;
+  protected:
+    typedef Queue queue_type;
+    queue_type _workq;
+
+    priority_executor_base() {}
+  public:
+
+    ~priority_executor_base()
+    {
+      if(!closed())
+      {
+        this->close();
+      }
+    }
+
+    void close()
+    {
+      _workq.close();
+    }
+
+    bool closed()
+    {
+      return _workq.closed();
+    }
+
+    void loop()
+    {
+      try
+      {
+        for(;;)
+        {
+          work task;
+          queue_op_status st = _workq.wait_pull(task);
+          if (st == queue_op_status::closed) return;
+          task();
+        }
+      }
+      catch (...)
+      {
+        std::terminate();
+        return;
+      }
+    }
+  }; //end class
+
+} //end detail namespace
+} //end executors namespace
+} //end boost namespace
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/detail/scheduled_executor_base.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,66 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_DETAIL_SCHEDULED_EXECUTOR_BASE_HPP
+#define BOOST_THREAD_EXECUTORS_DETAIL_SCHEDULED_EXECUTOR_BASE_HPP
+
+#include <boost/thread/concurrent_queues/sync_timed_queue.hpp>
+#include <boost/thread/executors/detail/priority_executor_base.hpp>
+#include <boost/thread/executors/work.hpp>
+#include <boost/thread/thread.hpp>
+
+#include <boost/atomic.hpp>
+#include <boost/function.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+namespace detail
+{
+  template <class Clock=chrono::steady_clock>
+  class scheduled_executor_base : public priority_executor_base<concurrent::sync_timed_queue<executors::work_pq, Clock  > >
+  {
+  public:
+    typedef executors::work_pq work;
+    typedef Clock clock;
+    typedef typename clock::duration duration;
+    typedef typename clock::time_point time_point;
+  protected:
+
+    scheduled_executor_base() {}
+  public:
+
+    ~scheduled_executor_base()
+    {
+      if(! this->closed())
+      {
+        this->close();
+      }
+    }
+
+    void submit_at(work w, const time_point& tp)
+    {
+      this->_workq.push(boost::move(w), tp);
+    }
+
+    void submit_after(work w, const duration& dura)
+    {
+      this->_workq.push(boost::move(w), dura+clock::now());
+    }
+
+  }; //end class
+
+} //end detail namespace
+} //end executors namespace
+} //end boost namespace
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,147 @@
+// Copyright (C) 2013,2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+
+#ifndef BOOST_THREAD_EXECUTORS_EXECUTOR_HPP
+#define BOOST_THREAD_EXECUTORS_EXECUTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/executors/work.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+  namespace executors
+  {
+  class executor
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+
+    /// executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(executor)
+    executor() {}
+
+    /**
+     * \par Effects
+     * Destroys the executor.
+     *
+     * \par Synchronization
+     * The completion of all the closures happen before the completion of the executor destructor.
+     */
+    virtual ~executor() {};
+
+    /**
+     * \par Effects
+     * Close the \c executor for submissions.
+     * The worker threads will work until there is no more closures to run.
+     */
+    virtual void close() = 0;
+
+    /**
+     * \par Returns
+     * Whether the pool is closed for submissions.
+     */
+    virtual bool closed() = 0;
+
+    /**
+     * \par Effects
+     * The specified closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the executor will call std::terminate, as is the case with threads.
+     *
+     * \par Synchronization
+     * Ccompletion of closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \par Throws
+     * \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+    virtual void submit(BOOST_THREAD_RV_REF(work) closure) = 0;
+//    virtual void submit(work& closure) = 0;
+
+    /**
+     * \par Requires
+     * \c Closure is a model of Callable(void()) and a model of CopyConstructible/MoveConstructible.
+     *
+     * \par Effects
+     * The specified closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the thread pool will call std::terminate, as is the case with threads.
+     *
+     * \par Synchronization
+     * Completion of closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \par Throws
+     * \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work w ((closure));
+      submit(boost::move(w));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work w ((closure));
+      submit(boost::move(w));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work w = boost::move(closure);
+      submit(boost::move(w));
+    }
+
+    /**
+     * \par Effects
+     * Try to execute one task.
+     *
+     * \par Returns
+     * Whether a task has been executed.
+     *
+     * \par Throws
+     * Whatever the current task constructor throws or the task() throws.
+     */
+    virtual bool try_executing_one() = 0;
+
+    /**
+     * \par Requires
+     * This must be called from an scheduled task.
+     *
+     * \par Effects
+     * Reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        //schedule_one_or_yield();
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+  };
+
+  }
+  using executors::executor;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/executor_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,137 @@
+// Copyright (C) 2013,2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+
+#ifndef BOOST_THREAD_EXECUTORS_EXECUTOR_ADAPTOR_HPP
+#define BOOST_THREAD_EXECUTORS_EXECUTOR_ADAPTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/executors/executor.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  /**
+   * Polymorphic adaptor of a model of Executor to an executor.
+   */
+  template <typename Executor>
+  class executor_adaptor : public executor
+  {
+    Executor ex;
+  public:
+    /// type-erasure to store the works to do
+    typedef  executor::work work;
+
+    /// executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(executor_adaptor)
+
+    /**
+     * executor_adaptor constructor
+     */
+#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+    template <typename ...Args>
+    executor_adaptor(BOOST_THREAD_RV_REF(Args) ... args) : ex(boost::forward<Args>(args)...) {}
+#else
+    /**
+     * executor_adaptor constructor
+     */
+    executor_adaptor() : ex() {}
+
+    template <typename A1>
+    executor_adaptor(
+        BOOST_THREAD_FWD_REF(A1) a1
+        ) :
+      ex(
+          boost::forward<A1>(a1)
+          ) {}
+    template <typename A1, typename A2>
+    executor_adaptor(
+        BOOST_THREAD_FWD_REF(A1) a1,
+        BOOST_THREAD_FWD_REF(A2) a2
+        ) :
+      ex(
+          boost::forward<A1>(a1),
+          boost::forward<A2>(a2)
+          ) {}
+    template <typename A1, typename A2, typename A3>
+    executor_adaptor(
+        BOOST_THREAD_FWD_REF(A1) a1,
+        BOOST_THREAD_FWD_REF(A2) a2,
+        BOOST_THREAD_FWD_REF(A3) a3
+        ) :
+      ex(
+          boost::forward<A1>(a1),
+          boost::forward<A2>(a2),
+          boost::forward<A3>(a3)
+          ) {}
+#endif
+    Executor& underlying_executor() { return ex; }
+
+    /**
+     * \b Effects: close the \c executor for submissions.
+     * The worker threads will work until there is no more closures to run.
+     */
+    void close() { ex.close(); }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed() { return ex.closed(); }
+
+    /**
+     * \b Effects: The specified closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the executor will call std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+    void submit(BOOST_THREAD_RV_REF(work) closure)  {
+      return ex.submit(boost::move(closure));
+    }
+//    void submit(work & closure)  {
+//      return ex.submit(closure);
+//    }
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      submit(work(closure));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      submit(work(closure));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      submit(work(boost::forward<Closure>(closure)));
+    }
+
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one() { return ex.try_executing_one(); }
+
+  };
+}
+using executors::executor_adaptor;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/generic_executor_ref.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,211 @@
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_GENERIC_EXECUTOR_REF_HPP
+#define BOOST_THREAD_EXECUTORS_GENERIC_EXECUTOR_REF_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/executors/executor.hpp>
+
+#include <boost/shared_ptr.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+  namespace executors
+  {
+
+  template <class Executor>
+  class executor_ref : public executor
+  {
+    Executor& ex;
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+
+    /// executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(executor_ref)
+    executor_ref(Executor& ex) : ex(ex) {}
+
+    /**
+     * \par Effects
+     * Destroys the executor.
+     *
+     * \par Synchronization
+     * The completion of all the closures happen before the completion of the executor destructor.
+     */
+    ~executor_ref() {};
+
+    /**
+     * \par Effects
+     * Close the \c executor for submissions.
+     * The worker threads will work until there is no more closures to run.
+     */
+    void close() { ex.close(); }
+
+    /**
+     * \par Returns
+     * Whether the pool is closed for submissions.
+     */
+    bool closed() { return ex.closed(); }
+
+    /**
+     * \par Effects
+     * The specified closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the executor will call std::terminate, as is the case with threads.
+     *
+     * \par Synchronization
+     * Ccompletion of closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \par Throws
+     * \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+    void submit(BOOST_THREAD_RV_REF(work) closure) {
+      ex.submit(boost::move(closure));
+    }
+//    void submit(work& closure) {
+//      ex.submit(closure);
+//    }
+
+
+    /**
+     * \par Effects
+     * Try to execute one task.
+     *
+     * \par Returns
+     * Whether a task has been executed.
+     *
+     * \par Throws
+     * Whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one() { return ex.try_executing_one(); }
+
+  };
+
+  class generic_executor_ref
+  {
+    shared_ptr<executor> ex;
+  public:
+    /// type-erasure to store the works to do
+    typedef executors::work work;
+
+    template<typename Executor>
+    generic_executor_ref(Executor& ex)
+    //: ex(make_shared<executor_ref<Executor> >(ex)) // todo check why this doesn't works with C++03
+    : ex( new executor_ref<Executor>(ex) )
+    {
+    }
+
+    //generic_executor_ref(generic_executor_ref const& other) noexcept    {}
+    //generic_executor_ref& operator=(generic_executor_ref const& other) noexcept    {}
+
+
+    /**
+     * \par Effects
+     * Close the \c executor for submissions.
+     * The worker threads will work until there is no more closures to run.
+     */
+    void close() { ex->close(); }
+
+    /**
+     * \par Returns
+     * Whether the pool is closed for submissions.
+     */
+    bool closed() { return ex->closed(); }
+
+    void submit(BOOST_THREAD_RV_REF(work) closure)
+    {
+      ex->submit(boost::forward<work>(closure));
+    }
+
+    /**
+     * \par Requires
+     * \c Closure is a model of Callable(void()) and a model of CopyConstructible/MoveConstructible.
+     *
+     * \par Effects
+     * The specified closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the thread pool will call std::terminate, as is the case with threads.
+     *
+     * \par Synchronization
+     * Completion of closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \par Throws
+     * \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work w ((closure));
+      submit(boost::move(w));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work w ((closure));
+      submit(boost::move(w));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work w = boost::move(closure);
+      submit(boost::move(w));
+    }
+
+//    size_t num_pending_closures() const
+//    {
+//      return ex->num_pending_closures();
+//    }
+
+    /**
+     * \par Effects
+     * Try to execute one task.
+     *
+     * \par Returns
+     * Whether a task has been executed.
+     *
+     * \par Throws
+     * Whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one() { return ex->try_executing_one(); }
+
+    /**
+     * \par Requires
+     * This must be called from an scheduled task.
+     *
+     * \par Effects
+     * reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        //schedule_one_or_yield();
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+
+  };
+  }
+  using executors::executor_ref;
+  using executors::generic_executor_ref;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/inline_executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,171 @@
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/11 Vicente J. Botet Escriba
+//    first implementation of a simple serial scheduler.
+
+#ifndef BOOST_THREAD_INLINE_EXECUTOR_HPP
+#define BOOST_THREAD_INLINE_EXECUTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/executors/work.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  class inline_executor
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+    bool closed_;
+    mutable mutex mtx_;
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      return false;
+    }
+
+  public:
+    /// inline_executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(inline_executor)
+
+    /**
+     * \b Effects: creates a inline executor that runs closures immediately.
+     *
+     * \b Throws: Nothing.
+     */
+    inline_executor()
+    : closed_(false)
+    {
+    }
+    /**
+     * \b Effects: Destroys the inline executor.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c inline_executor destructor.
+     */
+    ~inline_executor()
+    {
+      // signal to all the worker thread that there will be no more submissions.
+      close();
+    }
+
+    /**
+     * \b Effects: close the \c inline_executor for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed(lock_guard<mutex>& )
+    {
+      return closed_;
+    }
+    bool closed()
+    {
+      lock_guard<mutex> lk(mtx_);
+      return closed(lk);
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c inline_executor will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      {
+        lock_guard<mutex> lk(mtx_);
+        if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      }
+      try
+      {
+        closure();
+      }
+      catch (...)
+      {
+        std::terminate();
+        return;
+      }
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      {
+        lock_guard<mutex> lk(mtx_);
+        if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      }
+      try
+      {
+        closure();
+      }
+      catch (...)
+      {
+        std::terminate();
+        return;
+      }
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_FWD_REF(Closure) closure)
+    {
+      {
+        lock_guard<mutex> lk(mtx_);
+        if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      }
+      try
+      {
+        closure();
+      }
+      catch (...)
+      {
+        std::terminate();
+        return;
+      }
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& )
+    {
+      return false;
+    }
+
+  };
+}
+using executors::inline_executor;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/loop_executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,199 @@
+// Copyright (C) 2013,2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/11 Vicente J. Botet Escriba
+//    first implementation of a simple user scheduler.
+// 2013/11 Vicente J. Botet Escriba
+//    rename loop_executor.
+
+#ifndef BOOST_THREAD_EXECUTORS_LOOP_EXECUTOR_HPP
+#define BOOST_THREAD_EXECUTORS_LOOP_EXECUTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/sync_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+
+  class loop_executor
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+  private:
+    /// the thread safe work queue
+    concurrent::sync_queue<work > work_queue;
+
+  public:
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      work task;
+      try
+      {
+        if (work_queue.try_pull(task) == queue_op_status::success)
+        {
+          task();
+          return true;
+        }
+        return false;
+      }
+      catch (...)
+      {
+        std::terminate();
+        return false;
+      }
+    }
+  private:
+    /**
+     * Effects: schedule one task or yields
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    void schedule_one_or_yield()
+    {
+        if ( ! try_executing_one())
+        {
+          this_thread::yield();
+        }
+    }
+
+
+
+
+  public:
+    /// loop_executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(loop_executor)
+
+    /**
+     * \b Effects: creates a thread pool that runs closures using one of its closure-executing methods.
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     */
+    loop_executor()
+    {
+    }
+    /**
+     * \b Effects: Destroys the thread pool.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c loop_executor destructor.
+     */
+    ~loop_executor()
+    {
+      // signal to all the worker thread that there will be no more submissions.
+      close();
+    }
+
+    /**
+     * The main loop of the worker thread
+     */
+    void loop()
+    {
+      while (!closed())
+      {
+        schedule_one_or_yield();
+      }
+      while (try_executing_one())
+      {
+      }
+    }
+
+    /**
+     * \b Effects: close the \c loop_executor for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      work_queue.close();
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed()
+    {
+      return work_queue.closed();
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c loop_executor will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work_queue.push(work(closure));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work_queue.push(work(closure));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work_queue.push(work(boost::forward<Closure>(closure)));
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+
+    /**
+     * run queued closures
+     */
+    void run_queued_closures()
+    {
+      sync_queue<work>::underlying_queue_type q = work_queue.underlying_queue();
+      while (! q.empty())
+      {
+        work& task = q.front();
+        task();
+        q.pop_front();
+      }
+    }
+
+  };
+}
+using executors::loop_executor;
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/scheduled_thread_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,48 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_SCHEDULED_THREAD_POOL_HPP
+#define BOOST_THREAD_EXECUTORS_SCHEDULED_THREAD_POOL_HPP
+
+#include <boost/thread/executors/detail/scheduled_executor_base.hpp>
+
+namespace boost
+{
+namespace executors
+{
+
+  class scheduled_thread_pool : public detail::scheduled_executor_base<>
+  {
+  private:
+    thread_group _workers;
+  public:
+
+    scheduled_thread_pool(size_t num_threads) : super()
+    {
+      for(size_t i = 0; i < num_threads; i++)
+      {
+        _workers.create_thread(bind(&super::loop, this));
+      }
+    }
+
+    ~scheduled_thread_pool()
+    {
+      this->close();
+      _workers.join_all();
+    }
+
+  private:
+    typedef detail::scheduled_executor_base<> super;
+  }; //end class
+
+} //end executors namespace
+
+using executors::scheduled_thread_pool;
+
+} //end boost
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/scheduler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,271 @@
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_SCHEDULER_HPP
+#define BOOST_THREAD_EXECUTORS_SCHEDULER_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/executors/detail/scheduled_executor_base.hpp>
+
+#include <boost/chrono/time_point.hpp>
+#include <boost/chrono/duration.hpp>
+#include <boost/chrono/system_clocks.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+  namespace executors
+  {
+    /// Wraps the reference to an executor and a function to make a work that submit the function using the executor.
+    template <class Executor, class Function>
+    class resubmitter
+    {
+    public:
+      resubmitter(Executor& ex, Function funct) :
+        ex(ex),
+        funct(boost::move(funct))
+      {}
+
+      void operator()()
+      {
+        ex.submit(funct);
+      }
+
+    private:
+      Executor&   ex;
+      Function funct;
+    };
+
+    /// resubmitter factory
+    template <class Executor, class Function>
+    resubmitter<Executor, typename decay<Function>::type>
+    resubmit(Executor& ex, BOOST_THREAD_FWD_REF(Function) funct) {
+      return resubmitter<Executor, typename decay<Function>::type >(ex, boost::move(funct));
+    }
+
+    /// Wraps references to a @c Scheduler and an @c Executor providing an @c Executor that
+    /// resubmit the function using the referenced Executor at a given @c time_point known at construction.
+    template <class Scheduler, class Executor>
+    class resubmit_at_executor
+    {
+    public:
+      typedef typename Scheduler::clock clock;
+      typedef typename Scheduler::work work;
+
+      template <class Duration>
+      resubmit_at_executor(Scheduler& sch, Executor& ex, chrono::time_point<clock, Duration> const& tp) :
+        sch(sch),
+        ex(ex),
+        tp(tp),
+        is_closed(false)
+      {
+      }
+
+      ~resubmit_at_executor()
+      {
+        close();
+      }
+
+      template <class Work>
+      void submit(BOOST_THREAD_FWD_REF(Work) w)
+      {
+        if (closed())
+        {
+          BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+        }
+        sch.submit_at(resubmit(ex,boost::forward<Work>(w)), tp);
+      }
+
+      Executor& underlying_executor()
+      {
+          return ex;
+      }
+      Scheduler& underlying_scheduler()
+      {
+          return sch;
+      }
+
+      void close()
+      {
+        is_closed = true;
+      }
+
+      bool closed()
+      {
+        return is_closed || sch.closed() || ex.closed();
+      }
+
+    private:
+      Scheduler&  sch;
+      Executor&   ex;
+      typename clock::time_point  tp;
+      bool  is_closed;
+    };
+
+
+    /// Expression template helper storing a pair of references to an @c Scheduler and an @c Executor
+    /// It provides factory helper functions such as at/after that convert these a pair of @c Scheduler @c Executor
+    /// into an new @c Executor that submit the work using the referenced @c Executor at/after a specific time/duration
+    /// respectively, using the referenced @Scheduler.
+    template <class Scheduler, class Executor>
+    class scheduler_executor_wrapper
+    {
+    public:
+      typedef typename Scheduler::clock clock;
+      typedef typename Scheduler::work work;
+      typedef resubmit_at_executor<Scheduler, Executor> the_executor;
+
+      scheduler_executor_wrapper(Scheduler& sch, Executor& ex) :
+          sch(sch),
+          ex(ex)
+      {}
+
+      ~scheduler_executor_wrapper()
+      {
+      }
+
+      Executor& underlying_executor()
+      {
+          return ex;
+      }
+      Scheduler& underlying_scheduler()
+      {
+          return sch;
+      }
+
+      template <class Rep, class Period>
+      the_executor after(chrono::duration<Rep,Period> const& rel_time)
+      {
+        return at(clock::now() + rel_time );
+      }
+
+      template <class Duration>
+      the_executor at(chrono::time_point<clock,Duration> const& abs_time)
+      {
+        return the_executor(sch, ex, abs_time);
+      }
+
+    private:
+      Scheduler& sch;
+      Executor& ex;
+    }; //end class
+
+    /// Wraps a reference to a @c Scheduler providing an @c Executor that
+    /// run the function at a given @c time_point known at construction.
+    template <class Scheduler>
+    class at_executor
+    {
+    public:
+      typedef typename Scheduler::clock clock;
+      typedef typename Scheduler::work work;
+      typedef typename clock::time_point time_point;
+
+      template <class Duration>
+      at_executor(Scheduler& sch, chrono::time_point<clock,Duration> const& tp) :
+          sch(sch),
+          tp(tp),
+          is_closed(false)
+      {}
+
+      ~at_executor()
+      {
+        close();
+      }
+
+      Scheduler& underlying_scheduler()
+      {
+          return sch;
+      }
+
+      void close()
+      {
+        is_closed = true;
+      }
+
+      bool closed()
+      {
+        return is_closed || sch.closed();
+      }
+
+      template <class Work>
+      void submit(BOOST_THREAD_FWD_REF(Work) w)
+      {
+        if (closed())
+        {
+          BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+        }
+        sch.submit_at(boost::forward<Work>(w), tp);
+      }
+
+      template <class Executor>
+      resubmit_at_executor<Scheduler, Executor> on(Executor& ex)
+      {
+        return resubmit_at_executor<Scheduler, Executor>(sch, ex, tp);
+      }
+
+    private:
+      Scheduler& sch;
+      time_point  tp;
+      bool  is_closed;
+    }; //end class
+
+    /// A @c Scheduler using a specific thread. Note that a Scheduler is not an Executor.
+    /// It provides factory helper functions such as at/after that convert a @c Scheduler into an @c Executor
+    /// that submit the work at/after a specific time/duration respectively.
+    template <class Clock = chrono::steady_clock>
+    class scheduler : public detail::scheduled_executor_base<Clock>
+    {
+    public:
+      typedef typename detail::scheduled_executor_base<Clock>::work work;
+
+      typedef Clock clock;
+
+      scheduler()
+        : super(),
+          thr(&super::loop, this) {}
+
+      ~scheduler()
+      {
+        this->close();
+        thr.join();
+      }
+      template <class Ex>
+      scheduler_executor_wrapper<scheduler, Ex> on(Ex& ex)
+      {
+        return scheduler_executor_wrapper<scheduler, Ex>(*this, ex);
+      }
+
+      template <class Rep, class Period>
+      at_executor<scheduler> after(chrono::duration<Rep,Period> const& rel_time)
+      {
+        return at(rel_time + clock::now());
+      }
+
+      template <class Duration>
+      at_executor<scheduler> at(chrono::time_point<clock,Duration> const& tp)
+      {
+        return at_executor<scheduler>(*this, tp);
+      }
+
+    private:
+      typedef detail::scheduled_executor_base<Clock> super;
+      thread thr;
+    };
+
+
+  }
+  using executors::resubmitter;
+  using executors::resubmit;
+  using executors::resubmit_at_executor;
+  using executors::scheduler_executor_wrapper;
+  using executors::at_executor;
+  using executors::scheduler;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/scheduling_adaptor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+// Copyright (C) 2014 Ian Forbed
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_THREAD_EXECUTORS_SCHEDULING_ADAPTOR_HPP
+#define BOOST_THREAD_EXECUTORS_SCHEDULING_ADAPTOR_HPP
+
+#include <boost/thread/executors/detail/scheduled_executor_base.hpp>
+
+namespace boost
+{
+namespace executors
+{
+
+  template <typename Executor>
+  class scheduling_adpator : public detail::scheduled_executor_base<>
+  {
+  private:
+    Executor& _exec;
+    thread _scheduler;
+  public:
+
+    scheduling_adpator(Executor& ex)
+      : super(),
+        _exec(ex),
+        _scheduler(&super::loop, this) {}
+
+    ~scheduling_adpator()
+    {
+      this->close();
+      _scheduler.join();
+    }
+
+    Executor& underlying_executor()
+    {
+        return _exec;
+    }
+
+  private:
+    typedef detail::scheduled_executor_base<> super;
+  }; //end class
+
+} //end executors
+
+  using executors::scheduling_adpator;
+
+} //end boost
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/serial_executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,211 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/11 Vicente J. Botet Escriba
+//    first implementation of a simple serial scheduler.
+
+#ifndef BOOST_THREAD_SERIAL_EXECUTOR_HPP
+#define BOOST_THREAD_SERIAL_EXECUTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/sync_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+#include <boost/thread/executors/generic_executor_ref.hpp>
+#include <boost/thread/future.hpp>
+#include <boost/thread/scoped_thread.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  class serial_executor
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+  private:
+    typedef  scoped_thread<> thread_t;
+
+    /// the thread safe work queue
+    concurrent::sync_queue<work > work_queue;
+    generic_executor_ref ex;
+    thread_t thr;
+
+    struct try_executing_one_task {
+      work& task;
+      boost::promise<void> &p;
+      try_executing_one_task(work& task, boost::promise<void> &p)
+      : task(task), p(p) {}
+      void operator()() {
+        try {
+          task();
+          p.set_value();
+        } catch (...)
+        {
+          p.set_exception(current_exception());
+        }
+      }
+    };
+  public:
+    /**
+     * \par Returns
+     * The underlying executor wrapped on a generic executor reference.
+     */
+    generic_executor_ref& underlying_executor() BOOST_NOEXCEPT { return ex; }
+
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      work task;
+      try
+      {
+        if (work_queue.try_pull(task) == queue_op_status::success)
+        {
+          boost::promise<void> p;
+          try_executing_one_task tmp(task,p);
+          ex.submit(tmp);
+          p.get_future().wait();
+          return true;
+        }
+        return false;
+      }
+      catch (...)
+      {
+        std::terminate();
+        return false;
+      }
+    }
+  private:
+    /**
+     * Effects: schedule one task or yields
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    void schedule_one_or_yield()
+    {
+        if ( ! try_executing_one())
+        {
+          this_thread::yield();
+        }
+    }
+
+    /**
+     * The main loop of the worker thread
+     */
+    void worker_thread()
+    {
+      while (!closed())
+      {
+        schedule_one_or_yield();
+      }
+      while (try_executing_one())
+      {
+      }
+    }
+
+  public:
+    /// serial_executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(serial_executor)
+
+    /**
+     * \b Effects: creates a thread pool that runs closures using one of its closure-executing methods.
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     */
+    template <class Executor>
+    serial_executor(Executor& ex)
+    : ex(ex), thr(&serial_executor::worker_thread, this)
+    {
+    }
+    /**
+     * \b Effects: Destroys the thread pool.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c serial_executor destructor.
+     */
+    ~serial_executor()
+    {
+      // signal to the worker thread that there will be no more submissions.
+      close();
+    }
+
+    /**
+     * \b Effects: close the \c serial_executor for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      work_queue.close();
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed()
+    {
+      return work_queue.closed();
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c serial_executor will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work_queue.push(work(closure));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work_queue.push(work(closure));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work_queue.push(work(boost::forward<Closure>(closure)));
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+
+  };
+}
+using executors::serial_executor;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/serial_executor_cont.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,170 @@
+// Copyright (C) 2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/11 Vicente J. Botet Escriba
+//    first implementation of a simple serial scheduler.
+
+#ifndef BOOST_THREAD_SERIAL_EXECUTOR_CONT_HPP
+#define BOOST_THREAD_SERIAL_EXECUTOR_CONT_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/sync_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+#include <boost/thread/executors/generic_executor_ref.hpp>
+#include <boost/thread/future.hpp>
+#include <boost/thread/scoped_thread.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  class serial_executor_cont
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+  private:
+
+    generic_executor_ref ex_;
+    future<void> fut_; // protected by mtx_
+    bool closed_; // protected by mtx_
+    mutex mtx_;
+
+    struct continuation {
+      work task;
+      template <class X>
+      struct result {
+        typedef void type;
+      };
+      continuation(BOOST_THREAD_RV_REF(work) tsk)
+      : task(boost::move(tsk)) {}
+      void operator()(future<void> f)
+      {
+        try {
+          task();
+        } catch (...)  {
+          std::terminate();
+        }
+      }
+    };
+
+    bool closed(lock_guard<mutex>&) const
+    {
+      return closed_;
+    }
+  public:
+    /**
+     * \par Returns
+     * The underlying executor wrapped on a generic executor reference.
+     */
+    generic_executor_ref& underlying_executor() BOOST_NOEXCEPT { return ex_; }
+
+    /// serial_executor_cont is not copyable.
+    BOOST_THREAD_NO_COPYABLE(serial_executor_cont)
+
+    /**
+     * \b Effects: creates a serial executor that runs closures in fifo order using one the associated executor.
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     *
+     * \b Notes:
+     * * The lifetime of the associated executor must outlive the serial executor.
+     * * The current implementation doesn't support submission from synchronous continuation, that is,
+     *     - the executor must execute the continuation asynchronously or
+     *     - the continuation can not submit to this serial executor.
+     */
+    template <class Executor>
+    serial_executor_cont(Executor& ex)
+    : ex_(ex), fut_(make_ready_future()), closed_(false)
+    {
+    }
+    /**
+     * \b Effects: Destroys the thread pool.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c serial_executor_cont destructor.
+     */
+    ~serial_executor_cont()
+    {
+      // signal to the worker thread that there will be no more submissions.
+      close();
+    }
+
+    /**
+     * \b Effects: close the \c serial_executor_cont for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;;
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed()
+    {
+      lock_guard<mutex> lk(mtx_);
+      return closed(lk);
+    }
+
+    /**
+     * Effects: none.
+     * Returns: always false.
+     * Throws: No.
+     * Remark: A serial executor can not execute one of its pending tasks as the tasks depends on the other tasks.
+     */
+    bool try_executing_one()
+    {
+      return false;
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution after the last submitted closure finish.
+     * If the invoked closure throws an exception the \c serial_executor_cont will call \c std::terminate, as is the case with threads.
+     *
+     * \b Throws: \c sync_queue_is_closed if the executor is closed.
+     * Whatever exception that can be throw while storing the closure.
+     *
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))       BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      fut_ = fut_.then(ex_, continuation(work(closure)));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))       BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      fut_ = fut_.then(ex_, continuation(work(closure)));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))       BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      fut_ = fut_.then(ex_, continuation(work(boost::forward<Closure>(closure))));
+    }
+
+  };
+}
+using executors::serial_executor_cont;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/thread_executor.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,156 @@
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2014/01 Vicente J. Botet Escriba
+//    first implementation of a thread_executor.
+
+#ifndef BOOST_THREAD_THREAD_EXECUTOR_HPP
+#define BOOST_THREAD_THREAD_EXECUTOR_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/executors/work.hpp>
+#include <boost/thread/executors/executor.hpp>
+#include <boost/thread/thread_only.hpp>
+#include <boost/thread/scoped_thread.hpp>
+#include <boost/thread/csbl/vector.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace executors
+{
+  class thread_executor
+  {
+  public:
+    /// type-erasure to store the works to do
+    typedef  executors::work work;
+    bool closed_;
+    typedef scoped_thread<> thread_t;
+    typedef csbl::vector<thread_t> threads_type;
+    threads_type threads_;
+    mutable mutex mtx_;
+
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      return false;
+    }
+
+  public:
+    /// thread_executor is not copyable.
+    BOOST_THREAD_NO_COPYABLE(thread_executor)
+
+    /**
+     * \b Effects: creates a inline executor that runs closures immediately.
+     *
+     * \b Throws: Nothing.
+     */
+    thread_executor()
+    : closed_(false)
+    {
+    }
+    /**
+     * \b Effects: Waits for closures (if any) to complete, then joins and destroys the threads.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c thread_executor destructor.
+     */
+    ~thread_executor()
+    {
+      // signal to all the worker thread that there will be no more submissions.
+      close();
+      // all the scoped threads will join before destroying
+    }
+
+    /**
+     * \b Effects: close the \c thread_executor for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      lock_guard<mutex> lk(mtx_);
+      closed_ = true;
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed(lock_guard<mutex>& )
+    {
+      return closed_;
+    }
+    bool closed()
+    {
+      lock_guard<mutex> lk(mtx_);
+      return closed(lk);
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c thread_executor will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      threads_.reserve(threads_.size() + 1);
+      thread th(closure);
+      threads_.push_back(thread_t(boost::move(th)));
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      threads_.reserve(threads_.size() + 1);
+      thread th(closure);
+      threads_.push_back(thread_t(boost::move(th)));
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_FWD_REF(Closure) closure)
+    {
+      lock_guard<mutex> lk(mtx_);
+      if (closed(lk))  BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
+      threads_.reserve(threads_.size() + 1);
+      thread th(boost::forward<Closure>(closure));
+      threads_.push_back(thread_t(boost::move(th)));
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const&)
+    {
+      return false;
+    }
+
+  };
+}
+using executors::thread_executor;
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/executors/work.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+//  (C) Copyright 2013,2014 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_EXECUTORS_WORK_HPP
+#define BOOST_THREAD_EXECUTORS_WORK_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/nullary_function.hpp>
+#include <boost/thread/csbl/functional.hpp>
+
+namespace boost
+{
+  namespace executors
+  {
+    typedef detail::nullary_function<void()> work;
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+    typedef detail::nullary_function<void()> work_pq;
+    //typedef csbl::function<void()> work_pq;
+#else
+    typedef csbl::function<void()> work_pq;
+#endif
+  }
+} // namespace boost
+
+
+#endif //  BOOST_THREAD_EXECUTORS_WORK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/config/inline_namespace.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,23 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_CONFIG_INLINE_NAMESPACE_HPP
+#define BOOST_THREAD_EXPERIMENTAL_CONFIG_INLINE_NAMESPACE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_INLINE_NAMESPACES)
+# define BOOST_THREAD_INLINE_NAMESPACE(name) inline namespace name
+#else
+# define BOOST_THREAD_INLINE_NAMESPACE(name) namespace name
+#endif
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/exception_list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_EXCEPTION_LIST_HPP
+#define BOOST_THREAD_EXPERIMENTAL_EXCEPTION_LIST_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/experimental/parallel/v1/exception_list.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v1/exception_list.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,70 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_PARALLEL_V1_EXCEPTION_LIST_HPP
+#define BOOST_THREAD_EXPERIMENTAL_PARALLEL_V1_EXCEPTION_LIST_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/experimental/parallel/v1/inline_namespace.hpp>
+
+#include <boost/exception_ptr.hpp>
+#include <exception>
+#include <list>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+namespace experimental
+{
+namespace parallel
+{
+BOOST_THREAD_INLINE_NAMESPACE(v1)
+{
+
+  class BOOST_SYMBOL_VISIBLE exception_list: public std::exception
+  {
+    typedef std::list<exception_ptr> exception_ptr_list;
+    exception_ptr_list list_;
+  public:
+    typedef exception_ptr_list::const_iterator const_iterator;
+
+    ~exception_list() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+    void add(exception_ptr const& e)
+    {
+      list_.push_back(e);
+    }
+    size_t size() const BOOST_NOEXCEPT
+    {
+      return list_.size();
+    }
+    const_iterator begin() const BOOST_NOEXCEPT
+    {
+      return list_.begin();
+    }
+    const_iterator end() const BOOST_NOEXCEPT
+    {
+      return list_.end();
+    }
+    const char* what() const BOOST_NOEXCEPT_OR_NOTHROW
+    {
+      return "exception_list";
+    }
+
+  };
+}
+
+} // parallel
+} // experimental
+} // boost
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v1/inline_namespace.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,28 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_PARALLEL_V1_INLINE_NAMESPACE_HPP
+#define BOOST_THREAD_EXPERIMENTAL_PARALLEL_V1_INLINE_NAMESPACE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/experimental/config/inline_namespace.hpp>
+namespace boost {
+namespace experimental {
+namespace parallel {
+
+  BOOST_THREAD_INLINE_NAMESPACE(v1) {}
+
+#if defined(BOOST_NO_CXX11_INLINE_NAMESPACES)
+  using namespace v1;
+#endif
+
+}
+}
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v2/inline_namespace.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,29 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_PARALLEL_V2_INLINE_NAMESPACE_HPP
+#define BOOST_THREAD_EXPERIMENTAL_PARALLEL_V2_INLINE_NAMESPACE_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/experimental/config/inline_namespace.hpp>
+
+namespace boost {
+namespace experimental {
+namespace parallel {
+
+  BOOST_THREAD_INLINE_NAMESPACE(v2) {}
+
+#if defined(BOOST_NO_CXX11_INLINE_NAMESPACES)
+  using namespace v2;
+#endif
+
+}
+}
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/parallel/v2/task_region.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,316 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_PARALLEL_V2_TASK_REGION_HPP
+#define BOOST_THREAD_EXPERIMENTAL_PARALLEL_V2_TASK_REGION_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/future.hpp>
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+#include <boost/thread/executors/basic_thread_pool.hpp>
+#endif
+#include <boost/thread/experimental/exception_list.hpp>
+#include <boost/thread/experimental/parallel/v2/inline_namespace.hpp>
+#include <boost/thread/detail/move.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+#define BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+
+namespace boost
+{
+namespace experimental
+{
+namespace parallel
+{
+BOOST_THREAD_INLINE_NAMESPACE(v2)
+{
+  class BOOST_SYMBOL_VISIBLE task_canceled_exception: public std::exception
+  {
+  public:
+    //task_canceled_exception() BOOST_NOEXCEPT {}
+    //task_canceled_exception(const task_canceled_exception&) BOOST_NOEXCEPT {}
+    //task_canceled_exception& operator=(const task_canceled_exception&) BOOST_NOEXCEPT {}
+    virtual const char* what() const BOOST_NOEXCEPT_OR_NOTHROW
+    { return "task_canceled_exception";}
+  };
+
+  template <class Executor>
+  class task_region_handle_gen;
+
+  namespace detail
+  {
+    void handle_task_region_exceptions(exception_list& errors)
+    {
+      try {
+        throw;
+      }
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+      catch (task_canceled_exception& ex)
+      {
+      }
+#endif
+      catch (exception_list const& el)
+      {
+        for (exception_list::const_iterator it = el.begin(); it != el.end(); ++it)
+        {
+          boost::exception_ptr const& e = *it;
+          try {
+            rethrow_exception(e);
+          }
+          catch (...)
+          {
+            handle_task_region_exceptions(errors);
+          }
+        }
+      }
+      catch (...)
+      {
+        errors.add(boost::current_exception());
+      }
+    }
+
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+    template <class TRH, class F>
+    struct wrapped
+    {
+      TRH& tr;
+      F f;
+      wrapped(TRH& tr, BOOST_THREAD_RV_REF(F) f) : tr(tr), f(move(f))
+      {}
+      void operator()()
+      {
+        try
+        {
+          f();
+        }
+        catch (...)
+        {
+          lock_guard<mutex> lk(tr.mtx);
+          tr.canceled = true;
+          throw;
+        }
+      }
+    };
+#endif
+  }
+
+  template <class Executor>
+  class task_region_handle_gen
+  {
+  private:
+    // Private members and friends
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+    template <class TRH, class F>
+    friend struct detail::wrapped;
+#endif
+    template <typename F>
+    friend void task_region(BOOST_THREAD_FWD_REF(F) f);
+    template<typename F>
+    friend void task_region_final(BOOST_THREAD_FWD_REF(F) f);
+    template <class Ex, typename F>
+    friend void task_region(Ex&, BOOST_THREAD_FWD_REF(F) f);
+    template<class Ex, typename F>
+    friend void task_region_final(Ex&, BOOST_THREAD_FWD_REF(F) f);
+
+    void wait_all()
+    {
+      wait_for_all(group.begin(), group.end());
+
+      for (group_type::iterator it = group.begin(); it != group.end(); ++it)
+      {
+        future<void>& f = *it;
+        if (f.has_exception())
+        {
+          try
+          {
+            boost::rethrow_exception(f.get_exception_ptr());
+          }
+          catch (...)
+          {
+            detail::handle_task_region_exceptions(exs);
+          }
+        }
+      }
+      if (exs.size() != 0)
+      {
+        boost::throw_exception(exs);
+      }
+    }
+protected:
+#if ! defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED && ! defined BOOST_THREAD_PROVIDES_EXECUTORS
+    task_region_handle_gen()
+    {}
+#endif
+
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED && defined BOOST_THREAD_PROVIDES_EXECUTORS
+    task_region_handle_gen()
+    : canceled(false)
+    , ex(0)
+    {}
+    task_region_handle_gen(Executor& ex)
+    : canceled(false)
+    , ex(&ex)
+    {}
+
+#endif
+
+#if ! defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED && defined BOOST_THREAD_PROVIDES_EXECUTORS
+    task_region_handle_gen()
+    : ex(0)
+    {}
+    task_region_handle_gen(Executor& ex)
+    : ex(&ex)
+    {}
+#endif
+
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED && ! defined BOOST_THREAD_PROVIDES_EXECUTORS
+    task_region_handle_gen()
+    : canceled(false)
+    {
+    }
+#endif
+
+    ~task_region_handle_gen()
+    {
+      //wait_all();
+    }
+
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+    mutable mutex mtx;
+    bool canceled;
+#endif
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+    Executor* ex;
+#endif
+    exception_list exs;
+    typedef csbl::vector<future<void> > group_type;
+    group_type group;
+
+  public:
+    BOOST_DELETED_FUNCTION(task_region_handle_gen(const task_region_handle_gen&))
+    BOOST_DELETED_FUNCTION(task_region_handle_gen& operator=(const task_region_handle_gen&))
+    BOOST_DELETED_FUNCTION(task_region_handle_gen* operator&() const)
+
+  public:
+    template<typename F>
+    void run(BOOST_THREAD_FWD_REF(F) f)
+    {
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+      {
+        lock_guard<mutex> lk(mtx);
+        if (canceled) {
+          boost::throw_exception(task_canceled_exception());
+        }
+      }
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+      group.push_back(async(*ex, detail::wrapped<task_region_handle_gen<Executor>, F>(*this, forward<F>(f))));
+#else
+      group.push_back(async(detail::wrapped<task_region_handle_gen<Executor>, F>(*this, forward<F>(f))));
+#endif
+#else
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+      group.push_back(async(*ex, forward<F>(f)));
+#else
+      group.push_back(async(forward<F>(f)));
+#endif
+#endif
+    }
+
+    void wait()
+    {
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+      {
+        lock_guard<mutex> lk(mtx);
+        if (canceled) {
+          boost::throw_exception(task_canceled_exception());
+        }
+      }
+#endif
+      wait_all();
+    }
+  };
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+  typedef basic_thread_pool default_executor;
+#else
+  typedef int default_executor;
+#endif
+  class task_region_handle :
+    public task_region_handle_gen<default_executor>
+  {
+    default_executor tp;
+    template <typename F>
+    friend void task_region(BOOST_THREAD_FWD_REF(F) f);
+    template<typename F>
+    friend void task_region_final(BOOST_THREAD_FWD_REF(F) f);
+
+  protected:
+    task_region_handle() : task_region_handle_gen<default_executor>()
+    {
+#if defined BOOST_THREAD_PROVIDES_EXECUTORS
+      ex = &tp;
+#endif
+    }
+    BOOST_DELETED_FUNCTION(task_region_handle(const task_region_handle&))
+    BOOST_DELETED_FUNCTION(task_region_handle& operator=(const task_region_handle&))
+    BOOST_DELETED_FUNCTION(task_region_handle* operator&() const)
+
+  };
+
+  template <typename Executor, typename F>
+  void task_region_final(Executor& ex, BOOST_THREAD_FWD_REF(F) f)
+  {
+    task_region_handle_gen<Executor> tr(ex);
+    try
+    {
+      f(tr);
+    }
+    catch (...)
+    {
+      detail::handle_task_region_exceptions(tr.exs);
+    }
+    tr.wait_all();
+  }
+
+  template <typename Executor, typename F>
+  void task_region(Executor& ex, BOOST_THREAD_FWD_REF(F) f)
+  {
+    task_region_final(ex, forward<F>(f));
+  }
+
+  template <typename F>
+  void task_region_final(BOOST_THREAD_FWD_REF(F) f)
+  {
+    task_region_handle tr;
+    try
+    {
+      f(tr);
+    }
+    catch (...)
+    {
+      detail::handle_task_region_exceptions(tr.exs);
+    }
+    tr.wait_all();
+  }
+
+  template <typename F>
+  void task_region(BOOST_THREAD_FWD_REF(F) f)
+  {
+    task_region_final(forward<F>(f));
+  }
+
+} // v2
+} // parallel
+} // experimental
+} // boost
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/experimental/task_region.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,16 @@
+#ifndef BOOST_THREAD_EXPERIMENTAL_TASK_REGION_HPP
+#define BOOST_THREAD_EXPERIMENTAL_TASK_REGION_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/thread for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#include <boost/thread/experimental/parallel/v2/task_region.hpp>
+
+#endif
--- a/DEPENDENCIES/generic/include/boost/thread/future_error_code.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-//  (C) Copyright 2008-10 Anthony Williams
-//  (C) Copyright 2011-2012 Vicente J. Botet Escriba
-//
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_THREAD_FUTURE_ERROR_CODE_HPP
-#define BOOST_THREAD_FUTURE_ERROR_CODE_HPP
-
-#include <boost/thread/detail/config.hpp>
-#include <boost/detail/scoped_enum_emulation.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/type_traits/integral_constant.hpp>
-
-namespace boost
-{
-
-  //enum class future_errc
-  BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
-  {
-      broken_promise = 1,
-      future_already_retrieved,
-      promise_already_satisfied,
-      no_state
-  }
-  BOOST_SCOPED_ENUM_DECLARE_END(future_errc)
-
-  namespace system
-  {
-    template <>
-    struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc> : public true_type {};
-
-    #ifdef BOOST_NO_CXX11_SCOPED_ENUMS
-    template <>
-    struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc::enum_type> : public true_type { };
-    #endif
-  } // system
-
-  BOOST_THREAD_DECL
-  const system::error_category& future_category() BOOST_NOEXCEPT;
-
-  namespace system
-  {
-    inline
-    error_code
-    make_error_code(future_errc e) BOOST_NOEXCEPT
-    {
-        return error_code(underlying_cast<int>(e), boost::future_category());
-    }
-
-    inline
-    error_condition
-    make_error_condition(future_errc e) BOOST_NOEXCEPT
-    {
-        return error_condition(underlying_cast<int>(e), future_category());
-    }
-  } // system
-} // boost
-
-#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/future_error.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,98 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_FUTURE_ERROR_HPP
+#define BOOST_THREAD_FUTURES_FUTURE_ERROR_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/futures/future_error_code.hpp>
+#include <boost/system/error_code.hpp>
+
+#include <stdexcept>
+
+namespace boost
+{
+  class BOOST_SYMBOL_VISIBLE future_error
+      : public std::logic_error
+  {
+      system::error_code ec_;
+  public:
+      future_error(system::error_code ec)
+      : logic_error(ec.message()),
+        ec_(ec)
+      {
+      }
+
+      const system::error_code& code() const BOOST_NOEXCEPT
+      {
+        return ec_;
+      }
+  };
+
+    class BOOST_SYMBOL_VISIBLE future_uninitialized:
+        public future_error
+    {
+    public:
+        future_uninitialized() :
+          future_error(system::make_error_code(future_errc::no_state))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE broken_promise:
+        public future_error
+    {
+    public:
+        broken_promise():
+          future_error(system::make_error_code(future_errc::broken_promise))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE future_already_retrieved:
+        public future_error
+    {
+    public:
+        future_already_retrieved():
+          future_error(system::make_error_code(future_errc::future_already_retrieved))
+        {}
+    };
+    class BOOST_SYMBOL_VISIBLE promise_already_satisfied:
+        public future_error
+    {
+    public:
+        promise_already_satisfied():
+          future_error(system::make_error_code(future_errc::promise_already_satisfied))
+        {}
+    };
+
+    class BOOST_SYMBOL_VISIBLE task_already_started:
+        public future_error
+    {
+    public:
+        task_already_started():
+        future_error(system::make_error_code(future_errc::promise_already_satisfied))
+        {}
+    };
+
+    class BOOST_SYMBOL_VISIBLE task_moved:
+        public future_error
+    {
+    public:
+        task_moved():
+          future_error(system::make_error_code(future_errc::no_state))
+        {}
+    };
+
+    class promise_moved:
+        public future_error
+    {
+    public:
+          promise_moved():
+          future_error(system::make_error_code(future_errc::no_state))
+        {}
+    };
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/future_error_code.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,61 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2012,2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_FUTURE_ERROR_CODE_HPP
+#define BOOST_THREAD_FUTURES_FUTURE_ERROR_CODE_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/core/scoped_enum.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+namespace boost
+{
+
+  //enum class future_errc
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
+  {
+      broken_promise = 1,
+      future_already_retrieved,
+      promise_already_satisfied,
+      no_state
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(future_errc)
+
+  namespace system
+  {
+    template <>
+    struct BOOST_SYMBOL_VISIBLE is_error_code_enum< ::boost::future_errc> : public true_type {};
+
+    #ifdef BOOST_NO_CXX11_SCOPED_ENUMS
+    template <>
+    struct BOOST_SYMBOL_VISIBLE is_error_code_enum< ::boost::future_errc::enum_type> : public true_type { };
+    #endif
+  } // system
+
+  BOOST_THREAD_DECL
+  const system::error_category& future_category() BOOST_NOEXCEPT;
+
+  namespace system
+  {
+    inline
+    error_code
+    make_error_code(future_errc e) BOOST_NOEXCEPT
+    {
+        return error_code(underlying_cast<int>(e), boost::future_category());
+    }
+
+    inline
+    error_condition
+    make_error_condition(future_errc e) BOOST_NOEXCEPT
+    {
+        return error_condition(underlying_cast<int>(e), boost::future_category());
+    }
+  } // system
+} // boost
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/future_status.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_FUTURE_STATUS_HPP
+#define BOOST_THREAD_FUTURES_FUTURE_STATUS_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/core/scoped_enum.hpp>
+
+namespace boost
+{
+  //enum class future_status
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_status)
+  {
+      ready,
+      timeout,
+      deferred
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(future_status)
+  namespace future_state
+  {
+      enum state { uninitialized, waiting, ready, moved, deferred };
+  }
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/is_future_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,21 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_IS_FUTURE_TYPE_HPP
+#define BOOST_THREAD_FUTURES_IS_FUTURE_TYPE_HPP
+
+#include <boost/type_traits/integral_constant.hpp>
+
+namespace boost
+{
+    template<typename T>
+    struct is_future_type : false_type
+    {
+    };
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/launch.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_LAUNCH_HPP
+#define BOOST_THREAD_FUTURES_LAUNCH_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/core/scoped_enum.hpp>
+
+namespace boost
+{
+  //enum class launch
+  BOOST_SCOPED_ENUM_DECLARE_BEGIN(launch)
+  {
+      none = 0,
+      async = 1,
+      deferred = 2,
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+      executor = 4,
+#endif
+      any = async | deferred
+  }
+  BOOST_SCOPED_ENUM_DECLARE_END(launch)
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/wait_for_all.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,74 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_WAIT_FOR_ALL_HPP
+#define BOOST_THREAD_FUTURES_WAIT_FOR_ALL_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/futures/is_future_type.hpp>
+
+#include <boost/core/enable_if.hpp>
+
+namespace boost
+{
+  template<typename Iterator>
+  typename boost::disable_if<is_future_type<Iterator>,void>::type wait_for_all(Iterator begin,Iterator end)
+  {
+      for(Iterator current=begin;current!=end;++current)
+      {
+          current->wait();
+      }
+  }
+
+#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+    template<typename F1,typename F2>
+    typename boost::enable_if<is_future_type<F1>,void>::type wait_for_all(F1& f1,F2& f2)
+    {
+        f1.wait();
+        f2.wait();
+    }
+
+    template<typename F1,typename F2,typename F3>
+    void wait_for_all(F1& f1,F2& f2,F3& f3)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+        f5.wait();
+    }
+#else
+    template<typename F1, typename... Fs>
+    void wait_for_all(F1& f1, Fs&... fs)
+    {
+        bool dummy[] = { (f1.wait(), true), (fs.wait(), true)... };
+
+        // prevent unused parameter warning
+        (void) dummy;
+    }
+#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)}
+
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/futures/wait_for_any.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,161 @@
+//  (C) Copyright 2008-10 Anthony Williams
+//  (C) Copyright 2011-2015 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURES_WAIT_FOR_ANY_HPP
+#define BOOST_THREAD_FUTURES_WAIT_FOR_ANY_HPP
+
+#include <boost/thread/detail/config.hpp>
+
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/futures/is_future_type.hpp>
+#include <boost/thread/lock_algorithms.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <boost/core/enable_if.hpp>
+#include <boost/next_prior.hpp>
+#include <boost/scoped_array.hpp>
+
+#include <iterator>
+#include <vector>
+
+namespace boost
+{
+  namespace detail
+  {
+    template <class Future>
+    class waiter_for_any_in_seq
+    {
+      struct registered_waiter;
+      typedef std::vector<int>::size_type count_type;
+
+      struct registered_waiter
+      {
+        typedef Future future_type;
+        future_type* future_;
+        typedef typename Future::notify_when_ready_handle notify_when_ready_handle;
+        notify_when_ready_handle handle;
+        count_type index;
+
+        registered_waiter(future_type & a_future,
+            notify_when_ready_handle handle_, count_type index_) :
+          future_(&a_future), handle(handle_), index(index_)
+        {
+        }
+      };
+
+      struct all_futures_lock
+      {
+#ifdef _MANAGED
+        typedef std::ptrdiff_t count_type_portable;
+#else
+        typedef count_type count_type_portable;
+#endif
+        count_type_portable count;
+        boost::scoped_array<boost::unique_lock<boost::mutex> > locks;
+
+        all_futures_lock(std::vector<registered_waiter>& waiters) :
+          count(waiters.size()), locks(new boost::unique_lock<boost::mutex>[count])
+        {
+          for (count_type_portable i = 0; i < count; ++i)
+          {
+            locks[i] = BOOST_THREAD_MAKE_RV_REF(boost::unique_lock<boost::mutex>(waiters[i].future_->mutex()));
+          }
+        }
+
+        void lock()
+        {
+          boost::lock(locks.get(), locks.get() + count);
+        }
+
+        void unlock()
+        {
+          for (count_type_portable i = 0; i < count; ++i)
+          {
+            locks[i].unlock();
+          }
+        }
+      };
+
+      boost::condition_variable_any cv;
+      std::vector<registered_waiter> waiters_;
+      count_type future_count;
+
+    public:
+      waiter_for_any_in_seq() :
+        future_count(0)
+      {
+      }
+
+      template <typename F>
+      void add(F& f)
+      {
+        if (f.valid())
+        {
+          registered_waiter waiter(f, f.notify_when_ready(cv), future_count);
+          try
+          {
+            waiters_.push_back(waiter);
+          }
+          catch (...)
+          {
+            f.future_->unnotify_when_ready(waiter.handle);
+            throw;
+          }
+          ++future_count;
+        }
+      }
+
+#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
+      template <typename F1, typename ... Fs>
+      void add(F1& f1, Fs&... fs)
+      {
+        add(f1);
+        add(fs...);
+      }
+#endif
+
+      count_type wait()
+      {
+        all_futures_lock lk(waiters_);
+        for (;;)
+        {
+          for (count_type i = 0; i < waiters_.size(); ++i)
+          {
+            if (waiters_[i].future_->is_ready(lk.locks[i]))
+            {
+              return waiters_[i].index;
+            }
+          }
+          cv.wait(lk);
+        }
+      }
+
+      ~waiter_for_any_in_seq()
+      {
+        for (count_type i = 0; i < waiters_.size(); ++i)
+        {
+          waiters_[i].future_->unnotify_when_ready(waiters_[i].handle);
+        }
+      }
+    };
+  }
+
+  template <typename Iterator>
+  typename boost::disable_if<is_future_type<Iterator> , Iterator>::type wait_for_any(Iterator begin, Iterator end)
+  {
+    if (begin == end) return end;
+
+    detail::waiter_for_any_in_seq<typename std::iterator_traits<Iterator>::value_type> waiter;
+    for (Iterator current = begin; current != end; ++current)
+    {
+      waiter.add(*current);
+    }
+    return boost::next(begin, waiter.wait());
+  }
+}
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/ostream_buffer.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// (C) Copyright 2013 Vicente J. Botet Escriba
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_THREAD_OSTREAM_BUFFER_HPP
+#define BOOST_THREAD_OSTREAM_BUFFER_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <sstream>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+
+  template <typename OStream>
+  class ostream_buffer
+  {
+  public:
+    typedef std::basic_ostringstream<typename OStream::char_type, typename OStream::traits_type> stream_type;
+    ostream_buffer(OStream& os) :
+      os_(os)
+    {
+    }
+    ~ostream_buffer()
+    {
+      os_ << o_str_.str();
+    }
+    stream_type& stream()
+    {
+      return o_str_;
+    }
+  private:
+    OStream& os_;
+    stream_type o_str_;
+  };
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif // header
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/thread_pool.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,15 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/09 Vicente J. Botet Escriba
+//    Adapt to boost from CCIA C++11 implementation
+//    first implementation of a simple pool thread using a vector of threads and a sync_queue.
+
+#ifndef BOOST_THREAD_THREAD_POOL_HPP
+#define BOOST_THREAD_THREAD_POOL_HPP
+
+#include <boost/thread/executors/basic_thread_pool.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/user_scheduler.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,202 @@
+// Copyright (C) 2013 Vicente J. Botet Escriba
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// 2013/11 Vicente J. Botet Escriba
+//    first implementation of a simple serial scheduler.
+
+#ifndef BOOST_THREAD_USER_SCHEDULER_HPP
+#define BOOST_THREAD_USER_SCHEDULER_HPP
+
+#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/delete.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/concurrent_queues/sync_queue.hpp>
+#include <boost/thread/executors/work.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+
+  class user_scheduler
+  {
+    /// type-erasure to store the works to do
+    typedef  thread_detail::work work;
+
+    /// the thread safe work queue
+    sync_queue<work > work_queue;
+
+  public:
+    /**
+     * Effects: try to execute one task.
+     * Returns: whether a task has been executed.
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    bool try_executing_one()
+    {
+      work task;
+      try
+      {
+        if (work_queue.try_pull(task) == queue_op_status::success)
+        {
+          task();
+          return true;
+        }
+        return false;
+      }
+      catch (std::exception& )
+      {
+        return false;
+      }
+      catch (...)
+      {
+        return false;
+      }
+    }
+  private:
+    /**
+     * Effects: schedule one task or yields
+     * Throws: whatever the current task constructor throws or the task() throws.
+     */
+    void schedule_one_or_yield()
+    {
+        if ( ! try_executing_one())
+        {
+          this_thread::yield();
+        }
+    }
+
+
+    /**
+     * The main loop of the worker thread
+     */
+    void worker_thread()
+    {
+      while (!closed())
+      {
+        schedule_one_or_yield();
+      }
+      while (try_executing_one())
+      {
+      }
+    }
+
+  public:
+    /// user_scheduler is not copyable.
+    BOOST_THREAD_NO_COPYABLE(user_scheduler)
+
+    /**
+     * \b Effects: creates a thread pool that runs closures using one of its closure-executing methods.
+     *
+     * \b Throws: Whatever exception is thrown while initializing the needed resources.
+     */
+    user_scheduler()
+    {
+    }
+    /**
+     * \b Effects: Destroys the thread pool.
+     *
+     * \b Synchronization: The completion of all the closures happen before the completion of the \c user_scheduler destructor.
+     */
+    ~user_scheduler()
+    {
+      // signal to all the worker thread that there will be no more submissions.
+      close();
+    }
+
+    /**
+     * loop
+     */
+    void loop() { worker_thread(); }
+    /**
+     * \b Effects: close the \c user_scheduler for submissions.
+     * The loop will work until there is no more closures to run.
+     */
+    void close()
+    {
+      work_queue.close();
+    }
+
+    /**
+     * \b Returns: whether the pool is closed for submissions.
+     */
+    bool closed()
+    {
+      return work_queue.closed();
+    }
+
+    /**
+     * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
+     *
+     * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
+     * If invoked closure throws an exception the \c user_scheduler will call \c std::terminate, as is the case with threads.
+     *
+     * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
+     *
+     * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
+     * Whatever exception that can be throw while storing the closure.
+     */
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template <typename Closure>
+    void submit(Closure & closure)
+    {
+      work w ((closure));
+      work_queue.push(boost::move(w));
+      //work_queue.push(work(closure)); // todo check why this doesn't work
+    }
+#endif
+    void submit(void (*closure)())
+    {
+      work w ((closure));
+      work_queue.push(boost::move(w));
+      //work_queue.push(work(closure)); // todo check why this doesn't work
+    }
+
+    template <typename Closure>
+    void submit(BOOST_THREAD_RV_REF(Closure) closure)
+    {
+      work w =boost::move(closure);
+      work_queue.push(boost::move(w));
+      //work_queue.push(work(boost::move(closure))); // todo check why this doesn't work
+    }
+
+    /**
+     * \b Requires: This must be called from an scheduled task.
+     *
+     * \b Effects: reschedule functions until pred()
+     */
+    template <typename Pred>
+    bool reschedule_until(Pred const& pred)
+    {
+      do {
+        if ( ! try_executing_one())
+        {
+          return false;
+        }
+      } while (! pred());
+      return true;
+    }
+    /**
+     * run queued closures
+     */
+    void run_queued_closures()
+    {
+      sync_queue<work>::underlying_queue_type q = work_queue.underlying_queue();
+      while (q.empty())
+      {
+        work task = q.front();
+        q.pop_front();
+        task();
+      }
+    }
+
+  };
+
+}
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/thread/with_lock_guard.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,234 @@
+// (C) Copyright 2013 Ruslan Baratov
+// Copyright (C) 2014 Vicente J. Botet Escriba
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See www.boost.org/libs/thread for documentation.
+
+#ifndef BOOST_THREAD_WITH_LOCK_GUARD_HPP
+#define BOOST_THREAD_WITH_LOCK_GUARD_HPP
+
+#include <boost/thread/lock_guard.hpp>
+#include <boost/utility/result_of.hpp>
+//#include <boost/thread/detail/invoke.hpp>
+
+namespace boost {
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
+    !defined(BOOST_NO_CXX11_DECLTYPE) && \
+    !defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
+
+/**
+ * Utility to run functions in scope protected by mutex.
+ *
+ * Examples:
+ *
+ *     int func(int, int&);
+ *     boost::mutex m;
+ *     int a;
+ *     int result = boost::with_lock_guard(m, func, 1, boost::ref(a));
+ *
+ *     // using boost::bind
+ *     int result = boost::with_lock_guard(
+ *         m, boost::bind(func, 2, boost::ref(a))
+ *     );
+ *
+ *     // using lambda
+ *     int a;
+ *     int result = boost::with_lock_guard(
+ *         m,
+ *         [&a](int x) {
+ *           a = 3;
+ *           return x + 4;
+ *         },
+ *         5
+ *     );
+ */
+template <class Lockable, class Function, class... Args>
+typename boost::result_of<Function(Args...)>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Function) func,
+    BOOST_FWD_REF(Args)... args
+) //-> decltype(func(boost::forward<Args>(args)...))
+{
+  boost::lock_guard<Lockable> lock(m);
+  return func(boost::forward<Args>(args)...);
+}
+
+#else
+
+// Workaround versions for compilers without c++11 variadic templates support.
+// (function arguments limit: 4)
+// (for lambda support define BOOST_RESULT_OF_USE_DECLTYPE may be needed)
+
+template <class Lockable, class Func>
+typename boost::result_of<Func()>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Func) func
+) {
+  boost::lock_guard<Lockable> lock(m);
+  return func();
+}
+
+template <class Lockable, class Func, class Arg>
+typename boost::result_of<Func(Arg)>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Func) func,
+    BOOST_FWD_REF(Arg) arg
+) {
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg>(arg)
+  );
+}
+
+template <class Lockable, class Func, class Arg1, class Arg2>
+typename boost::result_of<Func(Arg1, Arg2)>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Func) func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2
+) {
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2)
+  );
+}
+
+template <class Lockable, class Func, class Arg1, class Arg2, class Arg3>
+typename boost::result_of<Func(Arg1, Arg2, Arg3)>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Func) func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2,
+    BOOST_FWD_REF(Arg3) arg3
+) {
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2),
+      boost::forward<Arg3>(arg3)
+  );
+}
+
+template <
+    class Lockable, class Func, class Arg1, class Arg2, class Arg3, class Arg4
+>
+typename boost::result_of<Func(Arg1, Arg2, Arg3, Arg4)>::type with_lock_guard(
+    Lockable& m,
+    BOOST_FWD_REF(Func) func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2,
+    BOOST_FWD_REF(Arg3) arg3,
+    BOOST_FWD_REF(Arg4) arg4
+) {
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2),
+      boost::forward<Arg3>(arg3),
+      boost::forward<Arg4>(arg4)
+  );
+}
+
+// overloads for function pointer
+// (if argument is not function pointer, static assert will trigger)
+template <class Lockable, class Func>
+typename boost::result_of<
+    typename boost::add_pointer<Func>::type()
+>::type with_lock_guard(
+    Lockable& m,
+    Func* func
+) {
+  BOOST_STATIC_ASSERT(boost::is_function<Func>::value);
+
+  boost::lock_guard<Lockable> lock(m);
+  return func();
+}
+
+template <class Lockable, class Func, class Arg>
+typename boost::result_of<
+    typename boost::add_pointer<Func>::type(Arg)
+>::type with_lock_guard(
+    Lockable& m,
+    Func* func,
+    BOOST_FWD_REF(Arg) arg
+) {
+  BOOST_STATIC_ASSERT(boost::is_function<Func>::value);
+
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg>(arg)
+  );
+}
+
+template <class Lockable, class Func, class Arg1, class Arg2>
+typename boost::result_of<
+    typename boost::add_pointer<Func>::type(Arg1, Arg2)
+>::type with_lock_guard(
+    Lockable& m,
+    Func* func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2
+) {
+  BOOST_STATIC_ASSERT(boost::is_function<Func>::value);
+
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2)
+  );
+}
+
+template <class Lockable, class Func, class Arg1, class Arg2, class Arg3>
+typename boost::result_of<
+    typename boost::add_pointer<Func>::type(Arg1, Arg2, Arg3)
+>::type with_lock_guard(
+    Lockable& m,
+    Func* func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2,
+    BOOST_FWD_REF(Arg3) arg3
+) {
+  BOOST_STATIC_ASSERT(boost::is_function<Func>::value);
+
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2),
+      boost::forward<Arg3>(arg3)
+  );
+}
+
+template <
+    class Lockable, class Func, class Arg1, class Arg2, class Arg3, class Arg4
+>
+typename boost::result_of<
+    typename boost::add_pointer<Func>::type(Arg1, Arg2, Arg3, Arg4)
+>::type with_lock_guard(
+    Lockable& m,
+    Func* func,
+    BOOST_FWD_REF(Arg1) arg1,
+    BOOST_FWD_REF(Arg2) arg2,
+    BOOST_FWD_REF(Arg3) arg3,
+    BOOST_FWD_REF(Arg4) arg4
+) {
+  BOOST_STATIC_ASSERT(boost::is_function<Func>::value);
+
+  boost::lock_guard<Lockable> lock(m);
+  return func(
+      boost::forward<Arg1>(arg1),
+      boost::forward<Arg2>(arg2),
+      boost::forward<Arg3>(arg3),
+      boost::forward<Arg4>(arg4)
+  );
+}
+
+#endif
+
+} // namespace boost
+
+#endif // BOOST_THREAD_WITH_LOCK_GUARD_HPP
+
--- a/DEPENDENCIES/generic/include/boost/tti/detail/dcomp_static_mem_fun.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-
-//  (C) Copyright Edward Diener 2011,2012,2013
-//  Use, modification and distribution are subject to the Boost Software License,
-//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt).
-
-#if !defined(BOOST_TTI_DETAIL_COMP_STATIC_MEM_FUN_HPP)
-#define BOOST_TTI_DETAIL_COMP_STATIC_MEM_FUN_HPP
-
-#include <boost/config.hpp>
-#include <boost/function_types/is_function.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/type_traits/detail/yes_no_type.hpp>
-#include <boost/tti/detail/dnullptr.hpp>
-
-#define BOOST_TTI_DETAIL_TRAIT_HAS_COMP_STATIC_MEMBER_FUNCTION(trait,name) \
-  template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
-  struct BOOST_PP_CAT(trait,_detail) \
-    { \
-    template<BOOST_TTI_DETAIL_TP_TYPE *> \
-    struct helper; \
-    \
-    template<class U> \
-    static ::boost::type_traits::yes_type chkt(helper<&U::name> *); \
-    \
-    template<class U> \
-    static ::boost::type_traits::no_type chkt(...); \
-    \
-    BOOST_STATIC_CONSTANT(bool,value=(boost::function_types::is_function<BOOST_TTI_DETAIL_TP_TYPE>::value) && (sizeof(chkt<BOOST_TTI_DETAIL_TP_T>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type))); \
-    \
-    typedef boost::mpl::bool_<value> type; \
-    }; \
-/**/
-
-#endif // BOOST_TTI_DETAIL_COMP_STATIC_MEM_FUN_HPP
--- a/DEPENDENCIES/generic/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,865 +0,0 @@
-// - tuple_basic_no_partial_spec.hpp -----------------------------------------
-
-// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
-// Copyright (C) 2001 Douglas Gregor (gregod@rpi.edu)
-// Copyright (C) 2001 Gary Powell (gary.powell@sierra.com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// For more information, see http://www.boost.org or http://lambda.cs.utu.fi
-
-// Revision History
-//  14 02 01    Remove extra ';'. Also, fixed 10-parameter to make_tuple. (DG)
-//  10 02 01    Fixed "null_type" constructors.
-//              Implemented comparison operators globally.
-//              Hide element_type_ref and element_type_const_ref.
-//              (DG).
-//  09 02 01    Extended to tuples of length 10. Changed comparison for
-//              operator<()
-//              to the same used by std::pair<>, added cnull_type() (GP)
-//  03 02 01    Initial Version from original tuple.hpp code by JJ. (DG)
-
-// -----------------------------------------------------------------
-
-#ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
-#define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
-
-#include "boost/type_traits.hpp"
-#include "boost/utility/swap.hpp"
-#include <utility>
-
-#if defined BOOST_MSVC
-#pragma warning(disable:4518) // storage-class or type specifier(s) unexpected here; ignored
-#pragma warning(disable:4181) // qualifier applied to reference type ignored
-#pragma warning(disable:4227) // qualifier applied to reference type ignored
-#endif
-
-namespace boost {
-namespace tuples {
-
-    // null_type denotes the end of a list built with "cons"
-    struct null_type
-    {
-      null_type() {}
-      null_type(const null_type&, const null_type&) {}
-    };
-
-    // a helper function to provide a const null_type type temporary
-    inline const null_type cnull_type() { return null_type(); }
-
-// forward declaration of tuple
-    template<
-      typename T1 = null_type,
-      typename T2 = null_type,
-      typename T3 = null_type,
-      typename T4 = null_type,
-      typename T5 = null_type,
-      typename T6 = null_type,
-      typename T7 = null_type,
-      typename T8 = null_type,
-      typename T9 = null_type,
-      typename T10 = null_type
-    >
-    class tuple;
-
-// forward declaration of cons
-    template<typename Head, typename Tail = null_type>
-    struct cons;
-
-    namespace detail {
-
-      // Takes a pointer and routes all assignments to whatever it points to
-      template<typename T>
-      struct assign_to_pointee
-      {
-      public:
-        explicit assign_to_pointee(T* p) : ptr(p) {}
-
-        template<typename Other>
-        assign_to_pointee& operator=(const Other& other)
-        {
-          *ptr = other;
-          return *this;
-        }
-
-      private:
-        T* ptr;
-      };
-
-      // Swallows any assignment
-      struct swallow_assign
-      {
-        template<typename T>
-        swallow_assign const& operator=(const T&) const
-        {
-          return *this;
-        }
-      };
-
-    template <typename T> struct add_const_reference : add_reference<typename add_const<T>::type> {};
-
-    template <class MyTail>
-    struct init_tail
-    {
-        // Each of vc6 and vc7 seem to require a different formulation
-        // of this return type
-        template <class H, class T>
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-        static typename add_reference<typename add_const<T>::type>::type
-#else
-        static typename add_const_reference<T>::type
-#endif
-        execute( cons<H,T> const& u, long )
-        {
-            return u.get_tail();
-        }
-    };
-
-    template <>
-    struct init_tail<null_type>
-    {
-        template <class H>
-        static null_type execute( cons<H,null_type> const& u, long )
-        {
-            return null_type();
-        }
-
-        template <class U>
-        static null_type execute(U const&, ...)
-        {
-            return null_type();
-        }
-     private:
-        template <class H, class T>
-        void execute( cons<H,T> const&, int);
-    };
-
-    template <class Other>
-    Other const&
-    init_head( Other const& u, ... )
-    {
-        return u;
-    }
-
-    template <class H, class T>
-    typename add_reference<typename add_const<H>::type>::type
-    init_head( cons<H,T> const& u, int )
-    {
-        return u.get_head();
-    }
-
-    inline char**** init_head(null_type const&, int);
-
-  } // end of namespace detail
-
-    // cons builds a heterogenous list of types
-   template<typename Head, typename Tail>
-   struct cons
-   {
-     typedef cons self_type;
-     typedef Head head_type;
-     typedef Tail tail_type;
-
-    private:
-       typedef typename boost::add_reference<head_type>::type head_ref;
-       typedef typename boost::add_reference<tail_type>::type tail_ref;
-       typedef typename detail::add_const_reference<head_type>::type head_cref;
-       typedef typename detail::add_const_reference<tail_type>::type tail_cref;
-    public:
-     head_type head;
-     tail_type tail;
-
-     head_ref get_head() { return head; }
-     tail_ref get_tail() { return tail; }
-
-     head_cref get_head() const { return head; }
-     tail_cref get_tail() const { return tail; }
-
-     cons() : head(), tail() {}
-
-#if defined BOOST_MSVC
-      template<typename Tail>
-      cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf.
-                    const Tail& t) : head(h), tail(t.head, t.tail)
-      {
-      }
-
-      cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf.
-                    const null_type& t) : head(h), tail(t)
-      {
-      }
-
-#else
-      template<typename T>
-      explicit cons(head_cref h, const T& t) :
-        head(h), tail(t.head, t.tail)
-      {
-      }
-
-      explicit cons(head_cref h = head_type(),
-                    tail_cref t = tail_type()) :
-        head(h), tail(t)
-      {
-      }
-#endif
-
-      template <class U>
-      cons( const U& u )
-        : head(detail::init_head(u, 0))
-        , tail(detail::init_tail<Tail>::execute(u, 0L))
-       {
-       }
-
-      template<typename Other>
-      cons& operator=(const Other& other)
-      {
-        head = other.head;
-        tail = other.tail;
-        return *this;
-      }
-    };
-
-    namespace detail {
-
-      // Determines if the parameter is null_type
-      template<typename T> struct is_null_type { enum { RET = 0 }; };
-      template<> struct is_null_type<null_type> { enum { RET = 1 }; };
-
-      /* Build a cons structure from the given Head and Tail. If both are null_type,
-      return null_type. */
-      template<typename Head, typename Tail>
-      struct build_cons
-      {
-      private:
-        enum { tail_is_null_type = is_null_type<Tail>::RET };
-      public:
-        typedef cons<Head, Tail> RET;
-      };
-
-      template<>
-      struct build_cons<null_type, null_type>
-      {
-        typedef null_type RET;
-      };
-
-      // Map the N elements of a tuple into a cons list
-      template<
-        typename T1,
-        typename T2 = null_type,
-        typename T3 = null_type,
-        typename T4 = null_type,
-        typename T5 = null_type,
-        typename T6 = null_type,
-        typename T7 = null_type,
-        typename T8 = null_type,
-        typename T9 = null_type,
-        typename T10 = null_type
-      >
-      struct map_tuple_to_cons
-      {
-        typedef typename detail::build_cons<T10, null_type  >::RET cons10;
-        typedef typename detail::build_cons<T9, cons10>::RET cons9;
-        typedef typename detail::build_cons<T8, cons9>::RET cons8;
-        typedef typename detail::build_cons<T7, cons8>::RET cons7;
-        typedef typename detail::build_cons<T6, cons7>::RET cons6;
-        typedef typename detail::build_cons<T5, cons6>::RET cons5;
-        typedef typename detail::build_cons<T4, cons5>::RET cons4;
-        typedef typename detail::build_cons<T3, cons4>::RET cons3;
-        typedef typename detail::build_cons<T2, cons3>::RET cons2;
-        typedef typename detail::build_cons<T1, cons2>::RET cons1;
-      };
-
-      // Workaround the lack of partial specialization in some compilers
-      template<int N>
-      struct _element_type
-      {
-        template<typename Tuple>
-        struct inner
-        {
-        private:
-          typedef typename Tuple::tail_type tail_type;
-          typedef _element_type<N-1> next_elt_type;
-
-        public:
-          typedef typename _element_type<N-1>::template inner<tail_type>::RET RET;
-        };
-      };
-
-      template<>
-      struct _element_type<0>
-      {
-        template<typename Tuple>
-        struct inner
-        {
-          typedef typename Tuple::head_type RET;
-        };
-      };
-
-    } // namespace detail
-
-
-    // Return the Nth type of the given Tuple
-    template<int N, typename Tuple>
-    struct element
-    {
-    private:
-      typedef detail::_element_type<N> nth_type;
-
-    public:
-      typedef typename nth_type::template inner<Tuple>::RET RET;
-      typedef RET type;
-    };
-
-    namespace detail {
-
-#if defined(BOOST_MSVC) && (BOOST_MSVC == 1300)
-      // special workaround for vc7:
-
-      template <bool x>
-      struct reference_adder
-      {
-         template <class T>
-         struct rebind
-         {
-            typedef T& type;
-         };
-      };
-
-      template <>
-      struct reference_adder<true>
-      {
-         template <class T>
-         struct rebind
-         {
-            typedef T type;
-         };
-      };
-
-
-      // Return a reference to the Nth type of the given Tuple
-      template<int N, typename Tuple>
-      struct element_ref
-      {
-      private:
-         typedef typename element<N, Tuple>::RET elt_type;
-         enum { is_ref = is_reference<elt_type>::value };
-
-      public:
-         typedef reference_adder<is_ref>::rebind<elt_type>::type RET;
-         typedef RET type;
-      };
-
-      // Return a const reference to the Nth type of the given Tuple
-      template<int N, typename Tuple>
-      struct element_const_ref
-      {
-      private:
-         typedef typename element<N, Tuple>::RET elt_type;
-         enum { is_ref = is_reference<elt_type>::value };
-
-      public:
-         typedef reference_adder<is_ref>::rebind<const elt_type>::type RET;
-         typedef RET type;
-      };
-
-#else // vc7
-
-      // Return a reference to the Nth type of the given Tuple
-      template<int N, typename Tuple>
-      struct element_ref
-      {
-      private:
-        typedef typename element<N, Tuple>::RET elt_type;
-
-      public:
-        typedef typename add_reference<elt_type>::type RET;
-        typedef RET type;
-      };
-
-      // Return a const reference to the Nth type of the given Tuple
-      template<int N, typename Tuple>
-      struct element_const_ref
-      {
-      private:
-        typedef typename element<N, Tuple>::RET elt_type;
-
-      public:
-        typedef typename add_reference<const elt_type>::type RET;
-        typedef RET type;
-      };
-#endif // vc7
-
-    } // namespace detail
-
-    // Get length of this tuple
-    template<typename Tuple>
-    struct length
-    {
-      BOOST_STATIC_CONSTANT(int, value = 1 + length<typename Tuple::tail_type>::value);
-    };
-
-    template<> struct length<tuple<> > {
-      BOOST_STATIC_CONSTANT(int, value = 0);
-    };
-
-    template<>
-    struct length<null_type>
-    {
-      BOOST_STATIC_CONSTANT(int, value = 0);
-    };
-
-    namespace detail {
-
-    // Reference the Nth element in a tuple and retrieve it with "get"
-    template<int N>
-    struct get_class
-    {
-      template<typename Head, typename Tail>
-      static inline
-      typename detail::element_ref<N, cons<Head, Tail> >::RET
-      get(cons<Head, Tail>& t)
-      {
-        return get_class<N-1>::get(t.tail);
-      }
-
-      template<typename Head, typename Tail>
-      static inline
-      typename detail::element_const_ref<N, cons<Head, Tail> >::RET
-      get(const cons<Head, Tail>& t)
-      {
-        return get_class<N-1>::get(t.tail);
-      }
-    };
-
-    template<>
-    struct get_class<0>
-    {
-      template<typename Head, typename Tail>
-      static inline
-      typename add_reference<Head>::type
-      get(cons<Head, Tail>& t)
-      {
-        return t.head;
-      }
-
-      template<typename Head, typename Tail>
-      static inline
-      typename add_reference<const Head>::type
-      get(const cons<Head, Tail>& t)
-      {
-        return t.head;
-      }
-    };
-
-    } // namespace detail
-
-    // tuple class
-    template<
-      typename T1,
-      typename T2,
-      typename T3,
-      typename T4,
-      typename T5,
-      typename T6,
-      typename T7,
-      typename T8,
-      typename T9,
-      typename T10
-    >
-    class tuple :
-      public detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::cons1
-    {
-    private:
-      typedef detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> mapped_tuple;
-      typedef typename mapped_tuple::cons10 cons10;
-      typedef typename mapped_tuple::cons9 cons9;
-      typedef typename mapped_tuple::cons8 cons8;
-      typedef typename mapped_tuple::cons7 cons7;
-      typedef typename mapped_tuple::cons6 cons6;
-      typedef typename mapped_tuple::cons5 cons5;
-      typedef typename mapped_tuple::cons4 cons4;
-      typedef typename mapped_tuple::cons3 cons3;
-      typedef typename mapped_tuple::cons2 cons2;
-      typedef typename mapped_tuple::cons1 cons1;
-
-      typedef typename detail::add_const_reference<T1>::type t1_cref;
-      typedef typename detail::add_const_reference<T2>::type t2_cref;
-      typedef typename detail::add_const_reference<T3>::type t3_cref;
-      typedef typename detail::add_const_reference<T4>::type t4_cref;
-      typedef typename detail::add_const_reference<T5>::type t5_cref;
-      typedef typename detail::add_const_reference<T6>::type t6_cref;
-      typedef typename detail::add_const_reference<T7>::type t7_cref;
-      typedef typename detail::add_const_reference<T8>::type t8_cref;
-      typedef typename detail::add_const_reference<T9>::type t9_cref;
-      typedef typename detail::add_const_reference<T10>::type t10_cref;
-    public:
-      typedef cons1 inherited;
-      typedef tuple self_type;
-
-      tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
-        {}
-
-      tuple(
-          t1_cref t1,
-          t2_cref t2,
-          t3_cref t3 = T3(),
-          t4_cref t4 = T4(),
-          t5_cref t5 = T5(),
-          t6_cref t6 = T6(),
-          t7_cref t7 = T7(),
-          t8_cref t8 = T8(),
-          t9_cref t9 = T9(),
-          t10_cref t10 = T10()
-      ) :
-        cons1(t1, cons2(t2, cons3(t3, cons4(t4, cons5(t5, cons6(t6,cons7(t7,cons8(t8,cons9(t9,cons10(t10))))))))))
-      {
-      }
-
-      explicit tuple(t1_cref t1)
-        : cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
-      {}
-
-      template<typename Head, typename Tail>
-      tuple(const cons<Head, Tail>& other) :
-        cons1(other.head, other.tail)
-      {
-      }
-
-      template<typename First, typename Second>
-      self_type& operator=(const std::pair<First, Second>& other)
-      {
-        this->head = other.first;
-        this->tail.head = other.second;
-        return *this;
-      }
-
-      template<typename Head, typename Tail>
-      self_type& operator=(const cons<Head, Tail>& other)
-      {
-        this->head = other.head;
-        this->tail = other.tail;
-
-        return *this;
-      }
-    };
-
-    namespace detail {
-
-      template<int N> struct workaround_holder {};
-
-    } // namespace detail
-
-    template<int N, typename Head, typename Tail>
-    typename detail::element_ref<N, cons<Head, Tail> >::RET
-    get(cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
-    {
-      return detail::get_class<N>::get(t);
-    }
-
-    template<int N, typename Head, typename Tail>
-    typename detail::element_const_ref<N, cons<Head, Tail> >::RET
-    get(const cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
-    {
-      return detail::get_class<N>::get(t);
-    }
-
-    // Make a tuple
-    template<typename T1>
-    inline
-    tuple<T1>
-    make_tuple(const T1& t1)
-    {
-      return tuple<T1>(t1);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2>
-    inline
-    tuple<T1, T2>
-    make_tuple(const T1& t1, const T2& t2)
-    {
-      return tuple<T1, T2>(t1, t2);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3>
-    inline
-    tuple<T1, T2, T3>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3)
-    {
-      return tuple<T1, T2, T3>(t1, t2, t3);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4>
-    inline
-    tuple<T1, T2, T3, T4>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4)
-    {
-      return tuple<T1, T2, T3, T4>(t1, t2, t3, t4);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5>
-    inline
-    tuple<T1, T2, T3, T4, T5>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
-    {
-      return tuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
-    inline
-    tuple<T1, T2, T3, T4, T5, T6>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6)
-    {
-      return tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
-    inline
-    tuple<T1, T2, T3, T4, T5, T6, T7>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7)
-    {
-      return tuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
-    inline
-    tuple<T1, T2, T3, T4, T5, T6, T7, T8>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8)
-    {
-      return tuple<T1, T2, T3, T4, T5, T6, T7, T8>(t1, t2, t3, t4, t5, t6, t7, t8);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
-    inline
-    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9)
-    {
-      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>(t1, t2, t3, t4, t5, t6, t7, t8, t9);
-    }
-
-    // Make a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
-    inline
-    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
-    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10)
-    {
-      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
-    }
-
-    // Tie variables into a tuple
-    template<typename T1>
-    inline
-    tuple<detail::assign_to_pointee<T1> >
-    tie(T1& t1)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2> >
-    tie(T1& t1, T2& t2)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3> >
-    tie(T1& t1, T2& t2, T3& t3)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5>,
-      detail::assign_to_pointee<T6> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5),
-                        detail::assign_to_pointee<T6>(&t6));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5>,
-      detail::assign_to_pointee<T6>,
-      detail::assign_to_pointee<T7> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5),
-                        detail::assign_to_pointee<T6>(&t6),
-                        detail::assign_to_pointee<T7>(&t7));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5>,
-      detail::assign_to_pointee<T6>,
-      detail::assign_to_pointee<T7>,
-      detail::assign_to_pointee<T8> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5),
-                        detail::assign_to_pointee<T6>(&t6),
-                        detail::assign_to_pointee<T7>(&t7),
-                        detail::assign_to_pointee<T8>(&t8));
-    }
-
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5>,
-      detail::assign_to_pointee<T6>,
-      detail::assign_to_pointee<T7>,
-      detail::assign_to_pointee<T8>,
-      detail::assign_to_pointee<T9> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5),
-                        detail::assign_to_pointee<T6>(&t6),
-                        detail::assign_to_pointee<T7>(&t7),
-                        detail::assign_to_pointee<T8>(&t8),
-                        detail::assign_to_pointee<T9>(&t9));
-    }
-    // Tie variables into a tuple
-    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
-    inline
-    tuple<detail::assign_to_pointee<T1>,
-      detail::assign_to_pointee<T2>,
-      detail::assign_to_pointee<T3>,
-      detail::assign_to_pointee<T4>,
-      detail::assign_to_pointee<T5>,
-      detail::assign_to_pointee<T6>,
-      detail::assign_to_pointee<T7>,
-      detail::assign_to_pointee<T8>,
-      detail::assign_to_pointee<T9>,
-      detail::assign_to_pointee<T10> >
-    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10)
-    {
-      return make_tuple(detail::assign_to_pointee<T1>(&t1),
-                        detail::assign_to_pointee<T2>(&t2),
-                        detail::assign_to_pointee<T3>(&t3),
-                        detail::assign_to_pointee<T4>(&t4),
-                        detail::assign_to_pointee<T5>(&t5),
-                        detail::assign_to_pointee<T6>(&t6),
-                        detail::assign_to_pointee<T7>(&t7),
-                        detail::assign_to_pointee<T8>(&t8),
-                        detail::assign_to_pointee<T9>(&t9),
-                        detail::assign_to_pointee<T10>(&t10));
-    }
-    // "ignore" allows tuple positions to be ignored when using "tie".
-
-detail::swallow_assign const ignore = detail::swallow_assign();
-
-template <class T0, class T1, class T2, class T3, class T4,
-          class T5, class T6, class T7, class T8, class T9>
-void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
-          tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs);
-inline void swap(null_type&, null_type&) {}
-template<class HH>
-inline void swap(cons<HH, null_type>& lhs, cons<HH, null_type>& rhs) {
-  ::boost::swap(lhs.head, rhs.head);
-}
-template<class HH, class TT>
-inline void swap(cons<HH, TT>& lhs, cons<HH, TT>& rhs) {
-  ::boost::swap(lhs.head, rhs.head);
-  ::boost::tuples::swap(lhs.tail, rhs.tail);
-}
-template <class T0, class T1, class T2, class T3, class T4,
-          class T5, class T6, class T7, class T8, class T9>
-inline void swap(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& lhs,
-          tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& rhs) {
-  typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> tuple_type;
-  typedef typename tuple_type::inherited base;
-  ::boost::tuples::swap(static_cast<base&>(lhs), static_cast<base&>(rhs));
-}
-
-} // namespace tuples
-} // namespace boost
-#endif // BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,265 @@
+//
+// Copyright (c) Antony Polukhin, 2012-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_HPP
+
+/// \file boost/type_index.hpp
+/// \brief Includes minimal set of headers required to use the Boost.TypeIndex library.
+///
+/// By inclusion of this file most optimal type index classes will be included and used 
+/// as a boost::typeindex::type_index and boost::typeindex::type_info.
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+#if defined(BOOST_TYPE_INDEX_USER_TYPEINDEX)
+#   include BOOST_TYPE_INDEX_USER_TYPEINDEX
+#   ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#       pragma detect_mismatch( "boost__type_index__abi", "user defined type_index class is used: " BOOST_STRINGIZE(BOOST_TYPE_INDEX_USER_TYPEINDEX))
+#   endif
+#elif (!defined(BOOST_NO_RTTI) && !defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)) || defined(BOOST_MSVC)
+#   include <boost/type_index/stl_type_index.hpp>
+#   if defined(BOOST_NO_RTTI) || defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)
+#       include <boost/type_index/detail/stl_register_class.hpp>
+#       ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#           pragma detect_mismatch( "boost__type_index__abi", "RTTI is off - typeid() is used only for templates")
+#       endif
+#   else
+#       ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#           pragma detect_mismatch( "boost__type_index__abi", "RTTI is used")
+#       endif
+#   endif
+#else
+#   include <boost/type_index/ctti_type_index.hpp>
+#   include <boost/type_index/detail/ctti_register_class.hpp>
+#   ifdef BOOST_HAS_PRAGMA_DETECT_MISMATCH
+#       pragma detect_mismatch( "boost__type_index__abi", "RTTI is off - using CTTI")
+#   endif
+#endif
+
+#ifndef BOOST_TYPE_INDEX_REGISTER_CLASS
+#define BOOST_TYPE_INDEX_REGISTER_CLASS
+#endif
+
+namespace boost { namespace typeindex {
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// \def BOOST_TYPE_INDEX_FUNCTION_SIGNATURE
+/// BOOST_TYPE_INDEX_FUNCTION_SIGNATURE is used by boost::typeindex::ctti_type_index class to
+/// deduce the name of a type. If your compiler is not recognized
+/// by the TypeIndex library and you wish to work with boost::typeindex::ctti_type_index, you may
+/// define this macro by yourself.
+///
+/// BOOST_TYPE_INDEX_FUNCTION_SIGNATURE must be defined to a compiler specific macro
+/// that outputs the \b whole function signature \b including \b template \b parameters.
+///
+/// If your compiler is not recognised and BOOST_TYPE_INDEX_FUNCTION_SIGNATURE is not defined,
+/// then a compile-time error will arise at any attempt to use boost::typeindex::ctti_type_index classes.
+///
+/// See BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS and BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
+/// for an information of how to tune the implementation to make a nice pretty_name() output.
+#define BOOST_TYPE_INDEX_FUNCTION_SIGNATURE BOOST_CURRENT_FUNCTION
+
+/// \def BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING
+/// This is a helper macro for making correct pretty_names() with RTTI off.
+///
+/// BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING macro may be defined to
+/// '(begin_skip, end_skip, runtime_skip, runtime_skip_until)' with parameters for adding a
+/// support for compilers, that by default are not recognized by TypeIndex library.
+///
+/// \b Example:
+///
+/// Imagine the situation when
+/// \code boost::typeindex::ctti_type_index::type_id<int>().pretty_name() \endcode
+/// returns the following string:
+/// \code "static const char *boost::detail::ctti<int>::n() [T = int]" \endcode
+/// and \code boost::typeindex::ctti_type_index::type_id<short>().pretty_name() \endcode returns the following:
+/// \code "static const char *boost::detail::ctti<short>::n() [T = short]" \endcode
+///
+/// As we may see first 39 characters are "static const char *boost::detail::ctti<" and they do not depend on
+/// the type T. After first 39 characters we have a human readable type name which is duplicated at the end
+/// of a string. String always ends on ']', which consumes 1 character.
+///
+/// Now if we define `BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING` to
+/// `(39, 1, false, "")` we'll be getting \code "int>::n() [T = int" \endcode
+/// for `boost::typeindex::ctti_type_index::type_id<int>().pretty_name()` and \code "short>::n() [T = short" \endcode
+/// for `boost::typeindex::ctti_type_index::type_id<short>().pretty_name()`.
+///
+/// Now we need to take additional care of the characters that go before the last mention of our type. We'll
+/// do that by telling the macro that we need to cut off everything that goes before the "T = " including the "T = "
+/// itself:
+///
+/// \code (39, 1, true, "T = ") \endcode
+///
+/// In case of GCC or Clang command line we need to add the following line while compiling all the sources:
+///
+/// \code
+/// -DBOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING='(39, 1, true, "T = ")'
+/// \endcode
+/// \param begin_skip How many characters must be skipped at the beginning of the type holding string.
+/// Must be a compile time constant.
+/// \param end_skip How many characters must be skipped at the end of the type holding string.
+/// Must be a compile time constant.
+/// \param runtime_skip Do we need additional checks at runtime to cut off the more characters.
+/// Must be `true` or `false`.
+/// \param runtime_skip_until Skip all the characters before the following string (including the string itself).
+/// Must be a compile time array of characters.
+///
+/// See [RTTI emulation limitations](boost_typeindex/rtti_emulation_limitations.html) for more info.
+#define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING (0, 0, false, "")
+
+
+    /// Depending on a compiler flags, optimal implementation of type_index will be used 
+    /// as a default boost::typeindex::type_index.
+    ///
+    /// Could be a boost::typeindex::stl_type_index, boost::typeindex::ctti_type_index or 
+    /// user defined type_index class.
+    ///
+    /// \b See boost::typeindex::type_index_facade for a full description of type_index functions.
+    typedef platform_specific type_index;
+#elif defined(BOOST_TYPE_INDEX_USER_TYPEINDEX)
+    // Nothing to do
+#elif (!defined(BOOST_NO_RTTI) && !defined(BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)) || defined(BOOST_MSVC)
+    typedef boost::typeindex::stl_type_index type_index;
+#else 
+    typedef boost::typeindex::ctti_type_index type_index;
+#endif
+
+/// Depending on a compiler flags, optimal implementation of type_info will be used 
+/// as a default boost::typeindex::type_info.
+///
+/// Could be a std::type_info, boost::typeindex::detail::ctti_data or 
+/// some user defined class.
+///
+/// type_info \b is \b not copyable or default constructible. It is \b not assignable too!
+typedef type_index::type_info_t type_info;
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// \def BOOST_TYPE_INDEX_USER_TYPEINDEX
+/// BOOST_TYPE_INDEX_USER_TYPEINDEX can be defined to the path to header file
+/// with user provided implementation of type_index.
+///
+/// See [Making a custom type_index](boost_typeindex/making_a_custom_type_index.html) section
+/// of documentation for usage example.
+#define BOOST_TYPE_INDEX_USER_TYPEINDEX <full/absolute/path/to/header/with/type_index.hpp>
+
+
+/// \def BOOST_TYPE_INDEX_REGISTER_CLASS
+/// BOOST_TYPE_INDEX_REGISTER_CLASS is used to help to emulate RTTI.
+/// Put this macro into the public section of polymorphic class to allow runtime type detection.
+///
+/// Depending on the typeid() availability this macro will expand to nothing or to virtual helper function
+/// `virtual const type_info& boost_type_info_type_id_runtime_() const noexcept`.
+///
+/// \b Example:
+/// \code
+/// class A {
+/// public:
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+///     virtual ~A(){}
+/// };
+///
+/// struct B: public A {
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+/// };
+///
+/// struct C: public B {
+///     BOOST_TYPE_INDEX_REGISTER_CLASS
+/// };
+///
+/// ...
+///
+/// C c1;
+/// A* pc1 = &c1;
+/// assert(boost::typeindex::type_id<C>() == boost::typeindex::type_id_runtime(*pc1));
+/// \endcode
+#define BOOST_TYPE_INDEX_REGISTER_CLASS nothing-or-some-virtual-functions
+
+/// \def BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY
+/// BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY is a helper macro that must be defined if mixing
+/// RTTI on/off modules. See
+/// [Mixing sources with RTTI on and RTTI off](boost_typeindex/mixing_sources_with_rtti_on_and_.html)
+/// section of documentation for more info.
+#define BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY
+
+#endif // defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+
+/// Function to get boost::typeindex::type_index for a type T.
+/// Removes const, volatile && and & modifiers from T.
+///
+/// \b Example:
+/// \code
+/// type_index ti = type_id<int&>();
+/// std::cout << ti.pretty_name();  // Outputs 'int'
+/// \endcode
+///
+/// \tparam T Type for which type_index must be created.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified type T.
+template <class T>
+inline type_index type_id() BOOST_NOEXCEPT {
+    return type_index::type_id<T>();
+}
+
+/// Function for constructing boost::typeindex::type_index instance for type T. 
+/// Does not remove const, volatile, & and && modifiers from T.
+///
+/// If T has no const, volatile, & and && modifiers, then returns exactly 
+/// the same result as in case of calling `type_id<T>()`.
+///
+/// \b Example:
+/// \code
+/// type_index ti = type_id_with_cvr<int&>();
+/// std::cout << ti.pretty_name();  // Outputs 'int&'
+/// \endcode
+///
+/// \tparam T Type for which type_index must be created.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified type T.
+template <class T>
+inline type_index type_id_with_cvr() BOOST_NOEXCEPT {
+    return type_index::type_id_with_cvr<T>();
+}
+
+/// Function that works exactly like C++ typeid(rtti_val) call, but returns boost::type_index.
+///
+/// Retunrs runtime information about specified type.
+///
+/// \b Requirements: RTTI available or Base and Derived classes must be marked with BOOST_TYPE_INDEX_REGISTER_CLASS.
+///
+/// \b Example:
+/// \code
+/// struct Base { virtual ~Base(){} };
+/// struct Derived: public Base  {};
+/// ...
+/// Derived d;
+/// Base& b = d;
+/// type_index ti = type_id_runtime(b);
+/// std::cout << ti.pretty_name();  // Outputs 'Derived'
+/// \endcode
+///
+/// \param runtime_val Varaible which runtime type must be returned.
+/// \throw Nothing.
+/// \return boost::typeindex::type_index with information about the specified variable.
+template <class T>
+inline type_index type_id_runtime(const T& runtime_val) BOOST_NOEXCEPT {
+    return type_index::type_id_runtime(runtime_val);
+}
+
+}} // namespace boost::typeindex
+
+
+
+#endif // BOOST_TYPE_INDEX_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/ctti_type_index.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,179 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+
+/// \file ctti_type_index.hpp
+/// \brief Contains boost::typeindex::ctti_type_index class.
+///
+/// boost::typeindex::ctti_type_index class can be used as a drop-in replacement 
+/// for std::type_index.
+///
+/// It is used in situations when typeid() method is not available or 
+/// BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY macro is defined.
+
+#include <boost/type_index/type_index_facade.hpp>
+#include <boost/type_index/detail/compile_time_type_info.hpp>
+
+#include <cstring>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex {
+
+namespace detail {
+
+// That's the most trickiest part of the TypeIndex library:
+//      1) we do not want to give user ability to manually construct and compare `struct-that-represents-type`
+//      2) we need to distinguish between `struct-that-represents-type` and `const char*`
+//      3) we need a thread-safe way to have references to instances `struct-that-represents-type`
+//      4) we need a compile-time control to make sure that user does not copy or
+// default construct `struct-that-represents-type`
+//
+// Solution would be the following:
+
+/// \class ctti_data
+/// Standard-layout class with private constructors and assignment operators.
+///
+/// You can not work with this class directly. The  purpose of this class is to hold type info 
+/// \b when \b RTTI \b is \b off and allow ctti_type_index construction from itself.
+///
+/// \b Example:
+/// \code
+/// const detail::ctti_data& foo();
+/// ...
+/// type_index ti = type_index(foo());
+/// std::cout << ti.pretty_name();
+/// \endcode
+class ctti_data {
+#ifndef BOOST_NO_CXX11_DELETED_FUNCTIONS
+public:
+    ctti_data() = delete;
+    ctti_data(const ctti_data&) = delete;
+    ctti_data& operator=(const ctti_data&) = delete;
+#else
+private:
+    ctti_data();
+    ctti_data(const ctti_data&);
+    ctti_data& operator=(const ctti_data&);
+#endif
+};
+
+} // namespace detail
+
+/// Helper method for getting detail::ctti_data of a template parameter T.
+template <class T>
+inline const detail::ctti_data& ctti_construct() BOOST_NOEXCEPT {
+    // Standard C++11, 5.2.10 Reinterpret cast:
+    // An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue
+    // v of type "pointer to T1" is converted to the type "pointer to cv T2", the result is static_cast<cv
+    // T2*>(static_cast<cv void*>(v)) if both T1 and T2 are standard-layout types (3.9) and the alignment
+    // requirements of T2 are no stricter than those of T1, or if either type is void. Converting a prvalue of type
+    // "pointer to T1" to the type "pointer to T2" (where T1 and T2 are object types and where the alignment
+    // requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer
+    // value.
+    //
+    // Alignments are checked in `type_index_test_ctti_alignment.cpp` test.
+    return *reinterpret_cast<const detail::ctti_data*>(boost::detail::ctti<T>::n());
+}
+
+/// \class ctti_type_index
+/// This class is a wrapper that pretends to work exactly like stl_type_index, but does 
+/// not require RTTI support. \b For \b description \b of \b functions \b see type_index_facade.
+///
+/// This class produces slightly longer type names, so consider using stl_type_index 
+/// in situations when typeid() is working.
+class ctti_type_index: public type_index_facade<ctti_type_index, detail::ctti_data> {
+    const detail::ctti_data* data_;
+
+    inline std::size_t get_raw_name_length() const BOOST_NOEXCEPT;
+
+public:
+    typedef detail::ctti_data type_info_t;
+
+    inline ctti_type_index() BOOST_NOEXCEPT
+        : data_(&ctti_construct<void>())
+    {}
+
+    inline ctti_type_index(const type_info_t& data) BOOST_NOEXCEPT
+        : data_(&data)
+    {}
+
+    inline const type_info_t&  type_info() const BOOST_NOEXCEPT;
+    inline const char*  raw_name() const BOOST_NOEXCEPT;
+    inline std::string  pretty_name() const;
+    inline std::size_t  hash_code() const BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id_with_cvr() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static ctti_type_index type_id_runtime(const T& variable) BOOST_NOEXCEPT;
+};
+
+
+inline const ctti_type_index::type_info_t& ctti_type_index::type_info() const BOOST_NOEXCEPT {
+    return *data_;
+}
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type no_ref_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_cv<no_ref_t>::type no_cvr_t;
+    return ctti_construct<no_cvr_t>();
+}
+
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id_with_cvr() BOOST_NOEXCEPT {
+    return ctti_construct<T>();
+}
+
+
+template <class T>
+inline ctti_type_index ctti_type_index::type_id_runtime(const T& variable) BOOST_NOEXCEPT {
+    return variable.boost_type_index_type_id_runtime_();
+}
+
+
+inline const char* ctti_type_index::raw_name() const BOOST_NOEXCEPT {
+    return reinterpret_cast<const char*>(data_);
+}
+
+inline std::size_t ctti_type_index::get_raw_name_length() const BOOST_NOEXCEPT {
+    return std::strlen(raw_name() + detail::ctti_skip_size_at_end);
+}
+
+
+inline std::string ctti_type_index::pretty_name() const {
+    std::size_t len = get_raw_name_length();
+    while (raw_name()[len - 1] == ' ') --len; // MSVC sometimes adds whitespaces
+    return std::string(raw_name(), len);
+}
+
+
+inline std::size_t ctti_type_index::hash_code() const BOOST_NOEXCEPT {
+    return boost::hash_range(raw_name(), raw_name() + get_raw_name_length());
+}
+
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_CTTI_TYPE_INDEX_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/detail/compile_time_type_info.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,144 @@
+//
+// Copyright (c) Antony Polukhin, 2012-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+#define BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+
+/// \file compile_time_type_info.hpp
+/// \brief Contains helper macros and implementation details of boost::typeindex::ctti_type_index.
+/// Not intended for inclusion from user's code. 
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/bool.hpp>
+#include <algorithm>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(begin_skip, end_skip, runtime_skip, runtime_skip_until)   \
+    namespace boost { namespace typeindex { namespace detail {                                                  \
+        BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_begin  = begin_skip;                               \
+        BOOST_STATIC_CONSTEXPR std::size_t ctti_skip_size_at_end    = end_skip;                                 \
+        BOOST_STATIC_CONSTEXPR bool ctti_skip_more_at_runtime       = runtime_skip;                             \
+        BOOST_STATIC_CONSTEXPR char ctti_skip_until_runtime[]       = runtime_skip_until;                       \
+    }}} /* namespace boost::typeindex::detail */                                                                \
+    /**/  
+/// @endcond
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+    /* Nothing to document. All the macro docs are moved to <boost/type_index.hpp> */
+#elif defined(BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING)
+
+#   include <boost/preprocessor/facilities/expand.hpp>
+    BOOST_PP_EXPAND( BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING )
+
+#elif defined(_MSC_VER)
+    // sizeof("const char *__cdecl boost::detail::ctti<") - 1, sizeof(">::n(void)") - 1
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(40, 10, false, "");
+#elif defined(__clang__) && defined(__APPLE__)
+    // Someone made __clang_major__ equal to LLVM version rather than compiler version
+    // on APPLE platform.
+    //
+    // Using less efficient solution because there is no good way to detect real version of Clang.
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "???????????>::n() [T = int"
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ");
+#elif defined(__clang__) && (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ == 0))
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof(">::n()") - 1
+    // note: checked on 3.0
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 6, false, "");
+#elif defined(__clang__) && __clang_major__ == 3 && __clang_minor__ > 0
+    // sizeof("static const char *boost::detail::ctti<") - 1, sizeof("]") - 1, true, "int>::n() [T = int"
+    // note: checked on 3.1, 3.4
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(39, 1, true, "T = ");
+#elif defined(__GNUC__)
+    // sizeof("static const char* boost::detail::ctti<T>::n() [with T = ") - 1, sizeof("]") - 1
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(57, 1, false, "");
+#else
+    // Deafult code for other platforms... Just skip nothing!
+    BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS(0, 0, false, "");
+#endif
+
+#undef BOOST_TYPE_INDEX_REGISTER_CTTI_PARSING_PARAMS
+
+namespace boost { namespace typeindex { namespace detail { 
+    template <bool Condition>
+    inline void assert_compile_time_legths() BOOST_NOEXCEPT {
+        BOOST_STATIC_ASSERT_MSG(
+            Condition,
+            "TypeIndex library is misconfigured for your compiler. "
+            "Please define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct values. See section "
+            "'RTTI emulation limitations' of the documentation for more information."
+        );
+    }
+    
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining_runtime(const char* begin, boost::mpl::false_) BOOST_NOEXCEPT {
+        return begin;
+    }
+
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining_runtime(const char* begin, boost::mpl::true_) BOOST_NOEXCEPT {
+        const char* const it = std::search(
+            begin, begin + ArrayLength,
+            ctti_skip_until_runtime, ctti_skip_until_runtime + sizeof(ctti_skip_until_runtime) - 1
+        );
+        return (it == begin + ArrayLength ? begin : it + sizeof(ctti_skip_until_runtime) - 1);
+    }
+
+    template <std::size_t ArrayLength>
+    inline const char* skip_begining(const char* begin) BOOST_NOEXCEPT {
+        assert_compile_time_legths<(ArrayLength > ctti_skip_size_at_begin + ctti_skip_size_at_end)>();
+        return skip_begining_runtime<ArrayLength - ctti_skip_size_at_begin>(
+            begin + ctti_skip_size_at_begin, 
+            boost::mpl::bool_<ctti_skip_more_at_runtime>()
+        );
+    }
+}}} // namespace boost::typeindex::detail
+
+namespace boost { namespace detail {
+
+/// Noncopyable type_info that does not require RTTI.
+/// CTTI == Compile Time Type Info.
+/// This name must be as short as possible, to avoid code bloat
+template <class T>
+struct ctti {
+
+    /// Returns raw name. Must be as short, as possible, to avoid code bloat
+    static const char* n() BOOST_NOEXCEPT {
+    #if defined(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE)
+        return boost::typeindex::detail::skip_begining< sizeof(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE >(BOOST_TYPE_INDEX_FUNCTION_SIGNATURE);
+    #elif defined(__FUNCSIG__)
+        return boost::typeindex::detail::skip_begining< sizeof(__FUNCSIG__) >(__FUNCSIG__);
+    #elif defined(__PRETTY_FUNCTION__) \
+                || defined(__GNUC__) \
+                || (defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)) \
+                || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) \
+                || (defined(__ICC) && (__ICC >= 600)) \
+                || defined(__ghs__) \
+                || defined(__DMC__)
+
+        return boost::typeindex::detail::skip_begining< sizeof(__PRETTY_FUNCTION__) >(__PRETTY_FUNCTION__);
+    #else
+        BOOST_STATIC_ASSERT_MSG(
+            sizeof(T) && false,
+            "TypeIndex library could not detect your compiler. "
+            "Please make the BOOST_TYPE_INDEX_FUNCTION_SIGNATURE macro use "
+            "correct compiler macro for getting the whole function name. "
+            "Define BOOST_TYPE_INDEX_CTTI_USER_DEFINED_PARSING to correct value after that."
+        );
+    #endif
+    }
+};
+
+}} // namespace boost::detail
+
+#endif // BOOST_TYPE_INDEX_DETAIL_COMPILE_TIME_TYPE_INFO_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/detail/ctti_register_class.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+#define BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+
+/// \file ctti_register_class.hpp
+/// \brief Contains BOOST_TYPE_INDEX_REGISTER_CLASS macro implementation that uses boost::typeindex::ctti_type_index.
+/// Not intended for inclusion from user's code.
+
+#include <boost/type_index/ctti_type_index.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex { namespace detail {
+
+template <class T>
+inline const ctti_data& ctti_construct_typeid_ref(const T*) BOOST_NOEXCEPT {
+    return ctti_construct<T>();
+}
+
+}}} // namespace boost::typeindex::detail
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CLASS                                                                             \
+    virtual const boost::typeindex::detail::ctti_data& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT {   \
+        return boost::typeindex::detail::ctti_construct_typeid_ref(this);                                           \
+    }                                                                                                               \
+/**/
+/// @endcond
+
+#endif // BOOST_TYPE_INDEX_CTTI_REGISTER_CLASS_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/detail/stl_register_class.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,40 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+#define BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+
+/// \file stl_register_class.hpp
+/// \brief Contains BOOST_TYPE_INDEX_REGISTER_CLASS macro implementation that uses boost::typeindex::stl_type_index.
+/// Not intended for inclusion from user's code.
+
+#include <boost/type_index/stl_type_index.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex { namespace detail {
+
+template <class T>
+inline const stl_type_index::type_info_t& stl_construct_typeid_ref(const T*) BOOST_NOEXCEPT {
+    return typeid(T);
+}
+
+}}} // namespace boost::typeindex::detail
+
+/// @cond
+#define BOOST_TYPE_INDEX_REGISTER_CLASS                                                                                     \
+    virtual const boost::typeindex::stl_type_index::type_info_t& boost_type_index_type_id_runtime_() const BOOST_NOEXCEPT { \
+        return boost::typeindex::detail::stl_construct_typeid_ref(this);                                                    \
+    }                                                                                                                       \
+/**/
+/// @endcond
+
+#endif // BOOST_TYPE_INDEX_STL_REGISTER_CLASS_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/stl_type_index.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,273 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
+#define BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
+
+/// \file stl_type_index.hpp
+/// \brief Contains boost::typeindex::stl_type_index class.
+///
+/// boost::typeindex::stl_type_index class can be used as a drop-in replacement 
+/// for std::type_index.
+///
+/// It is used in situations when RTTI is enabled or typeid() method is available.
+/// When typeid() is disabled or BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY macro
+/// is defined boost::typeindex::ctti is usually used instead of boost::typeindex::stl_type_index.
+
+#include <boost/type_index/type_index_facade.hpp>
+
+// MSVC is capable of calling typeid(T) even when RTTI is off
+#if defined(BOOST_NO_RTTI) && !defined(BOOST_MSVC)
+#error "File boost/type_index/stl_type_index.ipp is not usable when typeid() is not available."
+#endif
+
+#include <typeinfo>
+#include <cstring>                                  // std::strcmp, std::strlen, std::strstr
+#include <stdexcept>
+#include <boost/static_assert.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/core/demangle.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/functional/hash_fwd.hpp>
+
+#if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \
+        || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744)
+#   include <boost/type_traits/is_signed.hpp>
+#   include <boost/type_traits/make_signed.hpp>
+#   include <boost/mpl/identity.hpp>
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex {
+
+/// \class stl_type_index
+/// This class is a wrapper around std::type_info, that workarounds issues and provides
+/// much more rich interface. \b For \b description \b of \b functions \b see type_index_facade.
+///
+/// This class requires typeid() to work. For cases when RTTI is disabled see ctti_type_index.
+class stl_type_index
+    : public type_index_facade<
+        stl_type_index, 
+        #ifdef BOOST_NO_STD_TYPEINFO
+            type_info
+        #else
+            std::type_info
+        #endif
+    > 
+{
+public:
+#ifdef BOOST_NO_STD_TYPEINFO
+    typedef type_info type_info_t;
+#else
+    typedef std::type_info type_info_t;
+#endif
+
+private:
+    const type_info_t* data_;
+
+public:
+    inline stl_type_index() BOOST_NOEXCEPT
+        : data_(&typeid(void))
+    {}
+
+    inline stl_type_index(const type_info_t& data) BOOST_NOEXCEPT
+        : data_(&data)
+    {}
+
+    inline const type_info_t&  type_info() const BOOST_NOEXCEPT;
+
+    inline const char*  raw_name() const BOOST_NOEXCEPT;
+    inline const char*  name() const BOOST_NOEXCEPT;
+    inline std::string  pretty_name() const;
+
+    inline std::size_t  hash_code() const BOOST_NOEXCEPT;
+    inline bool         equal(const stl_type_index& rhs) const BOOST_NOEXCEPT;
+    inline bool         before(const stl_type_index& rhs) const BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id_with_cvr() BOOST_NOEXCEPT;
+
+    template <class T>
+    inline static stl_type_index type_id_runtime(const T& value) BOOST_NOEXCEPT;
+};
+
+inline const stl_type_index::type_info_t& stl_type_index::type_info() const BOOST_NOEXCEPT {
+    return *data_;
+}
+
+
+inline const char* stl_type_index::raw_name() const BOOST_NOEXCEPT {
+#ifdef _MSC_VER
+    return data_->raw_name();
+#else
+    return data_->name();
+#endif
+}
+
+inline const char* stl_type_index::name() const BOOST_NOEXCEPT {
+    return data_->name();
+}
+
+inline std::string stl_type_index::pretty_name() const {
+    static const char cvr_saver_name[] = "boost::typeindex::detail::cvr_saver<";
+    static BOOST_CONSTEXPR_OR_CONST std::string::size_type cvr_saver_name_len = sizeof(cvr_saver_name) - 1;
+
+    // In case of MSVC demangle() is a no-op, and name() already returns demangled name.
+    // In case of GCC and Clang (on non-Windows systems) name() returns mangled name and demangle() undecorates it.
+    const boost::core::scoped_demangled_name demangled_name(data_->name());
+
+    const char* begin = demangled_name.get();
+    if (!begin) {
+        boost::throw_exception(std::runtime_error("Type name demangling failed"));
+    }
+
+    const std::string::size_type len = std::strlen(begin);
+    const char* end = begin + len;
+
+    if (len > cvr_saver_name_len) {
+        const char* b = std::strstr(begin, cvr_saver_name);
+        if (b) {
+            b += cvr_saver_name_len;
+
+            // Trim leading spaces
+            while (*b == ' ') {         // the string is zero terminated, we won't exceed the buffer size
+                ++ b;
+            }
+
+            // Skip the closing angle bracket
+            const char* e = end - 1;
+            while (e > b && *e != '>') {
+                -- e;
+            }
+
+            // Trim trailing spaces
+            while (e > b && *(e - 1) == ' ') {
+                -- e;
+            }
+
+            if (b < e) {
+                // Parsing seems to have succeeded, the type name is not empty
+                begin = b;
+                end = e;
+            }
+        }
+    }
+
+    return std::string(begin, end);
+}
+
+
+inline std::size_t stl_type_index::hash_code() const BOOST_NOEXCEPT {
+#if _MSC_VER > 1600 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5 && defined(__GXX_EXPERIMENTAL_CXX0X__))
+    return data_->hash_code();
+#else
+    return boost::hash_range(raw_name(), raw_name() + std::strlen(raw_name()));
+#endif
+}
+
+
+/// @cond
+
+// for this compiler at least, cross-shared-library type_info
+// comparisons don't work, so we are using typeid(x).name() instead.
+# if (defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5))) \
+    || defined(_AIX) \
+    || (defined(__sgi) && defined(__host_mips)) \
+    || (defined(__hpux) && defined(__HP_aCC)) \
+    || (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC))
+#  define BOOST_CLASSINFO_COMPARE_BY_NAMES
+# endif
+
+/// @endcond
+
+inline bool stl_type_index::equal(const stl_type_index& rhs) const BOOST_NOEXCEPT {
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+    return raw_name() == rhs.raw_name() || !std::strcmp(raw_name(), rhs.raw_name());
+#else
+    return *data_ == *rhs.data_;
+#endif
+}
+
+inline bool stl_type_index::before(const stl_type_index& rhs) const BOOST_NOEXCEPT {
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+    return raw_name() != rhs.raw_name() && std::strcmp(raw_name(), rhs.raw_name()) < 0;
+#else
+    return !!data_->before(*rhs.data_);
+#endif
+}
+
+#ifdef BOOST_CLASSINFO_COMPARE_BY_NAMES
+#undef BOOST_CLASSINFO_COMPARE_BY_NAMES
+#endif
+
+
+
+template <class T>
+inline stl_type_index stl_type_index::type_id() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type no_ref_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_cv<no_ref_t>::type no_cvr_prefinal_t;
+
+    #  if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \
+        || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744)
+
+        // Old EDG-based compilers seem to mistakenly distinguish 'integral' from 'signed integral'
+        // in typeid() expressions. Full template specialization for 'integral' fixes that issue:
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+            boost::is_signed<no_cvr_prefinal_t>,
+            boost::make_signed<no_cvr_prefinal_t>,
+            boost::mpl::identity<no_cvr_prefinal_t>
+        >::type no_cvr_prefinal_lazy_t;
+
+        typedef BOOST_DEDUCED_TYPENAME no_cvr_prefinal_t::type no_cvr_t;
+    #else
+        typedef no_cvr_prefinal_t no_cvr_t;
+    #endif
+
+    return typeid(no_cvr_t);
+}
+
+namespace detail {
+    template <class T> class cvr_saver{};
+}
+
+template <class T>
+inline stl_type_index stl_type_index::type_id_with_cvr() BOOST_NOEXCEPT {
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_<
+        boost::mpl::or_<boost::is_reference<T>, boost::is_const<T>, boost::is_volatile<T> >,
+        detail::cvr_saver<T>,
+        T
+    >::type type;
+
+    return typeid(type);
+}
+
+
+template <class T>
+inline stl_type_index stl_type_index::type_id_runtime(const T& value) BOOST_NOEXCEPT {
+#ifdef BOOST_NO_RTTI
+    return value.boost_type_index_type_id_runtime_();
+#else
+    return typeid(value);
+#endif
+}
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_STL_TYPE_INDEX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_index/type_index_facade.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,296 @@
+//
+// Copyright (c) Antony Polukhin, 2013-2014.
+//
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+#define BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+
+#include <boost/config.hpp>
+#include <boost/functional/hash_fwd.hpp>
+#include <string>
+#include <cstring>
+
+#if !defined(BOOST_NO_IOSTREAM)
+#if !defined(BOOST_NO_IOSFWD)
+#include <iosfwd>               // for std::basic_ostream
+#else
+#include <ostream>
+#endif
+#endif
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+# pragma once
+#endif
+
+namespace boost { namespace typeindex {
+
+/// \class type_index_facade
+///
+/// This class takes care about the comparison operators, hash functions and 
+/// ostream operators. Use this class as a public base class for defining new
+/// type_info-conforming classes.
+///
+/// \b Example:
+/// \code
+/// class stl_type_index: public type_index_facade<stl_type_index, std::type_info> 
+/// {
+/// public:
+///     typedef std::type_info type_info_t;
+/// private:
+///     const type_info_t* data_;
+///
+/// public:
+///     stl_type_index(const type_info_t& data) noexcept
+///         : data_(&data)
+///     {}
+/// // ...
+/// };
+/// \endcode
+///
+/// \tparam Derived Class derived from type_index_facade.
+/// \tparam TypeInfo Class that will be used as a base type_info class.
+/// \note Take a look at the protected methods. They are \b not \b defined in type_index_facade. 
+/// Protected member functions raw_name() \b must be defined in Derived class. All the other 
+/// methods are mandatory.
+/// \see 'Making a custom type_index' section for more information about 
+/// creating your own type_index using type_index_facade.
+template <class Derived, class TypeInfo>
+class type_index_facade {
+private:
+    /// @cond
+    const Derived & derived() const BOOST_NOEXCEPT {
+      return *static_cast<Derived const*>(this);
+    }
+    /// @endcond
+public:
+    typedef TypeInfo                                type_info_t;
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Name of a type. By default returns Derived::raw_name().
+    inline const char* name() const BOOST_NOEXCEPT {
+        return derived().raw_name();
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides may throw.
+    /// \return Human readable type name. By default returns Derived::name().
+    inline std::string pretty_name() const {
+        return derived().name();
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return True if two types are equal. By default compares types by raw_name().
+    inline bool equal(const Derived& rhs) const BOOST_NOEXCEPT {
+        const char* const left = derived().raw_name();
+        const char* const right = rhs.raw_name();
+        return left == right || !std::strcmp(left, right);
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return True if rhs is greater than this. By default compares types by raw_name().
+    inline bool before(const Derived& rhs) const BOOST_NOEXCEPT {
+        const char* const left = derived().raw_name();
+        const char* const right = rhs.raw_name();
+        return left != right && std::strcmp(left, right) < 0;
+    }
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Hash code of a type. By default hashes types by raw_name().
+    /// \note <boost/functional/hash.hpp> has to be included if this function is used.
+    inline std::size_t hash_code() const BOOST_NOEXCEPT {
+        const char* const name = derived().raw_name();
+        return boost::hash_range(name, name + std::strlen(name));
+    }
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+protected:
+    /// \b Override: This function \b must be redefined in Derived class. Overrides \b must not throw.
+    /// \return Pointer to unredable/raw type name.
+    inline const char* raw_name() const BOOST_NOEXCEPT;
+
+    /// \b Override: This function \b may be redefined in Derived class. Overrides \b must not throw.
+    /// \return Const reference to underlying low level type_info_t.
+    inline const type_info_t& type_info() const BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id() will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class. Overrides \b must not throw. 
+    /// Overrides \b must remove const, volatile && and & modifiers from T.
+    /// \tparam T Type for which type_index must be created.
+    /// \return type_index for type T.
+    template <class T>
+    static Derived type_id() BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id_with_cvr() will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class. Overrides \b must not throw. 
+    /// Overrides \b must \b not remove const, volatile && and & modifiers from T.
+    /// \tparam T Type for which type_index must be created.
+    /// \return type_index for type T.
+    template <class T>
+    static Derived type_id_with_cvr() BOOST_NOEXCEPT;
+
+    /// This is a factory method that is used to create instances of Derived classes.
+    /// boost::typeindex::type_id_runtime(const T&) will call this method, if Derived has same type as boost::typeindex::type_index.
+    ///
+    /// \b Override: This function \b may be redefined and made public in Derived class.
+    /// \param variable Variable which runtime type will be stored in type_index.
+    /// \return type_index with runtime type of variable.
+    template <class T>
+    static Derived type_id_runtime(const T& variable) BOOST_NOEXCEPT;
+
+#endif
+
+};
+
+/// @cond
+template <class Derived, class TypeInfo>
+inline bool operator == (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).equal(static_cast<Derived const&>(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).before(static_cast<Derived const&>(rhs));;
+}
+
+
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return rhs < lhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs > rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs < rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const type_index_facade<Derived, TypeInfo>& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(lhs == rhs);
+}
+
+// ######################### COMPARISONS with Derived ############################ //
+template <class Derived, class TypeInfo>
+inline bool operator == (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return Derived(lhs) == rhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return Derived(lhs) < rhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return rhs < Derived(lhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) > rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) < rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const TypeInfo& lhs, const type_index_facade<Derived, TypeInfo>& rhs) BOOST_NOEXCEPT {
+    return !(Derived(lhs) == rhs);
+}
+
+
+template <class Derived, class TypeInfo>
+inline bool operator == (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return lhs == Derived(rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator < (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return lhs < Derived(rhs);
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator > (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return Derived(rhs) < lhs;
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator <= (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs > Derived(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator >= (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs < Derived(rhs));
+}
+
+template <class Derived, class TypeInfo>
+inline bool operator != (const type_index_facade<Derived, TypeInfo>& lhs, const TypeInfo& rhs) BOOST_NOEXCEPT {
+    return !(lhs == Derived(rhs));
+}
+
+// ######################### COMPARISONS with Derived END ############################ //
+
+/// @endcond
+
+#if defined(BOOST_TYPE_INDEX_DOXYGEN_INVOKED)
+
+/// noexcept comparison operators for type_index_facade classes.
+bool operator ==, !=, <, ... (const type_index_facade& lhs, const type_index_facade& rhs) noexcept;
+
+/// noexcept comparison operators for type_index_facade and it's TypeInfo classes.
+bool operator ==, !=, <, ... (const type_index_facade& lhs, const TypeInfo& rhs) noexcept;
+
+/// noexcept comparison operators for type_index_facade's TypeInfo and type_index_facade classes.
+bool operator ==, !=, <, ... (const TypeInfo& lhs, const type_index_facade& rhs) noexcept;
+
+#endif
+
+#ifndef BOOST_NO_IOSTREAM
+#ifdef BOOST_NO_TEMPLATED_IOSTREAMS
+/// @cond
+/// Ostream operator that will output demangled name
+template <class Derived, class TypeInfo>
+inline std::ostream& operator<<(std::ostream& ostr, const type_index_facade<Derived, TypeInfo>& ind) {
+    ostr << static_cast<Derived const&>(ind).pretty_name();
+    return ostr;
+}
+/// @endcond
+#else
+/// Ostream operator that will output demangled name.
+template <class CharT, class TriatT, class Derived, class TypeInfo>
+inline std::basic_ostream<CharT, TriatT>& operator<<(
+    std::basic_ostream<CharT, TriatT>& ostr, 
+    const type_index_facade<Derived, TypeInfo>& ind) 
+{
+    ostr << static_cast<Derived const&>(ind).pretty_name();
+    return ostr;
+}
+#endif // BOOST_NO_TEMPLATED_IOSTREAMS
+#endif // BOOST_NO_IOSTREAM
+
+/// This free function is used by Boost's unordered containers.
+/// \note <boost/functional/hash.hpp> has to be included if this function is used.
+template <class Derived, class TypeInfo>
+inline std::size_t hash_value(const type_index_facade<Derived, TypeInfo>& lhs) BOOST_NOEXCEPT {
+    return static_cast<Derived const&>(lhs).hash_code();
+}
+
+}} // namespace boost::typeindex
+
+#endif // BOOST_TYPE_INDEX_TYPE_INDEX_FACADE_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_traits/is_copy_assignable.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,147 @@
+//  (C) Copyright Ion Gaztanaga 2014.
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
+#define BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/noncopyable.hpp>
+
+#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_CXX11_DECLTYPE) \
+   && !defined(BOOST_INTEL_CXX_VERSION) && \
+      !(defined(BOOST_MSVC) && _MSC_VER == 1800)
+#define BOOST_TT_CXX11_IS_COPY_ASSIGNABLE
+#include <boost/utility/declval.hpp>
+#else
+   //For compilers without decltype
+   #include <boost/type_traits/is_const.hpp>
+   #include <boost/type_traits/is_array.hpp>
+   #include <boost/type_traits/add_reference.hpp>
+   #include <boost/type_traits/remove_reference.hpp>
+#endif
+
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail{
+
+template <bool DerivedFromNoncopyable, class T>
+struct is_copy_assignable_impl2 {
+
+// Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+//
+// error: function *function_name* cannot be referenced -- it is a deleted function
+// static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+//                                                        ^ 
+//
+// MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+// https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+#if defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE)
+    typedef boost::type_traits::yes_type yes_type;
+    typedef boost::type_traits::no_type  no_type;
+
+    template <class U>
+    static decltype(::boost::declval<U&>() = ::boost::declval<const U&>(), yes_type() ) test(int);
+
+    template <class>
+    static no_type test(...);
+
+    static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
+
+#else
+    static BOOST_DEDUCED_TYPENAME boost::add_reference<T>::type produce();
+
+    template <class T1>
+    static boost::type_traits::no_type test(T1&, typename T1::boost_move_no_copy_constructor_or_assign* = 0);
+
+    static boost::type_traits::yes_type test(...);
+    // If you see errors like this:
+    //
+    //      `'T::operator=(const T&)' is private`
+    //      `boost/type_traits/is_copy_assignable.hpp:NN:M: error: within this context`
+    //
+    // then you are trying to call that macro for a structure defined like that:
+    //
+    //      struct T {
+    //          ...
+    //      private:
+    //          T & operator=(const T &);
+    //          ...
+    //      };
+    //
+    // To fix that you must modify your structure:
+    //
+    //      // C++03 and C++11 version
+    //      struct T: private boost::noncopyable {
+    //          ...
+    //      private:
+    //          T & operator=(const T &);
+    //          ...
+    //      };
+    //
+    //      // C++11 version
+    //      struct T {
+    //          ...
+    //      private:
+    //          T& operator=(const T &) = delete;
+    //          ...
+    //      };
+    BOOST_STATIC_CONSTANT(bool, value = (
+            sizeof(test(produce())) == sizeof(boost::type_traits::yes_type)
+    ));
+   #endif
+};
+
+template <class T>
+struct is_copy_assignable_impl2<true, T> {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template <class T>
+struct is_copy_assignable_impl {
+
+#if !defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE)
+    //For compilers without decltype, at least return false on const types, arrays
+    //types derived from boost::noncopyable and types defined as BOOST_MOVEABLE_BUT_NOT_COPYABLE
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type unreferenced_t;
+    BOOST_STATIC_CONSTANT(bool, value = (
+        boost::detail::is_copy_assignable_impl2<
+            boost::is_base_and_derived<boost::noncopyable, T>::value
+            || boost::is_const<unreferenced_t>::value || boost::is_array<unreferenced_t>::value
+            ,T
+        >::value
+    ));
+    #else
+    BOOST_STATIC_CONSTANT(bool, value = (
+        boost::detail::is_copy_assignable_impl2<
+            boost::is_base_and_derived<boost::noncopyable, T>::value,T
+        >::value
+    ));
+    #endif
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_assignable,T,::boost::detail::is_copy_assignable_impl<T>::value)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void,false)
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const volatile,false)
+BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void volatile,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/type_traits/is_final.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+
+//  Copyright (c) 2014 Agustin Berge
+//
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+
+#ifndef BOOST_TT_IS_FINAL_HPP_INCLUDED
+#define BOOST_TT_IS_FINAL_HPP_INCLUDED
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+
+namespace detail {
+template <typename T> struct is_final_impl
+{
+#ifdef BOOST_IS_FINAL
+   typedef typename remove_cv<T>::type cvt;
+   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_FINAL(cvt));
+#else
+   BOOST_STATIC_CONSTANT(bool, value = false);
+#endif
+};
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_final,T,::boost::detail::is_final_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_FINAL_HPP_INCLUDED
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_all_extents.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_ALL_EXTENT_HOLT_2004_0827
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_ALL_EXTENT_HOLT_2004_0827
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    template<typename T>
-    struct remove_all_extents;
-
-    namespace detail {
-        template<bool IsArray>
-        struct remove_all_extents_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-        };
-        template<>
-        struct remove_all_extents_impl_typeof<true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U[]);
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type reduced_type;
-                typedef typename remove_all_extents<reduced_type>::type type;
-            };
-        };
-    } //namespace detail
-
-    template<typename T>
-    struct remove_all_extents {
-        typedef typename boost::detail::remove_all_extents_impl_typeof<
-            boost::is_array<T>::value                
-        >::template inner<T,remove_all_extents<T> >::type type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_all_extents,T)
-    };
-} //namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827
-
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_bounds.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsArray>
-        struct remove_bounds_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-        };
-        template<>
-        struct remove_bounds_impl_typeof<true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U[]);
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-        };
-    } //namespace detail
-
-    template<typename T>
-    struct remove_bounds {
-        typedef typename boost::detail::remove_bounds_impl_typeof<
-            boost::is_array<T>::value                
-        >::template inner<T,remove_bounds<T> >::type type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_bounds,T)
-    };
-} //namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827
-
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_const.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsPointer,bool IsArray,bool IsConst,bool IsVolatile>
-        struct remove_const_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-        template<> //Const
-        struct remove_const_impl_typeof<false,false,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U const&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //CV
-        struct remove_const_impl_typeof<false,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U volatile,ID> test(U const volatile&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //Const Pointer
-        struct remove_const_impl_typeof<true,false,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(void(*)(U const[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };
-        template<> //CV Pointer
-        struct remove_const_impl_typeof<true,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U volatile,ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };        
-        template<> //Const Array
-        struct remove_const_impl_typeof<false,true,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U[value],ID> test(void(*)(U const[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-        template<> //CV Array
-        struct remove_const_impl_typeof<false,true,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U volatile[value],ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-    } //namespace detail
-
-    template<typename T>
-    struct remove_const {
-        typedef boost::detail::remove_const_impl_typeof<
-            boost::is_pointer<T>::value,
-            boost::is_array<T>::value,
-            boost::is_const<T>::value,
-            boost::is_volatile<T>::value
-        > remove_const_type;
-        typedef typename 
-            remove_const_type::template inner<
-                typename remove_const_type::template transform_type<T>::type,
-                remove_const<T>
-            >::type
-        type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_const,T)
-    };
-}//namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_cv.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsPointer,bool IsArray,bool IsConst,bool IsVolatile>
-        struct remove_cv_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-        template<> //Volatile
-        struct remove_cv_impl_typeof<false,false,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U volatile&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //Const
-        struct remove_cv_impl_typeof<false,false,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U const&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //CV
-        struct remove_cv_impl_typeof<false,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U const volatile&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //Volatile Pointer
-        struct remove_cv_impl_typeof<true,false,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(void(*)(U volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };
-        template<> //Const Pointer
-        struct remove_cv_impl_typeof<true,false,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(void(*)(U const[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };
-        template<> //CV Pointer
-        struct remove_cv_impl_typeof<true,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };        
-        template<> //Volatile Array
-        struct remove_cv_impl_typeof<false,true,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U[value],ID> test(void(*)(U volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-        template<> //Const Array
-        struct remove_cv_impl_typeof<false,true,true,false> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U[value],ID> test(void(*)(U const[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-        template<> //CV Array
-        struct remove_cv_impl_typeof<false,true,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U[value],ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-    } //namespace detail
-
-    template<typename T>
-    struct remove_cv {
-        typedef boost::detail::remove_cv_impl_typeof<
-            boost::is_pointer<T>::value,
-            boost::is_array<T>::value,
-            boost::is_const<T>::value,
-            boost::is_volatile<T>::value
-        > remove_cv_type;
-        typedef typename 
-            remove_cv_type::template inner<
-                typename remove_cv_type::template transform_type<T>::type,
-                remove_cv<T>
-            >::type
-        type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_cv,T)
-    };
-}//namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_extent.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsArray>
-        struct remove_extent_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-        };
-        template<>
-        struct remove_extent_impl_typeof<true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U[]);
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-        };
-    } //namespace detail
-
-    template<typename T>
-    struct remove_extent {
-        typedef typename boost::detail::remove_extent_impl_typeof<
-            boost::is_array<T>::value                
-        >::template inner<T,remove_extent<T> >::type type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_extent,T)
-    };
-} //namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827
-
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_pointer.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-
-namespace boost {
-    namespace detail {
-        template<int IsPointer>
-        struct remove_pointer_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-        };
-        template<>
-        struct remove_pointer_impl_typeof<true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U*);
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-        };
-    } //namespace detail
-
-    template<typename T>
-    struct remove_pointer {
-        typedef typename boost::detail::remove_pointer_impl_typeof<
-            boost::is_pointer<T>::value
-        >::template inner<T,remove_pointer<T> >::type type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_pointer,T)
-    };
-} //namespace boost
-
-#endif //BOOST_TYPE_TRAITS_REMOVE_POINTER_HOLT_2004_0827
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_reference.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_reference.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsReference>
-        struct remove_reference_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-        };
-        template<>
-        struct remove_reference_impl_typeof<true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-        };
-    } //namespace detail
-    
-    template<typename T>
-    struct remove_reference {
-        typedef typename boost::detail::remove_reference_impl_typeof<
-            boost::is_reference<T>::value
-        >::template inner<T,remove_reference<T> >::type type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_reference,T)
-    };
-} //namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/remove_volatile.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828
-#define BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828
-
-#include <boost/type_traits/msvc/typeof.hpp>
-#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-namespace boost {
-    namespace detail {
-        template<bool IsPointer,bool IsArray,bool IsConst,bool IsVolatile>
-        struct remove_volatile_impl_typeof {
-            template<typename T,typename ID>
-            struct inner {
-                typedef T type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-        template<> //Volatile
-        struct remove_volatile_impl_typeof<false,false,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(U volatile&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };            
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //CV
-        struct remove_volatile_impl_typeof<false,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U const,ID> test(U const volatile&(*)());
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T& type;
-            };
-        };
-        template<> //Volatile Pointer
-        struct remove_volatile_impl_typeof<true,false,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U,ID> test(void(*)(U volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };
-        template<> //CV Pointer
-        struct remove_volatile_impl_typeof<true,false,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                template<typename U>
-                static msvc_register_type<U const,ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type[];
-            };
-        };        
-        template<> //Volatile Array
-        struct remove_volatile_impl_typeof<false,true,false,true> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U[value],ID> test(void(*)(U volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;                
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-        template<> //CV Array
-        struct remove_volatile_impl_typeof<false,true,true,true> {
-            template<typename T,typename ID>
-            struct inner {
-                BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0])));
-
-                template<typename U>
-                static msvc_register_type<U const[value],ID> test(void(*)(U const volatile[]));
-                static msvc_register_type<T,ID> test(...);
-                BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) ));
-                typedef typename msvc_extract_type<ID>::id2type::type type;
-            };
-            template<typename T>
-            struct transform_type {
-                typedef T type;
-            };
-        };
-
-    } //namespace detail
-
-    template<typename T>
-    struct remove_volatile {
-        typedef boost::detail::remove_volatile_impl_typeof<
-            boost::is_pointer<T>::value,
-            boost::is_array<T>::value,
-            boost::is_const<T>::value,
-            boost::is_volatile<T>::value
-        > remove_volatile_type;
-        typedef typename 
-            remove_volatile_type::template inner<
-                typename remove_volatile_type::template transform_type<T>::type,
-                remove_volatile<T>
-            >::type
-        type;
-        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_volatile,T)
-    };
-}//namespace boost
-
-#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828
--- a/DEPENDENCIES/generic/include/boost/type_traits/msvc/typeof.hpp	Mon Sep 07 11:12:49 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-// Copyright (C) 2004 Peder Holt
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_TYPETRAITS_MSVC_TYPEOF_HPP
-#define BOOST_TYPETRAITS_MSVC_TYPEOF_HPP
-
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-namespace boost { namespace detail {
-# if BOOST_WORKAROUND(BOOST_MSVC,==1300)
-        template<typename ID>
-        struct msvc_extract_type
-        {
-            template<bool>
-            struct id2type_impl;
-
-            typedef id2type_impl<true> id2type;
-        };
-
-        template<typename T, typename ID>
-        struct msvc_register_type : public msvc_extract_type<ID>
-        {
-            template<>
-            struct id2type_impl<true>  //VC7.0 specific bugfeature
-            {
-                typedef T type;
-            };
-        };
-# else 
-        template<typename ID>
-        struct msvc_extract_type
-        {
-            struct id2type;
-        };
-
-        template<typename T, typename ID>
-        struct msvc_register_type : public msvc_extract_type<ID>
-        {
-            typedef msvc_extract_type<ID> base_type;
-            struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature
-            {
-                typedef T type;
-            };
-        };
-# endif
-}}
-
-#endif //BOOST_TYPETRAITS_MSVC_TYPEOF_IMPL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/base_units/information/bit.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,41 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_BASE_UNITS_INFORMATION_BIT_HPP_INCLUDED
+#define BOOST_UNITS_BASE_UNITS_INFORMATION_BIT_HPP_INCLUDED
+
+#include <string>
+
+#include <boost/units/config.hpp>
+#include <boost/units/base_unit.hpp>
+#include <boost/units/physical_dimensions/information.hpp>
+
+namespace boost {
+namespace units {
+namespace information {
+
+struct bit_base_unit : public base_unit<bit_base_unit, information_dimension, -700>
+{
+    static std::string name()   { return("bit"); }
+    static std::string symbol() { return("b"); }
+};
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#if BOOST_UNITS_HAS_BOOST_TYPEOF
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TYPE(boost::units::information::bit_base_unit)
+
+#endif
+
+#endif // BOOST_UNITS_BASE_UNITS_INFORMATION_BIT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/base_units/information/byte.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,36 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_BASE_UNITS_INFORMATION_BYTE_HPP_INCLUDED
+#define BOOST_UNITS_BASE_UNITS_INFORMATION_BYTE_HPP_INCLUDED
+
+#include <boost/units/scaled_base_unit.hpp>
+#include <boost/units/static_rational.hpp>
+#include <boost/units/scale.hpp>
+#include <boost/units/units_fwd.hpp>
+#include <boost/units/base_units/information/bit.hpp>
+
+namespace boost {
+namespace units {
+namespace information {
+
+typedef scaled_base_unit<boost::units::information::bit_base_unit, scale<2, static_rational<3> > > byte_base_unit;
+
+} // namespace information
+
+template<>
+struct base_unit_info<information::byte_base_unit> {
+    static const char* name()   { return("byte"); }
+    static const char* symbol() { return("B"); }
+};
+
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_BASE_UNITS_INFORMATION_BYTE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/base_units/information/hartley.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_BASE_UNITS_INFORMATION_HARTLEY_HPP_INCLUDED
+#define BOOST_UNITS_BASE_UNITS_INFORMATION_HARTLEY_HPP_INCLUDED
+
+#include <boost/units/conversion.hpp>
+#include <boost/units/base_units/information/bit.hpp>
+
+BOOST_UNITS_DEFINE_BASE_UNIT_WITH_CONVERSIONS(information, hartley,
+                                              "hartley", "Hart",
+                                              3.321928094887363,
+                                              boost::units::information::bit_base_unit, 
+                                              -703);
+
+#if BOOST_UNITS_HAS_BOOST_TYPEOF
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TYPE(boost::units::information::hartley_base_unit)
+
+#endif
+
+#endif // BOOST_UNITS_BASE_UNITS_INFORMATION_HARTLEY_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/base_units/information/nat.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,30 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_BASE_UNITS_INFORMATION_NAT_HPP_INCLUDED
+#define BOOST_UNITS_BASE_UNITS_INFORMATION_NAT_HPP_INCLUDED
+
+#include <boost/units/conversion.hpp>
+#include <boost/units/base_units/information/bit.hpp>
+
+BOOST_UNITS_DEFINE_BASE_UNIT_WITH_CONVERSIONS(information, nat,
+                                              "nat", "nat",
+                                              1.442695040888964,
+                                              boost::units::information::bit_base_unit, 
+                                              -702);
+
+#if BOOST_UNITS_HAS_BOOST_TYPEOF
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TYPE(boost::units::information::nat_base_unit)
+
+#endif
+
+#endif // BOOST_UNITS_BASE_UNITS_INFORMATION_NAT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/base_units/information/shannon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,36 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_BASE_UNITS_INFORMATION_SHANNON_HPP_INCLUDED
+#define BOOST_UNITS_BASE_UNITS_INFORMATION_SHANNON_HPP_INCLUDED
+
+#include <boost/units/scaled_base_unit.hpp>
+#include <boost/units/static_rational.hpp>
+#include <boost/units/scale.hpp>
+#include <boost/units/units_fwd.hpp>
+#include <boost/units/base_units/information/bit.hpp>
+
+namespace boost {
+namespace units {
+namespace information {
+
+typedef scaled_base_unit<boost::units::information::bit_base_unit, scale<1, static_rational<1> > > shannon_base_unit;
+
+} // namespace information
+
+template<>
+struct base_unit_info<information::shannon_base_unit> {
+    static const char* name()   { return("shannon"); }
+    static const char* symbol() { return("Sh"); }
+};
+
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_BASE_UNITS_INFORMATION_SHANNON_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/physical_dimensions/information.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,44 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_INFORMATION_BASE_DIMENSION_HPP
+#define BOOST_UNITS_INFORMATION_BASE_DIMENSION_HPP
+
+#include <boost/units/config.hpp>
+#include <boost/units/base_dimension.hpp>
+
+namespace boost {
+namespace units { 
+
+/// base dimension of information
+struct information_base_dimension : 
+    boost::units::base_dimension<information_base_dimension, -700>
+{ };
+
+} // namespace units
+} // namespace boost
+
+#if BOOST_UNITS_HAS_BOOST_TYPEOF
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TYPE(boost::units::information_base_dimension)
+
+#endif
+
+namespace boost {
+namespace units {
+
+/// dimension of information
+typedef information_base_dimension::dimension_type information_dimension;
+
+} // namespace units
+} // namespace boost
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,20 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_INFORMATION_HPP
+#define BOOST_UNITS_INFORMATION_HPP
+
+#include <boost/units/systems/information/byte.hpp>
+#include <boost/units/systems/information/bit.hpp>
+#include <boost/units/systems/information/nat.hpp>
+#include <boost/units/systems/information/hartley.hpp>
+#include <boost/units/systems/information/shannon.hpp>
+#include <boost/units/systems/information/prefixes.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/bit.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_BIT_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_BIT_HPP_INCLUDED
+
+#include <boost/units/systems/information/byte.hpp>
+#include <boost/units/base_units/information/bit.hpp>
+
+namespace boost {
+namespace units { 
+namespace information {
+
+namespace hu {
+namespace bit {
+typedef unit<information_dimension, make_system<bit_base_unit>::type> info;
+} // namespace bit
+} // namespace hu
+
+BOOST_UNITS_STATIC_CONSTANT(bit, hu::bit::info);
+BOOST_UNITS_STATIC_CONSTANT(bits, hu::bit::info);
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_BIT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/byte.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_BYTE_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_BYTE_HPP_INCLUDED
+
+#include <boost/units/make_system.hpp>
+#include <boost/units/unit.hpp>
+#include <boost/units/static_constant.hpp>
+
+#include <boost/units/base_units/information/byte.hpp>
+
+namespace boost {
+namespace units { 
+namespace information {
+
+typedef make_system<byte_base_unit>::type system;
+
+typedef unit<dimensionless_type, system> dimensionless;
+
+namespace hu {
+namespace byte {
+typedef unit<information_dimension, system> info;
+} // namespace bit
+} // namespace hu
+
+BOOST_UNITS_STATIC_CONSTANT(byte, hu::byte::info);
+BOOST_UNITS_STATIC_CONSTANT(bytes, hu::byte::info);
+
+// I'm going to define boost::units::information::info (the "default")
+// to be hu::byte::info -- other variants such as hu::bit::info, hu::nat::info, etc
+// must be explicitly referred to
+typedef hu::byte::info info;
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_BYTE_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/hartley.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_HARTLEY_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_HARTLEY_HPP_INCLUDED
+
+#include <boost/units/systems/information/byte.hpp>
+#include <boost/units/base_units/information/hartley.hpp>
+
+namespace boost {
+namespace units { 
+namespace information {
+
+namespace hu {
+namespace hartley {
+typedef unit<information_dimension, make_system<hartley_base_unit>::type> info;
+} // namespace bit
+} // namespace hu
+
+BOOST_UNITS_STATIC_CONSTANT(hartley, hu::hartley::info);
+BOOST_UNITS_STATIC_CONSTANT(hartleys, hu::hartley::info);
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_HARTLEY_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/nat.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_NAT_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_NAT_HPP_INCLUDED
+
+#include <boost/units/systems/information/byte.hpp>
+#include <boost/units/base_units/information/nat.hpp>
+
+namespace boost {
+namespace units { 
+namespace information {
+
+namespace hu {
+namespace nat {
+typedef unit<information_dimension, make_system<nat_base_unit>::type> info;
+} // namespace bit
+} // namespace hu
+
+BOOST_UNITS_STATIC_CONSTANT(nat, hu::nat::info);
+BOOST_UNITS_STATIC_CONSTANT(nats, hu::nat::info);
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_NAT_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/prefixes.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,45 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_PREFIXES_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_PREFIXES_HPP_INCLUDED
+
+#include <boost/units/make_scaled_unit.hpp>
+#include <boost/units/static_rational.hpp>
+#include <boost/units/scale.hpp>
+
+#include <boost/units/systems/information/byte.hpp>
+
+#define BOOST_UNITS_INFOSYS_PREFIX(exponent, name) \
+    typedef make_scaled_unit<dimensionless, scale<2, static_rational<exponent> > >::type name ## _pf_type; \
+    BOOST_UNITS_STATIC_CONSTANT(name, name ## _pf_type)
+
+namespace boost {
+namespace units {
+namespace information {
+
+// Note, these are defined (somewhat arbitrarily) against the 'byte' system.
+// They work smoothly with bit_information, nat_information, etc, so it is
+// transparent to the user.
+BOOST_UNITS_INFOSYS_PREFIX(10, kibi);
+BOOST_UNITS_INFOSYS_PREFIX(20, mebi);
+BOOST_UNITS_INFOSYS_PREFIX(30, gibi);
+BOOST_UNITS_INFOSYS_PREFIX(40, tebi);
+BOOST_UNITS_INFOSYS_PREFIX(50, pebi);
+BOOST_UNITS_INFOSYS_PREFIX(60, exbi);
+BOOST_UNITS_INFOSYS_PREFIX(70, zebi);
+BOOST_UNITS_INFOSYS_PREFIX(80, yobi);
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#undef BOOST_UNITS_INFOSYS_PREFIX
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_PREFIXES_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/units/systems/information/shannon.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,33 @@
+// Boost.Units - A C++ library for zero-overhead dimensional analysis and 
+// unit/quantity manipulation and conversion
+//
+// Copyright (C) 2014 Erik Erlandson
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_UNITS_SYSTEMS_INFORMATION_SHANNON_HPP_INCLUDED
+#define BOOST_UNITS_SYSTEMS_INFORMATION_SHANNON_HPP_INCLUDED
+
+#include <boost/units/systems/information/byte.hpp>
+#include <boost/units/base_units/information/shannon.hpp>
+
+namespace boost {
+namespace units { 
+namespace information {
+
+namespace hu {
+namespace shannon {
+typedef unit<information_dimension, make_system<shannon_base_unit>::type> info;
+} // namespace bit
+} // namespace hu
+
+BOOST_UNITS_STATIC_CONSTANT(shannon, hu::shannon::info);
+BOOST_UNITS_STATIC_CONSTANT(shannons, hu::shannon::info);
+
+} // namespace information
+} // namespace units
+} // namespace boost
+
+#endif // BOOST_UNITS_SYSTEMS_INFORMATION_SHANNON_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/uuid/detail/config.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,62 @@
+/*
+ *            Copyright Andrey Semashev 2013.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   uuid/detail/config.hpp
+ *
+ * \brief  This header defines configuration macros for Boost.UUID.
+ */
+
+#ifndef BOOST_UUID_DETAIL_CONFIG_HPP_INCLUDED_
+#define BOOST_UUID_DETAIL_CONFIG_HPP_INCLUDED_
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined(BOOST_UUID_NO_SIMD)
+
+#if defined(__GNUC__) && defined(__SSE2__)
+
+// GCC and its pretenders go here
+#ifndef BOOST_UUID_USE_SSE2
+#define BOOST_UUID_USE_SSE2
+#endif
+
+#if defined(__SSE3__) && !defined(BOOST_UUID_USE_SSE3)
+#define BOOST_UUID_USE_SSE3
+#endif
+
+#if defined(__SSE4_1__) && !defined(BOOST_UUID_USE_SSE41)
+#define BOOST_UUID_USE_SSE41
+#endif
+
+#elif defined(_MSC_VER) && (defined(_M_X64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
+
+#ifndef BOOST_UUID_USE_SSE2
+#define BOOST_UUID_USE_SSE2
+#endif
+
+#elif !defined(BOOST_UUID_USE_SSE41) && !defined(BOOST_UUID_USE_SSE3) && !defined(BOOST_UUID_USE_SSE2)
+
+#define BOOST_UUID_NO_SIMD
+
+#endif
+
+// More advanced ISA extensions imply less advanced are also available
+#if !defined(BOOST_UUID_USE_SSE3) && defined(BOOST_UUID_USE_SSE41)
+#define BOOST_UUID_USE_SSE3
+#endif
+
+#if !defined(BOOST_UUID_USE_SSE2) && defined(BOOST_UUID_USE_SSE3)
+#define BOOST_UUID_USE_SSE2
+#endif
+
+#endif // !defined(BOOST_UUID_NO_SIMD)
+
+#endif // BOOST_UUID_DETAIL_CONFIG_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/uuid/detail/uuid_generic.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,51 @@
+/*
+ *             Copyright Andy Tompkins 2006.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   uuid/detail/uuid_generic.hpp
+ *
+ * \brief  This header contains generic implementation of \c boost::uuid operations.
+ */
+
+#ifndef BOOST_UUID_DETAIL_UUID_GENERIC_HPP_INCLUDED_
+#define BOOST_UUID_DETAIL_UUID_GENERIC_HPP_INCLUDED_
+
+#include <string.h>
+
+namespace boost {
+namespace uuids {
+
+inline bool uuid::is_nil() const BOOST_NOEXCEPT
+{
+    for (std::size_t i = 0; i < sizeof(data); ++i)
+    {
+        if (data[i] != 0U)
+            return false;
+    }
+    return true;
+}
+
+inline void uuid::swap(uuid& rhs) BOOST_NOEXCEPT
+{
+    uuid tmp = *this;
+    *this = rhs;
+    rhs = tmp;
+}
+
+inline bool operator== (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
+{
+    return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) == 0;
+}
+
+inline bool operator< (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
+{
+    return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) < 0;
+}
+
+} // namespace uuids
+} // namespace boost
+
+#endif // BOOST_UUID_DETAIL_UUID_GENERIC_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/uuid/detail/uuid_x86.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,109 @@
+/*
+ *            Copyright Andrey Semashev 2013.
+ * Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *          http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file   uuid/detail/uuid_x86.hpp
+ *
+ * \brief  This header contains optimized SSE implementation of \c boost::uuid operations.
+ */
+
+#ifndef BOOST_UUID_DETAIL_UUID_X86_HPP_INCLUDED_
+#define BOOST_UUID_DETAIL_UUID_X86_HPP_INCLUDED_
+
+// MSVC does not always have immintrin.h (at least, not up to MSVC 10), so include the appropriate header for each instruction set
+#if defined(BOOST_UUID_USE_SSE41)
+#include <smmintrin.h>
+#elif defined(BOOST_UUID_USE_SSE3)
+#include <pmmintrin.h>
+#else
+#include <emmintrin.h>
+#endif
+
+namespace boost {
+namespace uuids {
+namespace detail {
+
+BOOST_FORCEINLINE __m128i load_unaligned_si128(const uint8_t* p) BOOST_NOEXCEPT
+{
+#if defined(BOOST_UUID_USE_SSE3)
+    return _mm_lddqu_si128(reinterpret_cast< const __m128i* >(p));
+#else
+    return _mm_loadu_si128(reinterpret_cast< const __m128i* >(p));
+#endif
+}
+
+} // namespace detail
+
+inline bool uuid::is_nil() const BOOST_NOEXCEPT
+{
+    register __m128i mm = uuids::detail::load_unaligned_si128(data);
+#if defined(BOOST_UUID_USE_SSE41)
+    return _mm_test_all_zeros(mm, mm) != 0;
+#else
+    mm = _mm_cmpeq_epi8(mm, _mm_setzero_si128());
+    return _mm_movemask_epi8(mm) == 0xFFFF;
+#endif
+}
+
+inline void uuid::swap(uuid& rhs) BOOST_NOEXCEPT
+{
+    register __m128i mm_this = uuids::detail::load_unaligned_si128(data);
+    register __m128i mm_rhs = uuids::detail::load_unaligned_si128(rhs.data);
+    _mm_storeu_si128(reinterpret_cast< __m128i* >(rhs.data), mm_this);
+    _mm_storeu_si128(reinterpret_cast< __m128i* >(data), mm_rhs);
+}
+
+inline bool operator== (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
+{
+    register __m128i mm_left = uuids::detail::load_unaligned_si128(lhs.data);
+    register __m128i mm_right = uuids::detail::load_unaligned_si128(rhs.data);
+
+    register __m128i mm_cmp = _mm_cmpeq_epi32(mm_left, mm_right);
+#if defined(BOOST_UUID_USE_SSE41)
+    return _mm_test_all_ones(mm_cmp);
+#else
+    return _mm_movemask_epi8(mm_cmp) == 0xFFFF;
+#endif
+}
+
+inline bool operator< (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
+{
+    register __m128i mm_left = uuids::detail::load_unaligned_si128(lhs.data);
+    register __m128i mm_right = uuids::detail::load_unaligned_si128(rhs.data);
+
+    // To emulate lexicographical_compare behavior we have to perform two comparisons - the forward and reverse one.
+    // Then we know which bytes are equivalent and which ones are different, and for those different the comparison results
+    // will be opposite. Then we'll be able to find the first differing comparison result (for both forward and reverse ways),
+    // and depending on which way it is for, this will be the result of the operation. There are a few notes to consider:
+    //
+    // 1. Due to little endian byte order the first bytes go into the lower part of the xmm registers,
+    //    so the comparison results in the least significant bits will actually be the most signigicant for the final operation result.
+    //    This means we have to determine which of the comparison results have the least significant bit on, and this is achieved with
+    //    the "(x - 1) ^ x" trick.
+    // 2. Because there is only signed comparison in SSE/AVX, we have to invert byte comparison results whenever signs of the corresponding
+    //    bytes are different. I.e. in signed comparison it's -1 < 1, but in unsigned it is the opposite (255 > 1). To do that we XOR left and right,
+    //    making the most significant bit of each byte 1 if the signs are different, and later apply this mask with another XOR to the comparison results.
+    // 3. pcmpgtw compares for "greater" relation, so we swap the arguments to get what we need.
+
+    const __m128i mm_signs_mask = _mm_xor_si128(mm_left, mm_right);
+
+    __m128i mm_cmp = _mm_cmpgt_epi8(mm_right, mm_left), mm_rcmp = _mm_cmpgt_epi8(mm_left, mm_right);
+
+    mm_cmp = _mm_xor_si128(mm_signs_mask, mm_cmp);
+    mm_rcmp = _mm_xor_si128(mm_signs_mask, mm_rcmp);
+
+    uint32_t cmp = static_cast< uint32_t >(_mm_movemask_epi8(mm_cmp)), rcmp = static_cast< uint32_t >(_mm_movemask_epi8(mm_rcmp));
+
+    cmp = (cmp - 1u) ^ cmp;
+    rcmp = (rcmp - 1u) ^ rcmp;
+
+    return static_cast< uint16_t >(cmp) < static_cast< uint16_t >(rcmp);
+}
+
+} // namespace uuids
+} // namespace boost
+
+#endif // BOOST_UUID_DETAIL_UUID_X86_HPP_INCLUDED_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/detail/element_index.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,61 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/element_index.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2014-2015 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
+#define BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
+
+#include "boost/config.hpp"
+#include "boost/variant/recursive_wrapper_fwd.hpp"
+#include "boost/variant/variant_fwd.hpp"
+
+#include "boost/mpl/find_if.hpp"
+
+namespace boost { namespace detail { namespace variant {
+
+template <class VariantElement, class T>
+struct variant_element_functor :
+    boost::mpl::or_<
+        boost::is_same<VariantElement, T>,
+        boost::is_same<VariantElement, boost::recursive_wrapper<T> >,
+        boost::is_same<VariantElement, T& >
+    >
+{};
+
+template <class Types, class T>
+struct element_iterator_impl :
+    boost::mpl::find_if<
+        Types,
+        boost::mpl::or_<
+            variant_element_functor<boost::mpl::_1, T>,
+            variant_element_functor<boost::mpl::_1, typename boost::remove_cv<T>::type >
+        >
+    >
+{};
+
+template <class Variant, class T>
+struct element_iterator :
+    element_iterator_impl< typename Variant::types, T>
+{};
+
+template <class Variant, class T>
+struct holds_element :
+    boost::mpl::not_<
+        boost::is_same<
+            typename boost::mpl::end<typename Variant::types>::type,
+            typename element_iterator<Variant, T>::type
+        >
+    >
+{};
+
+
+}}} // namespace boost::detail::variant
+
+#endif // BOOST_VARIANT_DETAIL_ELEMENT_INDEX_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/detail/has_result_type.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,36 @@
+//-----------------------------------------------------------------------------
+// boost variant/detail/has_result_type.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2014 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+#define BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+
+#include "boost/config.hpp"
+
+
+namespace boost { namespace detail { namespace variant {
+
+template <typename T >
+struct has_result_type {
+private:
+    typedef char                      yes;
+    typedef struct { char array[2]; } no;
+
+    template<typename C> static yes test(typename C::result_type*);
+    template<typename C> static no  test(...);
+
+public:
+    BOOST_STATIC_CONSTANT(bool, value = sizeof(test<T>(0)) == sizeof(yes));
+};
+
+}}} // namespace boost::detail::variant
+
+#endif // BOOST_VARIANT_DETAIL_HAS_RESULT_TYPE_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_cpp11_based.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,183 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via variadic templates and std::tuple
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant/detail/apply_visitor_unary.hpp>
+#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
+
+#if defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_HDR_TUPLE)
+#   error "This file requires <tuple> and variadic templates support"
+#endif
+
+#include <tuple>
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    // Implementing some of the C++14 features in C++11
+    template <std::size_t... I> class index_sequence {};
+
+    template <std::size_t N, std::size_t... I> 
+    struct make_index_sequence 
+        : make_index_sequence<N-1, N-1, I...> 
+    {};
+    template <std::size_t... I> 
+    struct make_index_sequence<0, I...> 
+        : index_sequence<I...> 
+    {};
+
+    template <class... Types>
+    std::tuple<Types&...> forward_as_tuple_simple(Types&... args) BOOST_NOEXCEPT
+    {
+        return std::tuple<Types&...>(args...);
+    }
+
+    // Implementing some of the helper tuple methods
+    template <std::size_t... I, typename Tuple>
+    std::tuple<typename std::tuple_element<I + 1, Tuple>::type...> 
+        tuple_tail_impl(const Tuple& tpl, index_sequence<I...>)
+    {
+        return std::tuple<
+            typename std::tuple_element<I + 1, Tuple>::type...
+        > (std::get<I + 1>(tpl)...);
+    }
+
+    template <typename Head, typename... Tail>
+    std::tuple<Tail...> tuple_tail(const std::tuple<Head, Tail...>& tpl)
+    {
+        return tuple_tail_impl(tpl, make_index_sequence<sizeof...(Tail)>());
+    }
+
+
+
+    // Forward declaration
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer;
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    inline one_by_one_visitor_and_value_referer<Visitor, Visitables, Values... >
+        make_one_by_one_visitor_and_value_referer(
+            Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+        )
+    {
+        return one_by_one_visitor_and_value_referer<Visitor, Visitables, Values... > (
+            visitor, visitables, values
+        );
+    }
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+        Visitables                      visitables_;
+
+    public: // structors
+        one_by_one_visitor_and_value_referer(
+                    Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+            , visitables_(visitables)
+        {}
+
+    public: // visitor interfaces
+        typedef typename Visitor::result_type result_type;
+
+        template <typename Value>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(Value& value) const
+        {
+            return ::boost::apply_visitor(
+                make_one_by_one_visitor_and_value_referer(
+                    visitor_,
+                    tuple_tail(visitables_),
+                    std::tuple_cat(values_, std::tuple<Value&>(value))
+                )
+                , std::get<0>(visitables_) // getting Head element
+            );
+        }
+
+    private:
+        one_by_one_visitor_and_value_referer& operator=(const one_by_one_visitor_and_value_referer&);
+    };
+
+    template <typename Visitor, typename... Values>
+    class one_by_one_visitor_and_value_referer<Visitor, std::tuple<>, Values...>
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+
+    public:
+        one_by_one_visitor_and_value_referer(
+                    Visitor& visitor, std::tuple<> /*visitables*/, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+        {}
+
+        typedef typename Visitor::result_type result_type;
+
+        template <class Tuple, std::size_t... I>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) do_call(Tuple t, index_sequence<I...>) const {
+            return visitor_(std::get<I>(t)...);
+        }
+
+        template <typename Value>
+        BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(Value& value) const
+        {
+            return do_call(
+                std::tuple_cat(values_, std::tuple<Value&>(value)),
+                make_index_sequence<sizeof...(Values) + 1>()
+            );
+        }
+    };
+
+}} // namespace detail::variant
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+        apply_visitor(const Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+    
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type)
+        apply_visitor(Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP11_BASED_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_cpp14_based.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,142 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via variadic templates, std::tuple
+//  and decltype(auto)
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant/detail/multivisitors_cpp14_based.hpp>
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    // Forward declaration
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14;
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    inline one_by_one_visitor_and_value_referer_cpp14<Visitor, Visitables, Values... >
+        make_one_by_one_visitor_and_value_referer_cpp14(
+            Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+        )
+    {
+        return one_by_one_visitor_and_value_referer_cpp14<Visitor, Visitables, Values... > (
+            visitor, visitables, values
+        );
+    }
+
+    template <typename Visitor, typename Visitables, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+        Visitables                      visitables_;
+
+    public: // structors
+        one_by_one_visitor_and_value_referer_cpp14(
+                    Visitor& visitor, Visitables visitables, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+            , visitables_(visitables)
+        {}
+
+    public: // visitor interfaces
+        template <typename Value>
+        decltype(auto) operator()(Value& value) const
+        {
+            return ::boost::apply_visitor(
+                make_one_by_one_visitor_and_value_referer_cpp14(
+                    visitor_,
+                    tuple_tail(visitables_),
+                    std::tuple_cat(values_, std::tuple<Value&>(value))
+                )
+                , std::get<0>(visitables_) // getting Head element
+            );
+        }
+
+    private:
+        one_by_one_visitor_and_value_referer_cpp14& operator=(const one_by_one_visitor_and_value_referer_cpp14&);
+    };
+
+    template <typename Visitor, typename... Values>
+    class one_by_one_visitor_and_value_referer_cpp14<Visitor, std::tuple<>, Values...>
+    {
+        Visitor&                        visitor_;
+        std::tuple<Values&...>          values_;
+
+    public:
+        one_by_one_visitor_and_value_referer_cpp14(
+                    Visitor& visitor, std::tuple<> /*visitables*/, std::tuple<Values&...> values
+                ) BOOST_NOEXCEPT
+            : visitor_(visitor)
+            , values_(values)
+        {}
+
+        template <class Tuple, std::size_t... I>
+        decltype(auto) do_call(Tuple t, index_sequence<I...>) const {
+            return visitor_(std::get<I>(t)...);
+        }
+
+        template <typename Value>
+        decltype(auto) operator()(Value& value) const
+        {
+            return do_call(
+                std::tuple_cat(values_, std::tuple<Value&>(value)),
+                make_index_sequence<sizeof...(Values) + 1>()
+            );
+        }
+    };
+
+}} // namespace detail::variant
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline decltype(auto) apply_visitor(const Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn,
+        typename boost::disable_if<
+            boost::detail::variant::has_result_type<Visitor>
+        >::type* = 0)
+    {
+        return boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer_cpp14(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+    
+
+    template <class Visitor, class T1, class T2, class T3, class... TN>
+    inline decltype(auto) apply_visitor(Visitor& visitor, T1& v1, T2& v2, T3& v3, TN&... vn,
+        typename boost::disable_if<
+            boost::detail::variant::has_result_type<Visitor>
+        >::type* = 0)
+    {
+        return ::boost::apply_visitor(
+            ::boost::detail::variant::make_one_by_one_visitor_and_value_referer_cpp14(
+                visitor,
+                ::boost::detail::variant::forward_as_tuple_simple(v2, v3, vn...),
+                std::tuple<>()
+            ),
+            v1
+        );
+    }
+
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_CPP14_BASED_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/detail/multivisitors_preprocessor_based.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,143 @@
+//  Boost.Varaint
+//  Contains multivisitors that are implemented via preprocessor magic
+//
+//  See http://www.boost.org for most recent version, including documentation.
+//
+//  Copyright Antony Polukhin, 2013-2014.
+//
+//  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+#define BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/variant.hpp>
+#include <boost/bind.hpp>
+
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+
+#ifndef BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS
+#   define BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS 4
+#endif
+
+namespace boost { 
+
+namespace detail { namespace variant {
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    struct two_variables_holder {
+    private:
+        VisitorT&       visitor_;
+        Visitable1T&    visitable1_;
+        Visitable2T&    visitable2_;
+
+        // required to suppress warnings and ensure that we do not copy
+        // this visitor
+        two_variables_holder& operator=(const two_variables_holder&);
+
+    public:
+        typedef BOOST_DEDUCED_TYPENAME VisitorT::result_type result_type;
+
+        explicit two_variables_holder(VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2) BOOST_NOEXCEPT 
+            : visitor_(visitor)
+            , visitable1_(visitable1)
+            , visitable2_(visitable2)
+        {}
+
+#define BOOST_VARIANT_OPERATOR_BEG()                            \
+    return ::boost::apply_visitor(                              \
+    ::boost::bind<result_type>(boost::ref(visitor_), _1, _2     \
+    /**/
+
+#define BOOST_VARIANT_OPERATOR_END()                            \
+    ), visitable1_, visitable2_);                               \
+    /**/
+
+#define BOOST_VARANT_VISITORS_VARIABLES_PRINTER(z, n, data)     \
+    BOOST_PP_COMMA() boost::ref( BOOST_PP_CAT(vis, n) )         \
+    /**/
+
+#define BOOST_VARIANT_VISIT(z, n, data)                                                     \
+    template <BOOST_PP_ENUM_PARAMS(BOOST_PP_ADD(n, 1), class VisitableUnwrapped)>           \
+    BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) operator()(                          \
+        BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ADD(n, 1), VisitableUnwrapped, & vis)          \
+    ) const                                                                                 \
+    {                                                                                       \
+        BOOST_VARIANT_OPERATOR_BEG()                                                        \
+        BOOST_PP_REPEAT(BOOST_PP_ADD(n, 1), BOOST_VARANT_VISITORS_VARIABLES_PRINTER, ~)     \
+        BOOST_VARIANT_OPERATOR_END()                                                        \
+    }                                                                                       \
+    /**/
+
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, ~)
+#undef BOOST_VARIANT_OPERATOR_BEG
+#undef BOOST_VARIANT_OPERATOR_END
+#undef BOOST_VARANT_VISITORS_VARIABLES_PRINTER
+#undef BOOST_VARIANT_VISIT
+
+    };
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    inline two_variables_holder<VisitorT, Visitable1T, Visitable2T> make_two_variables_holder(
+            VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2
+        ) BOOST_NOEXCEPT
+    {
+        return two_variables_holder<VisitorT, Visitable1T, Visitable2T>(visitor, visitable1, visitable2);
+    }
+
+    template <class VisitorT, class Visitable1T, class Visitable2T>
+    inline two_variables_holder<const VisitorT, Visitable1T, Visitable2T> make_two_variables_holder(
+            const VisitorT& visitor, Visitable1T& visitable1, Visitable2T& visitable2
+        ) BOOST_NOEXCEPT
+    {
+        return two_variables_holder<const VisitorT, Visitable1T, Visitable2T>(visitor, visitable1, visitable2);
+    }
+
+}} // namespace detail::variant
+
+#define BOOST_VARIANT_APPLY_VISITOR_BEG()                                               \
+    return ::boost::apply_visitor(                                                      \
+            boost::detail::variant::make_two_variables_holder(visitor, var0 , var1),    \
+            var2                                                                        \
+    /**/
+
+#define BOOST_VARIANT_APPLY_VISITOR_END()                       \
+    );                                                          \
+    /**/
+
+#define BOOST_VARANT_VISITORS_VARIABLES_PRINTER(z, n, data)     \
+    BOOST_PP_COMMA() BOOST_PP_CAT(var, BOOST_PP_ADD(n, 3))      \
+    /**/
+
+#define BOOST_VARIANT_VISIT(z, n, data)                                                                 \
+    template <class Visitor BOOST_PP_COMMA() BOOST_PP_ENUM_PARAMS(BOOST_PP_ADD(n, 3), class T)>         \
+    inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(BOOST_DEDUCED_TYPENAME Visitor::result_type) apply_visitor( \
+        data BOOST_PP_COMMA() BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ADD(n, 3), T, & var)     \
+    )                                                                                                   \
+    {                                                                                                   \
+        BOOST_VARIANT_APPLY_VISITOR_BEG()                                                               \
+        BOOST_PP_REPEAT(n, BOOST_VARANT_VISITORS_VARIABLES_PRINTER, ~)                                  \
+        BOOST_VARIANT_APPLY_VISITOR_END()                                                               \
+    }                                                                                                   \
+    /**/
+
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, const Visitor& visitor)
+BOOST_PP_REPEAT( BOOST_PP_SUB(BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS, 2), BOOST_VARIANT_VISIT, Visitor& visitor)
+
+#undef BOOST_VARIANT_APPLY_VISITOR_BEG
+#undef BOOST_VARIANT_APPLY_VISITOR_END
+#undef BOOST_VARANT_VISITORS_VARIABLES_PRINTER
+#undef BOOST_VARIANT_VISIT
+    
+} // namespace boost
+
+#endif // BOOST_VARIANT_DETAIL_MULTIVISITORS_PREPROCESSOR_BASED_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/variant/polymorphic_get.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,344 @@
+//-----------------------------------------------------------------------------
+// boost variant/polymorphic_get.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2013-2015 Antony Polukhin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_VARIANT_POLYMORPHIC_GET_HPP
+#define BOOST_VARIANT_POLYMORPHIC_GET_HPP
+
+#include <exception>
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/static_assert.hpp"
+#include "boost/throw_exception.hpp"
+#include "boost/utility/addressof.hpp"
+#include "boost/variant/variant_fwd.hpp"
+#include "boost/variant/get.hpp"
+
+#include "boost/type_traits/add_reference.hpp"
+#include "boost/type_traits/add_pointer.hpp"
+#include "boost/type_traits/is_base_of.hpp"
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////
+// class bad_polymorphic_get
+//
+// The exception thrown in the event of a failed get of a value.
+//
+class BOOST_SYMBOL_VISIBLE bad_polymorphic_get
+    : public bad_get
+{
+public: // std::exception implementation
+
+    virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+    {
+        return "boost::bad_polymorphic_get: "
+               "failed value get using boost::polymorphic_get";
+    }
+
+};
+
+//////////////////////////////////////////////////////////////////////////
+// function template get<T>
+//
+// Retrieves content of given variant object if content is of type T.
+// Otherwise: pointer ver. returns 0; reference ver. throws bad_get.
+//
+
+namespace detail { namespace variant {
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic metafunctions to detect index of a value
+//
+
+template <class Types, class T>
+struct element_polymorphic_iterator_impl :
+    boost::mpl::find_if<
+        Types,
+        boost::mpl::or_<
+            variant_element_functor<boost::mpl::_1, T>,
+            variant_element_functor<boost::mpl::_1, typename boost::remove_cv<T>::type >,
+            boost::is_base_of<T, boost::mpl::_1>
+        >
+    >
+{};
+
+template <class Variant, class T>
+struct holds_element_polymorphic :
+    boost::mpl::not_<
+        boost::is_same<
+            typename boost::mpl::end<typename Variant::types>::type,
+            typename element_polymorphic_iterator_impl<typename Variant::types, T>::type
+        >
+    >
+{};
+
+// (detail) class template get_polymorphic_visitor
+//
+// Generic static visitor that: if the value is of the specified
+// type or of a type derived from specified, returns a pointer
+// to the value it visits; else a null pointer.
+//
+template <typename Base>
+struct get_polymorphic_visitor
+{
+private: // private typedefs
+    typedef get_polymorphic_visitor<Base>       this_type;
+    typedef typename add_pointer<Base>::type    pointer;
+    typedef typename add_reference<Base>::type  reference;
+
+    pointer get(reference operand, boost::true_type) const BOOST_NOEXCEPT
+    {
+        return boost::addressof(operand);
+    }
+
+    template <class T>
+    pointer get(T&, boost::false_type) const BOOST_NOEXCEPT
+    {
+        return static_cast<pointer>(0);
+    }
+
+public: // visitor interfaces
+    typedef pointer result_type;
+
+    template <typename U>
+    pointer operator()(U& operand) const BOOST_NOEXCEPT
+    {
+        typedef boost::integral_constant<
+            bool,
+            boost::mpl::or_<
+                boost::is_base_of<Base, U>,
+                boost::is_same<Base, U>,
+                boost::is_same<typename boost::remove_cv<Base>::type, U >
+            >::value
+        > tag_t;
+
+        return this_type::get(operand, tag_t());
+    }
+};
+
+}} // namespace detail::variant
+
+#ifndef BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE
+#   if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)
+#   else
+#       define BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(t)  \
+        , t* = 0
+#   endif
+#endif
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_relaxed_get
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_polymorphic_visitor<U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    if (!operand) return static_cast<U_ptr>(0);
+
+    detail::variant::get_polymorphic_visitor<const U> v;
+    return operand->apply_visitor(v);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_relaxed_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<U>::type U_ptr;
+    U_ptr result = polymorphic_relaxed_get<U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_polymorphic_get());
+    return *result;
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_relaxed_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    typedef typename add_pointer<const U>::type U_ptr;
+    U_ptr result = polymorphic_relaxed_get<const U>(&operand);
+
+    if (!result)
+        boost::throw_exception(bad_polymorphic_get());
+    return *result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_strict_get
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(boost::variant<T...>*) will always return NULL"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(const boost::variant<T...>*) will always return NULL"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_strict_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(boost::variant<T...>&) will always throw boost::bad_polymorphic_get exception"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_strict_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+    BOOST_STATIC_ASSERT_MSG(
+        (boost::detail::variant::holds_element_polymorphic<boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >, U >::value),
+        "boost::variant does not contain specified type U, "
+        "call to boost::polymorphic_get<U>(const boost::variant<T...>&) will always throw boost::bad_polymorphic_get exception"
+    );
+
+    return polymorphic_relaxed_get<U>(operand);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// polymorphic_get<U>(variant) methods
+//
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<U>::type
+polymorphic_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_pointer<const U>::type
+polymorphic_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    ) BOOST_NOEXCEPT
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<U>::type
+polymorphic_get(
+      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+
+template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
+inline
+    typename add_reference<const U>::type
+polymorphic_get(
+      const boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >& operand
+      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
+    )
+{
+#ifdef BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
+    return polymorphic_relaxed_get<U>(operand);
+#else
+    return polymorphic_strict_get<U>(operand);
+#endif
+}
+} // namespace boost
+
+#endif // BOOST_VARIANT_POLYMORPHIC_GET_HPP
--- a/METADATA/nondeterministic.txt	Mon Sep 07 11:12:49 2015 +0100
+++ b/METADATA/nondeterministic.txt	Mon Sep 07 11:13:41 2015 +0100
@@ -1,2 +1,1 @@
 qm-vamp-plugins:qm-segmenter
-silvet:silvet